Version 1.7.0-dev.3.0

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

git-svn-id: http://dart.googlecode.com/svn/trunk@40302 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/create_sdk.gyp b/create_sdk.gyp
index 26b86d9..17b3ce2 100644
--- a/create_sdk.gyp
+++ b/create_sdk.gyp
@@ -20,7 +20,14 @@
         {
           'action_name': 'create_sdk_py',
           'inputs': [
-            '<!@(["python", "tools/list_files.py", "\\.dart$", "sdk/lib"])',
+            # This is neccessary because we have all the pub test files inside
+            # the pub directory instead of in tests/pub. Xcode can only handle
+            # a certain amount of files in one list (also depending on the
+            # length of the path from where you run). This regexp excludes
+            # pub/test and pub_generated/test
+            '<!@(["python", "tools/list_files.py",'
+                '"^(?!.*pub/test)(?!.*pub_generated/test).*dart$",'
+                '"sdk/lib"])',
             '<!@(["python", "tools/list_files.py", "", '
                 '"sdk/lib/_internal/compiler/js_lib/preambles"])',
             '<!@(["python", "tools/list_files.py", "", "sdk/bin"])',
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 7fda8b0..d5a60b7 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -1800,7 +1800,7 @@
           An enumeration of the possible types of analysis errors.
         </p>
         
-      <dl><dt class="value">COMPILE_TIME_ERROR</dt><dt class="value">HINT</dt><dt class="value">STATIC_TYPE_WARNING</dt><dt class="value">STATIC_WARNING</dt><dt class="value">SYNTACTIC_ERROR</dt><dt class="value">TODO</dt></dl></dd><dt class="typeDefinition"><a name="type_AnalysisOptions">AnalysisOptions: object</a></dt><dd>
+      <dl><dt class="value">ANGULAR</dt><dt class="value">COMPILE_TIME_ERROR</dt><dt class="value">HINT</dt><dt class="value">POLYMER</dt><dt class="value">STATIC_TYPE_WARNING</dt><dt class="value">STATIC_WARNING</dt><dt class="value">SYNTACTIC_ERROR</dt><dt class="value">TODO</dt></dl></dd><dt class="typeDefinition"><a name="type_AnalysisOptions">AnalysisOptions: object</a></dt><dd>
         <p>
           A set of options controlling what kind of analysis is to be
           performed. If the value of a field is omitted the value of the
@@ -2020,7 +2020,7 @@
           in a completion suggestion.
         </p>
         
-      <dl><dt class="value">ARGUMENT_LIST</dt><dt class="value">CLASS</dt><dt class="value">CLASS_ALIAS</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">IMPORT</dt><dt class="value">KEYWORD</dt><dt class="value">LIBRARY_PREFIX</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">METHOD_NAME</dt><dt class="value">NAMED_ARGUMENT</dt><dt class="value">OPTIONAL_ARGUMENT</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_Element">Element: object</a></dt><dd>
+      <dl><dt class="value">ARGUMENT_LIST</dt><dt class="value">CLASS</dt><dt class="value">CLASS_ALIAS</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">IMPORT</dt><dt class="value">KEYWORD</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY_PREFIX</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">METHOD_NAME</dt><dt class="value">NAMED_ARGUMENT</dt><dt class="value">OPTIONAL_ARGUMENT</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_Element">Element: object</a></dt><dd>
         <p>
           Information about an element (something that can be declared
           in code).
@@ -2077,7 +2077,7 @@
           An enumeration of the kinds of elements.
         </p>
         
-      <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
+      <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
         <p>
           A description of an executable file.
         </p>
@@ -2165,7 +2165,7 @@
           applied to files.
         </p>
         
-      <dl><dt class="value">ANNOTATION</dt><dt class="value">BUILT_IN</dt><dt class="value">CLASS</dt><dt class="value">COMMENT_BLOCK</dt><dt class="value">COMMENT_DOCUMENTATION</dt><dt class="value">COMMENT_END_OF_LINE</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">DIRECTIVE</dt><dt class="value">DYNAMIC_TYPE</dt><dt class="value">FIELD</dt><dt class="value">FIELD_STATIC</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_DECLARATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER_DECLARATION</dt><dt class="value">IDENTIFIER_DEFAULT</dt><dt class="value">IMPORT_PREFIX</dt><dt class="value">KEYWORD</dt><dt class="value">LITERAL_BOOLEAN</dt><dt class="value">LITERAL_DOUBLE</dt><dt class="value">LITERAL_INTEGER</dt><dt class="value">LITERAL_LIST</dt><dt class="value">LITERAL_MAP</dt><dt class="value">LITERAL_STRING</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">LOCAL_VARIABLE_DECLARATION</dt><dt class="value">METHOD</dt><dt class="value">METHOD_DECLARATION</dt><dt class="value">METHOD_DECLARATION_STATIC</dt><dt class="value">METHOD_STATIC</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER_DECLARATION</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_NAME_DYNAMIC</dt><dt class="value">TYPE_PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_HoverInformation">HoverInformation: object</a></dt><dd>
+      <dl><dt class="value">ANNOTATION</dt><dt class="value">BUILT_IN</dt><dt class="value">CLASS</dt><dt class="value">COMMENT_BLOCK</dt><dt class="value">COMMENT_DOCUMENTATION</dt><dt class="value">COMMENT_END_OF_LINE</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">DIRECTIVE</dt><dt class="value">DYNAMIC_TYPE</dt><dt class="value">FIELD</dt><dt class="value">FIELD_STATIC</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_DECLARATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER_DECLARATION</dt><dt class="value">IDENTIFIER_DEFAULT</dt><dt class="value">IMPORT_PREFIX</dt><dt class="value">KEYWORD</dt><dt class="value">LABEL</dt><dt class="value">LITERAL_BOOLEAN</dt><dt class="value">LITERAL_DOUBLE</dt><dt class="value">LITERAL_INTEGER</dt><dt class="value">LITERAL_LIST</dt><dt class="value">LITERAL_MAP</dt><dt class="value">LITERAL_STRING</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">LOCAL_VARIABLE_DECLARATION</dt><dt class="value">METHOD</dt><dt class="value">METHOD_DECLARATION</dt><dt class="value">METHOD_DECLARATION_STATIC</dt><dt class="value">METHOD_STATIC</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER_DECLARATION</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_NAME_DYNAMIC</dt><dt class="value">TYPE_PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_HoverInformation">HoverInformation: object</a></dt><dd>
         <p>
           The hover information associated with a specific location.
         </p>
@@ -2579,11 +2579,11 @@
             <p>
               A short description of the error.
             </p>
-          </dd><dt class="field"><b><i>data ( <span style="color:#999999">optional</span> object )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>stackTrace ( <span style="color:#999999">optional</span> String )</i></b></dt><dd>
             
             <p>
-              Additional data related to the error. This field is
-              omitted if there is no additional data available.
+              The stack trace associated with processing the request,
+              used for debugging the server.
             </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_RequestErrorCode">RequestErrorCode: String</a></dt><dd>
         <p>
@@ -2627,6 +2627,12 @@
               the analysis server can only speak to one client at a
               time so this error will never occur.
             </p>
+          </dd><dt class="value">SERVER_ERROR</dt><dd>
+            
+            <p>
+              An internal error occurred in the analysis server.
+              Also see the server.error notification.
+            </p>
           </dd><dt class="value">UNANALYZED_PRIORITY_FILES</dt><dd>
             
             <p>
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index e2f739b..1236eb9 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -37,8 +37,7 @@
    */
   AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
 
-  ServerContextManager(
-      this.analysisServer, ResourceProvider resourceProvider,
+  ServerContextManager(this.analysisServer, ResourceProvider resourceProvider,
       PackageMapProvider packageMapProvider)
       : super(resourceProvider, packageMapProvider);
 
@@ -63,14 +62,17 @@
   @override
   void removeContext(Folder folder) {
     AnalysisContext context = analysisServer.folderMap.remove(folder);
+    if (analysisServer.index != null) {
+      analysisServer.index.removeContext(context);
+    }
     analysisServer.sendContextAnalysisDoneNotifications(
         context,
         AnalysisDoneReason.CONTEXT_REMOVED);
   }
 
   @override
-  void updateContextPackageMap(Folder contextFolder,
-                               Map<String, List<Folder>> packageMap) {
+  void updateContextPackageMap(Folder contextFolder, Map<String,
+      List<Folder>> packageMap) {
     AnalysisContext context = analysisServer.folderMap[contextFolder];
     context.sourceFactory = _createSourceFactory(packageMap);
     analysisServer.schedulePerformAnalysisOperation(context);
@@ -84,8 +86,7 @@
     List<UriResolver> resolvers = <UriResolver>[
         new DartUriResolver(analysisServer.defaultSdk),
         new ResourceUriResolver(resourceProvider),
-        new PackageMapUriResolver(resourceProvider, packageMap)
-    ];
+        new PackageMapUriResolver(resourceProvider, packageMap)];
     return new SourceFactory(resolvers);
   }
 }
@@ -231,8 +232,8 @@
       {this.rethrowExceptions: true}) {
     searchEngine = createSearchEngine(index);
     operationQueue = new ServerOperationQueue(this);
-    contextDirectoryManager = new ServerContextManager(
-        this, resourceProvider, packageMapProvider);
+    contextDirectoryManager =
+        new ServerContextManager(this, resourceProvider, packageMapProvider);
     AnalysisEngine.instance.logger = new AnalysisLogger();
     running = true;
     Notification notification = new ServerConnectedParams().toNotification();
@@ -295,8 +296,8 @@
     if (unanalyzed.isNotEmpty) {
       StringBuffer buffer = new StringBuffer();
       buffer.writeAll(unanalyzed, ', ');
-      throw new RequestFailure(new Response.unanalyzedPriorityFiles(request,
-          buffer.toString()));
+      throw new RequestFailure(
+          new Response.unanalyzedPriorityFiles(request, buffer.toString()));
     }
     folderMap.forEach((Folder folder, AnalysisContext context) {
       List<Source> sourceList = sourceMap[context];
@@ -316,7 +317,8 @@
     // Update existing contexts.
     //
     folderMap.forEach((Folder folder, AnalysisContext context) {
-      AnalysisOptionsImpl options = new AnalysisOptionsImpl.con1(context.analysisOptions);
+      AnalysisOptionsImpl options =
+          new AnalysisOptionsImpl.con1(context.analysisOptions);
       optionUpdaters.forEach((OptionUpdater optionUpdater) {
         optionUpdater(options);
       });
@@ -386,23 +388,35 @@
    * Handle a [request] that was read from the communication channel.
    */
   void handleRequest(Request request) {
-    int count = handlers.length;
-    for (int i = 0; i < count; i++) {
-      try {
-        Response response = handlers[i].handleRequest(request);
-        if (response == Response.DELAYED_RESPONSE) {
+    runZoned(() {
+      int count = handlers.length;
+      for (int i = 0; i < count; i++) {
+        try {
+          Response response = handlers[i].handleRequest(request);
+          if (response == Response.DELAYED_RESPONSE) {
+            return;
+          }
+          if (response != null) {
+            channel.sendResponse(response);
+            return;
+          }
+        } on RequestFailure catch (exception) {
+          channel.sendResponse(exception.response);
           return;
-        }
-        if (response != null) {
+        } catch (exception, stackTrace) {
+          RequestError error = new RequestError(
+              RequestErrorCode.SERVER_ERROR,
+              exception);
+          if (stackTrace != null) {
+            error.stackTrace = stackTrace.toString();
+          }
+          Response response = new Response(request.id, error: error);
           channel.sendResponse(response);
           return;
         }
-      } on RequestFailure catch (exception) {
-        channel.sendResponse(exception.response);
-        return;
       }
-    }
-    channel.sendResponse(new Response.unknownRequest(request));
+      channel.sendResponse(new Response.unknownRequest(request));
+    }, onError: _sendServerErrorNotification);
   }
 
   /**
@@ -474,6 +488,17 @@
   }
 
   /**
+   * Trigger reanalysis of all files from disk.
+   */
+  void reanalyze() {
+    // Clear any operations that are pending.
+    operationQueue.clear();
+    // Instruct the contextDirectoryManager to rebuild all contexts from
+    // scratch.
+    contextDirectoryManager.refresh();
+  }
+
+  /**
    * Remove the given [listener] from the list of listeners that are listening
    * for lifecycle events from this server.
    */
@@ -497,8 +522,8 @@
     }
     statusAnalyzing = isAnalyzing;
     AnalysisStatus analysis = new AnalysisStatus(isAnalyzing);
-    channel.sendNotification(new ServerStatusParams(
-        analysis: analysis).toNotification());
+    channel.sendNotification(
+        new ServerStatusParams(analysis: analysis).toNotification());
   }
 
   /**
@@ -513,15 +538,13 @@
    * So, we can start working in parallel on adding services and improving
    * projects/contexts support.
    */
-  void setAnalysisRoots(String requestId,
-                        List<String> includedPaths,
-                        List<String> excludedPaths) {
+  void setAnalysisRoots(String requestId, List<String> includedPaths,
+      List<String> excludedPaths) {
     try {
       contextDirectoryManager.setRoots(includedPaths, excludedPaths);
     } on UnimplementedError catch (e) {
       throw new RequestFailure(
-                  new Response.unsupportedFeature(
-                      requestId, e.message));
+          new Response.unsupportedFeature(requestId, e.message));
     }
   }
 
@@ -542,16 +565,19 @@
         } else if (change is ChangeContentOverlay) {
           // TODO(paulberry): an error should be generated if source is not
           // currently in the content cache.
-          TimestampedData<String> oldContents = analysisContext.getContents(
-              source);
+          TimestampedData<String> oldContents =
+              analysisContext.getContents(source);
           String newContents;
           try {
-            newContents = SourceEdit.applySequence(oldContents.data,
-                change.edits);
+            newContents =
+                SourceEdit.applySequence(oldContents.data, change.edits);
           } on RangeError {
-            throw new RequestFailure(new Response(id, error: new RequestError(
-                RequestErrorCode.INVALID_OVERLAY_CHANGE,
-                'Invalid overlay change')));
+            throw new RequestFailure(
+                new Response(
+                    id,
+                    error: new RequestError(
+                        RequestErrorCode.INVALID_OVERLAY_CHANGE,
+                        'Invalid overlay change')));
           }
           // TODO(paulberry): to aid in incremental processing it would be
           // better to use setChangedContents.
@@ -570,11 +596,13 @@
   /**
    * Implementation for `analysis.setSubscriptions`.
    */
-  void setAnalysisSubscriptions(Map<AnalysisService, Set<String>> subscriptions) {
+  void setAnalysisSubscriptions(Map<AnalysisService,
+      Set<String>> subscriptions) {
     // send notifications for already analyzed sources
     subscriptions.forEach((service, Set<String> newFiles) {
       Set<String> oldFiles = analysisServices[service];
-      Set<String> todoFiles = oldFiles != null ? newFiles.difference(oldFiles) : newFiles;
+      Set<String> todoFiles =
+          oldFiles != null ? newFiles.difference(oldFiles) : newFiles;
       for (String file in todoFiles) {
         Source source = getSource(file);
         // prepare context
@@ -584,7 +612,8 @@
         }
         // Dart unit notifications.
         if (AnalysisEngine.isDartFileName(file)) {
-          CompilationUnit dartUnit = getResolvedCompilationUnitToResendNotification(file);
+          CompilationUnit dartUnit =
+              getResolvedCompilationUnitToResendNotification(file);
           if (dartUnit != null) {
             switch (service) {
               case AnalysisService.HIGHLIGHTS:
@@ -598,7 +627,11 @@
                 sendAnalysisNotificationOccurrences(this, file, dartUnit);
                 break;
               case AnalysisService.OUTLINE:
-                sendAnalysisNotificationOutline(this, context, source, dartUnit);
+                sendAnalysisNotificationOutline(
+                    this,
+                    context,
+                    source,
+                    dartUnit);
                 break;
               case AnalysisService.OVERRIDES:
                 sendAnalysisNotificationOverrides(this, file, dartUnit);
@@ -730,7 +763,8 @@
     Source unitSource = getSource(path);
     List<Source> librarySources = context.getLibrariesContaining(unitSource);
     for (Source librarySource in librarySources) {
-      CompilationUnit unit = context.getResolvedCompilationUnit2(unitSource, librarySource);
+      CompilationUnit unit =
+          context.getResolvedCompilationUnit2(unitSource, librarySource);
       if (unit != null) {
         units.add(unit);
       }
@@ -823,7 +857,7 @@
    * done.
    */
   void sendContextAnalysisDoneNotifications(AnalysisContext context,
-                                            AnalysisDoneReason reason) {
+      AnalysisDoneReason reason) {
     Completer<AnalysisDoneReason> completer =
         contextAnalysisDoneCompleters.remove(context);
     if (completer != null) {
@@ -903,8 +937,11 @@
       stackTraceString = 'null stackTrace';
     }
     // send the notification
-    channel.sendNotification(new ServerErrorParams(true, exceptionString,
-        stackTraceString).toNotification());
+    channel.sendNotification(
+        new ServerErrorParams(
+            true,
+            exceptionString,
+            stackTraceString).toNotification());
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index c01c4ac..e0d7337 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -82,6 +82,9 @@
     if (_addIdentifierRegion_importPrefix(node)) {
       return;
     }
+    if (_addIdentifierRegion_label(node)) {
+      return;
+    }
     if (_addIdentifierRegion_localVariable(node)) {
       return;
     }
@@ -225,6 +228,14 @@
     return false;
   }
 
+  bool _addIdentifierRegion_label(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! LabelElement) {
+      return false;
+    }
+    return _addRegion_node(node, HighlightRegionType.LABEL);
+  }
+
   bool _addIdentifierRegion_localVariable(SimpleIdentifier node) {
     Element element = node.staticElement;
     if (element is! LocalVariableElement) {
@@ -292,7 +303,8 @@
     return true;
   }
 
-  void _addRegion_nodeStart_tokenEnd(AstNode a, Token b, HighlightRegionType type) {
+  void _addRegion_nodeStart_tokenEnd(AstNode a, Token b,
+      HighlightRegionType type) {
     int offset = a.offset;
     int end = b.end;
     _addRegion(offset, end - offset, type);
@@ -306,7 +318,8 @@
     }
   }
 
-  void _addRegion_tokenStart_tokenEnd(Token a, Token b, HighlightRegionType type) {
+  void _addRegion_tokenStart_tokenEnd(Token a, Token b,
+      HighlightRegionType type) {
     int offset = a.offset;
     int end = b.end;
     _addRegion(offset, end - offset, type);
@@ -363,14 +376,20 @@
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
     computer._addRegion_token(node.classKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.abstractKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.abstractKeyword,
+        HighlightRegionType.BUILT_IN);
     return super.visitClassDeclaration(node);
   }
 
   @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    computer._addRegion_token(node.externalKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.factoryKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.externalKeyword,
+        HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.factoryKeyword,
+        HighlightRegionType.BUILT_IN);
     return super.visitConstructorDeclaration(node);
   }
 
@@ -421,8 +440,12 @@
 
   @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
-    computer._addRegion_token(node.externalKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.propertyKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.externalKeyword,
+        HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.propertyKeyword,
+        HighlightRegionType.BUILT_IN);
     return super.visitFunctionDeclaration(node);
   }
 
@@ -500,10 +523,18 @@
 
   @override
   Object visitMethodDeclaration(MethodDeclaration node) {
-    computer._addRegion_token(node.externalKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.modifierKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.operatorKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.propertyKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.externalKeyword,
+        HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.modifierKeyword,
+        HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.operatorKeyword,
+        HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(
+        node.propertyKeyword,
+        HighlightRegionType.BUILT_IN);
     return super.visitMethodDeclaration(node);
   }
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index ac2cfec..bce017c 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -16,7 +16,8 @@
 class DartUnitNavigationComputer {
   final CompilationUnit _unit;
 
-  final List<protocol.NavigationRegion> _regions = <protocol.NavigationRegion>[];
+  final List<protocol.NavigationRegion> _regions = <protocol.NavigationRegion>[
+      ];
 
   DartUnitNavigationComputer(this._unit);
 
@@ -136,10 +137,32 @@
   @override
   visitInstanceCreationExpression(InstanceCreationExpression node) {
     Element element = node.staticElement;
-    if (element != null && element.isSynthetic) {
-      element = element.enclosingElement;
+    ConstructorName constructorName = node.constructorName;
+    if (element != null && constructorName != null) {
+      ClassElement classElement = element.enclosingElement;
+      if (element.isSynthetic) {
+        element = classElement;
+        computer._addRegion_nodeStart_nodeStart(
+            node,
+            node.argumentList,
+            element);
+      } else {
+        // add region for "type" first, so that it is found before "new "
+        computer._addRegionForNode(constructorName.type, classElement);
+        // "new "
+        computer._addRegion_nodeStart_nodeStart(
+            node,
+            constructorName.type,
+            element);
+        // optional ".name"
+        if (constructorName.period != null) {
+          computer._addRegion_tokenStart_nodeEnd(
+              constructorName.period,
+              constructorName,
+              element);
+        }
+      }
     }
-    computer._addRegion_nodeStart_nodeStart(node, node.argumentList, element);
     return super.visitInstanceCreationExpression(node);
   }
 
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index b77e283..fbecfe9 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -23,6 +23,7 @@
 //
 const String ANALYSIS_GET_ERRORS = 'analysis.getErrors';
 const String ANALYSIS_GET_HOVER = 'analysis.getHover';
+const String ANALYSIS_REANALYZE = 'analysis.reanalyze';
 const String ANALYSIS_SET_ANALYSIS_ROOTS = 'analysis.setAnalysisRoots';
 const String ANALYSIS_SET_PRIORITY_FILES = 'analysis.setPriorityFiles';
 const String ANALYSIS_SET_SUBSCRIPTIONS = 'analysis.setSubscriptions';
@@ -113,7 +114,6 @@
 const String CONTENT = 'content';
 const String CORRECTION = 'correction';
 const String DART_DOC = 'dartdoc';
-const String DATA = 'data';
 const String DEFAULT = 'default';
 const String DISPLAY_NAME = 'displayName';
 const String EDITS = 'edits';
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 4a7ceed..c46d214 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -49,11 +49,18 @@
   pathos.Context pathContext;
 
   /**
-   * A list of excluded paths - folders and files.
+   * The list of excluded paths (folders and files) most recently passed to
+   * [setRoots].
    */
   List<String> excludedPaths = <String>[];
 
   /**
+   * The list of included paths (folders and files) most recently passed to
+   * [setRoots].
+   */
+  List<String> includedPaths = <String>[];
+
+  /**
    * Provider which is used to determine the mapping from package name to
    * package folder.
    */
@@ -100,6 +107,19 @@
   void removeContext(Folder folder);
 
   /**
+   * Rebuild the set of contexts from scratch based on the data last sent to
+   * setRoots().
+   */
+  void refresh() {
+    // Destroy old contexts
+    List<Folder> contextFolders = _contexts.keys.toList();
+    contextFolders.forEach(_destroyContext);
+
+    // Rebuild contexts based on the data last sent to setRoots().
+    setRoots(includedPaths, excludedPaths);
+  }
+
+  /**
    * Change the set of paths which should be used as starting points to
    * determine the context directories.
    */
@@ -119,6 +139,7 @@
                 'Only support for folder analysis is implemented currently.');
       }
     }
+    this.includedPaths = includedPaths;
     // excluded
     List<String> oldExcludedPaths = this.excludedPaths;
     this.excludedPaths = excludedPaths;
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index f507f14..c721106 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -95,6 +95,8 @@
         return getErrors(request);
       } else if (requestName == ANALYSIS_GET_HOVER) {
         return getHover(request);
+      } else if (requestName == ANALYSIS_REANALYZE) {
+        return reanalyze(request);
       } else if (requestName == ANALYSIS_SET_ANALYSIS_ROOTS) {
         return setAnalysisRoots(request);
       } else if (requestName == ANALYSIS_SET_PRIORITY_FILES) {
@@ -113,6 +115,14 @@
   }
 
   /**
+   * Implement the 'analysis.reanalyze' request.
+   */
+  Response reanalyze(Request request) {
+    server.reanalyze();
+    return new AnalysisReanalyzeResult().toResponse(request.id);
+  }
+
+  /**
    * Implement the 'analysis.setAnalysisRoots' request.
    */
   Response setAnalysisRoots(Request request) {
diff --git a/pkg/analysis_server/lib/src/domain_execution.dart b/pkg/analysis_server/lib/src/domain_execution.dart
index 9d83cba..9fb599f 100644
--- a/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/pkg/analysis_server/lib/src/domain_execution.dart
@@ -103,12 +103,11 @@
             'Either file or uri must be provided, but not both');
       }
       Source source = server.getSource(path);
-      // TODO(brianwilkerson) Figure out how to perform the mapping.
-      String uri = '';
+      String uri = context.sourceFactory.restoreUri(source).toString();
       return new ExecutionMapUriResult(uri: uri).toResponse(request.id);
     } else if (params.uri != null) {
-      // TODO(brianwilkerson) Figure out how to perform the mapping.
-      String file = '';
+      Source source = context.sourceFactory.forUri(params.uri);
+      String file = source.fullName;
       return new ExecutionMapUriResult(file: file).toResponse(request.id);
     }
     return new Response.invalidParameter(
diff --git a/pkg/analysis_server/lib/src/generated_protocol.dart b/pkg/analysis_server/lib/src/generated_protocol.dart
index ae83b1c..f4105b2 100644
--- a/pkg/analysis_server/lib/src/generated_protocol.dart
+++ b/pkg/analysis_server/lib/src/generated_protocol.dart
@@ -4,7 +4,7 @@
 //
 // This file has been automatically generated.  Please do not edit it manually.
 // To regenerate the file, use the script
-// "pkg/analysis_server/spec/generate_files".
+// "pkg/analysis_server/tool/spec/generate_files".
 
 part of protocol;
 /**
@@ -4618,8 +4618,10 @@
  * AnalysisErrorType
  *
  * enum {
+ *   ANGULAR
  *   COMPILE_TIME_ERROR
  *   HINT
+ *   POLYMER
  *   STATIC_TYPE_WARNING
  *   STATIC_WARNING
  *   SYNTACTIC_ERROR
@@ -4627,10 +4629,14 @@
  * }
  */
 class AnalysisErrorType {
+  static const ANGULAR = const AnalysisErrorType._("ANGULAR");
+
   static const COMPILE_TIME_ERROR = const AnalysisErrorType._("COMPILE_TIME_ERROR");
 
   static const HINT = const AnalysisErrorType._("HINT");
 
+  static const POLYMER = const AnalysisErrorType._("POLYMER");
+
   static const STATIC_TYPE_WARNING = const AnalysisErrorType._("STATIC_TYPE_WARNING");
 
   static const STATIC_WARNING = const AnalysisErrorType._("STATIC_WARNING");
@@ -4645,10 +4651,14 @@
 
   factory AnalysisErrorType(String name) {
     switch (name) {
+      case "ANGULAR":
+        return ANGULAR;
       case "COMPILE_TIME_ERROR":
         return COMPILE_TIME_ERROR;
       case "HINT":
         return HINT;
+      case "POLYMER":
+        return POLYMER;
       case "STATIC_TYPE_WARNING":
         return STATIC_TYPE_WARNING;
       case "STATIC_WARNING":
@@ -5388,6 +5398,7 @@
  *   GETTER
  *   IMPORT
  *   KEYWORD
+ *   LABEL
  *   LIBRARY_PREFIX
  *   LOCAL_VARIABLE
  *   METHOD
@@ -5421,6 +5432,8 @@
 
   static const KEYWORD = const CompletionSuggestionKind._("KEYWORD");
 
+  static const LABEL = const CompletionSuggestionKind._("LABEL");
+
   static const LIBRARY_PREFIX = const CompletionSuggestionKind._("LIBRARY_PREFIX");
 
   static const LOCAL_VARIABLE = const CompletionSuggestionKind._("LOCAL_VARIABLE");
@@ -5467,6 +5480,8 @@
         return IMPORT;
       case "KEYWORD":
         return KEYWORD;
+      case "LABEL":
+        return LABEL;
       case "LIBRARY_PREFIX":
         return LIBRARY_PREFIX;
       case "LOCAL_VARIABLE":
@@ -5702,6 +5717,7 @@
  *   FUNCTION
  *   FUNCTION_TYPE_ALIAS
  *   GETTER
+ *   LABEL
  *   LIBRARY
  *   LOCAL_VARIABLE
  *   METHOD
@@ -5731,6 +5747,8 @@
 
   static const GETTER = const ElementKind._("GETTER");
 
+  static const LABEL = const ElementKind._("LABEL");
+
   static const LIBRARY = const ElementKind._("LIBRARY");
 
   static const LOCAL_VARIABLE = const ElementKind._("LOCAL_VARIABLE");
@@ -5773,6 +5791,8 @@
         return FUNCTION_TYPE_ALIAS;
       case "GETTER":
         return GETTER;
+      case "LABEL":
+        return LABEL;
       case "LIBRARY":
         return LIBRARY;
       case "LOCAL_VARIABLE":
@@ -6235,6 +6255,7 @@
  *   IDENTIFIER_DEFAULT
  *   IMPORT_PREFIX
  *   KEYWORD
+ *   LABEL
  *   LITERAL_BOOLEAN
  *   LITERAL_DOUBLE
  *   LITERAL_INTEGER
@@ -6291,6 +6312,8 @@
 
   static const KEYWORD = const HighlightRegionType._("KEYWORD");
 
+  static const LABEL = const HighlightRegionType._("LABEL");
+
   static const LITERAL_BOOLEAN = const HighlightRegionType._("LITERAL_BOOLEAN");
 
   static const LITERAL_DOUBLE = const HighlightRegionType._("LITERAL_DOUBLE");
@@ -6367,6 +6390,8 @@
         return IMPORT_PREFIX;
       case "KEYWORD":
         return KEYWORD;
+      case "LABEL":
+        return LABEL;
       case "LITERAL_BOOLEAN":
         return LITERAL_BOOLEAN;
       case "LITERAL_DOUBLE":
@@ -8072,7 +8097,7 @@
  * {
  *   "code": RequestErrorCode
  *   "message": String
- *   "data": optional object
+ *   "stackTrace": optional String
  * }
  */
 class RequestError implements HasToJson {
@@ -8087,12 +8112,12 @@
   String message;
 
   /**
-   * Additional data related to the error. This field is omitted if there is no
-   * additional data available.
+   * The stack trace associated with processing the request, used for debugging
+   * the server.
    */
-  Map data;
+  String stackTrace;
 
-  RequestError(this.code, this.message, {this.data});
+  RequestError(this.code, this.message, {this.stackTrace});
 
   factory RequestError.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8111,11 +8136,11 @@
       } else {
         throw jsonDecoder.missingKey(jsonPath, "message");
       }
-      Map data;
-      if (json.containsKey("data")) {
-        data = json["data"];
+      String stackTrace;
+      if (json.containsKey("stackTrace")) {
+        stackTrace = jsonDecoder._decodeString(jsonPath + ".stackTrace", json["stackTrace"]);
       }
-      return new RequestError(code, message, data: data);
+      return new RequestError(code, message, stackTrace: stackTrace);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "RequestError");
     }
@@ -8125,8 +8150,8 @@
     Map<String, dynamic> result = {};
     result["code"] = code.toJson();
     result["message"] = message;
-    if (data != null) {
-      result["data"] = data;
+    if (stackTrace != null) {
+      result["stackTrace"] = stackTrace;
     }
     return result;
   }
@@ -8139,7 +8164,7 @@
     if (other is RequestError) {
       return code == other.code &&
           message == other.message &&
-          data == other.data;
+          stackTrace == other.stackTrace;
     }
     return false;
   }
@@ -8149,7 +8174,7 @@
     int hash = 0;
     hash = _JenkinsSmiHash.combine(hash, code.hashCode);
     hash = _JenkinsSmiHash.combine(hash, message.hashCode);
-    hash = _JenkinsSmiHash.combine(hash, data.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, stackTrace.hashCode);
     return _JenkinsSmiHash.finish(hash);
   }
 }
@@ -8163,6 +8188,7 @@
  *   INVALID_PARAMETER
  *   INVALID_REQUEST
  *   SERVER_ALREADY_STARTED
+ *   SERVER_ERROR
  *   UNANALYZED_PRIORITY_FILES
  *   UNKNOWN_REQUEST
  *   UNSUPPORTED_FEATURE
@@ -8203,6 +8229,12 @@
   static const SERVER_ALREADY_STARTED = const RequestErrorCode._("SERVER_ALREADY_STARTED");
 
   /**
+   * An internal error occurred in the analysis server. Also see the
+   * server.error notification.
+   */
+  static const SERVER_ERROR = const RequestErrorCode._("SERVER_ERROR");
+
+  /**
    * An "analysis.setPriorityFiles" request includes one or more files that are
    * not being analyzed.
    *
@@ -8242,6 +8274,8 @@
         return INVALID_REQUEST;
       case "SERVER_ALREADY_STARTED":
         return SERVER_ALREADY_STARTED;
+      case "SERVER_ERROR":
+        return SERVER_ERROR;
       case "UNANALYZED_PRIORITY_FILES":
         return UNANALYZED_PRIORITY_FILES;
       case "UNKNOWN_REQUEST":
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index fbb33a1..fc2d35a 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -219,6 +219,9 @@
   if (kind == engine.ElementKind.GETTER) {
     return ElementKind.GETTER;
   }
+  if (kind == engine.ElementKind.LABEL) {
+    return ElementKind.LABEL;
+  }
   if (kind == engine.ElementKind.LIBRARY) {
     return ElementKind.LIBRARY;
   }
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
index 9117014..669fbdc 100644
--- a/pkg/analysis_server/lib/src/search/element_references.dart
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -50,8 +50,8 @@
     return _getRefElements(element).then((Iterable<Element> refElements) {
       var futureGroup = new _ConcatFutureGroup<SearchResult>();
       for (Element refElement in refElements) {
-        // add variable declaration
-        if (_isVariableLikeElement(refElement)) {
+        // add declaration
+        if (_isDeclarationInteresting(refElement)) {
           SearchResult searchResult = _newDeclarationResult(refElement);
           futureGroup.add(searchResult);
         }
@@ -83,7 +83,7 @@
    */
   Future<Iterable<Element>> _getRefElements(Element element) {
     if (element is ClassMemberElement) {
-      return getHierarchyMembers(searchEngine, element);
+      return getHierarchyMembers(searchEngine, element, true);
     }
     return new Future.value([element]);
   }
@@ -112,7 +112,10 @@
     return element.enclosingElement is ClassElement;
   }
 
-  static bool _isVariableLikeElement(Element element) {
+  static bool _isDeclarationInteresting(Element element) {
+    if (element is LabelElement) {
+      return true;
+    }
     if (element is LocalVariableElement) {
       return true;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
index 240a3a3..a8f5ab4 100644
--- a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
@@ -56,6 +56,18 @@
   }
 
   @override
+  Future<bool> visitExpressionStatement(ExpressionStatement node) {
+    Expression expression = node.expression;
+    if (expression is SimpleIdentifier) {
+      if (expression.end < request.offset) {
+        // Don't suggest imported elements for local var name
+        return new Future.value(false);
+      }
+    }
+    return visitNode(node);
+  }
+
+  @override
   Future<bool> visitNode(AstNode node) {
     return _addImportedElements();
   }
@@ -97,20 +109,23 @@
       // and the list of names that should be shown or hidden
       request.unit.directives.forEach((Directive directive) {
         if (directive is ImportDirective) {
-          LibraryElement lib = directive.element.importedLibrary;
-          if (directive.prefix == null) {
-            visibleLibs.add(lib);
-            directive.combinators.forEach((Combinator combinator) {
-              if (combinator is ShowCombinator) {
-                showNames[lib] = combinator.shownNames.map(
-                    (SimpleIdentifier id) => id.name).toSet();
-              } else if (combinator is HideCombinator) {
-                hideNames[lib] = combinator.hiddenNames.map(
-                    (SimpleIdentifier id) => id.name).toSet();
-              }
-            });
-          } else {
-            excludedLibs.add(lib);
+          ImportElement element = directive.element;
+          if (element != null) {
+            LibraryElement lib = element.importedLibrary;
+            if (directive.prefix == null) {
+              visibleLibs.add(lib);
+              directive.combinators.forEach((Combinator combinator) {
+                if (combinator is ShowCombinator) {
+                  showNames[lib] =
+                      combinator.shownNames.map((SimpleIdentifier id) => id.name).toSet();
+                } else if (combinator is HideCombinator) {
+                  hideNames[lib] =
+                      combinator.hiddenNames.map((SimpleIdentifier id) => id.name).toSet();
+                }
+              });
+            } else {
+              excludedLibs.add(lib);
+            }
           }
         }
       });
@@ -126,17 +141,40 @@
             Set<String> hide = hideNames[lib];
             if ((show == null || show.contains(completion)) &&
                 (hide == null || !hide.contains(completion))) {
-              request.suggestions.add(
-                  new CompletionSuggestion(
-                      new CompletionSuggestionKind.fromElementKind(element.kind),
-                      visibleLibs.contains(lib) || lib.isDartCore ?
-                          CompletionRelevance.DEFAULT :
-                          CompletionRelevance.LOW,
-                      completion,
-                      completion.length,
-                      0,
-                      element.isDeprecated,
-                      false));
+
+              CompletionSuggestionKind kind =
+                  new CompletionSuggestionKind.fromElementKind(element.kind);
+
+              CompletionRelevance relevance;
+              if (visibleLibs.contains(lib) || lib.isDartCore) {
+                relevance = CompletionRelevance.DEFAULT;
+              } else {
+                relevance = CompletionRelevance.LOW;
+              }
+
+              CompletionSuggestion suggestion = new CompletionSuggestion(
+                  kind,
+                  relevance,
+                  completion,
+                  completion.length,
+                  0,
+                  element.isDeprecated,
+                  false);
+
+              DartType type;
+              if (element is TopLevelVariableElement) {
+                type = element.type;
+              } else if (element is FunctionElement) {
+                type = element.returnType;
+              }
+              if (type != null) {
+                String name = type.displayName;
+                if (name != null && name.length > 0 && name != 'dynamic') {
+                  suggestion.returnType = name;
+                }
+              }
+
+              request.suggestions.add(suggestion);
             }
           }
         }
@@ -145,4 +183,3 @@
     });
   }
 }
-
diff --git a/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
index bd26d71..ad9b387 100644
--- a/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
@@ -102,11 +102,6 @@
         }
       }
     });
-
-    element.importedLibraries.forEach((LibraryElement library) {
-      modified = true;
-      library.accept(new ClassElementSuggestionBuilder(request));
-    });
     return new Future.value(modified);
   }
 
@@ -114,8 +109,7 @@
   Future<bool> visitVariableElement(VariableElement element) {
     DartType type = element.type;
     if (type != null) {
-      Element typeElement = type.element;
-      ClassElementSuggestionBuilder.suggestionsFor(request, typeElement);
+      ClassElementSuggestionBuilder.suggestionsFor(request, type.element);
     }
     return new Future.value(true);
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/local_computer.dart b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
index 3b77976..06f299c 100644
--- a/pkg/analysis_server/lib/src/services/completion/local_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
@@ -56,13 +56,18 @@
 //            _addSuggestion(label.label, CompletionSuggestionKind.LABEL);
           });
         } else if (stmt is VariableDeclarationStatement) {
-          stmt.variables.variables.forEach((VariableDeclaration varDecl) {
-            if (varDecl.end < request.offset) {
-              _addSuggestion(
-                  varDecl.name,
-                  CompletionSuggestionKind.LOCAL_VARIABLE);
-            }
-          });
+          VariableDeclarationList varList = stmt.variables;
+          if (varList != null) {
+            varList.variables.forEach((VariableDeclaration varDecl) {
+              if (varDecl.end < request.offset) {
+                _addSuggestion(
+                    varDecl.name,
+                    CompletionSuggestionKind.LOCAL_VARIABLE,
+                    varList.type,
+                    null);
+              }
+            });
+          }
         }
       }
     });
@@ -71,8 +76,17 @@
 
   @override
   visitCatchClause(CatchClause node) {
-    _addSuggestion(node.exceptionParameter, CompletionSuggestionKind.PARAMETER);
-    _addSuggestion(node.stackTraceParameter, CompletionSuggestionKind.PARAMETER);
+    _addSuggestion(
+        node.exceptionParameter,
+        CompletionSuggestionKind.PARAMETER,
+        node.exceptionType,
+        null);
+    // TODO (danrubel) add stack trace types
+    _addSuggestion(
+        node.stackTraceParameter,
+        CompletionSuggestionKind.PARAMETER,
+        null,
+        null);
     visitNode(node);
   }
 
@@ -80,9 +94,16 @@
   visitClassDeclaration(ClassDeclaration node) {
     node.members.forEach((ClassMember classMbr) {
       if (classMbr is FieldDeclaration) {
-        _addSuggestions(classMbr.fields, CompletionSuggestionKind.FIELD);
+        _addVarListSuggestions(
+            classMbr.fields,
+            CompletionSuggestionKind.FIELD,
+            node);
       } else if (classMbr is MethodDeclaration) {
-        _addSuggestion(classMbr.name, CompletionSuggestionKind.METHOD_NAME);
+        _addSuggestion(
+            classMbr.name,
+            CompletionSuggestionKind.METHOD_NAME,
+            classMbr.returnType,
+            node);
       }
     });
     visitNode(node);
@@ -94,39 +115,77 @@
       if (directive is ImportDirective) {
         _addSuggestion(
             directive.prefix,
-            CompletionSuggestionKind.LIBRARY_PREFIX);
+            CompletionSuggestionKind.LIBRARY_PREFIX,
+            null,
+            null);
       }
     });
     node.declarations.forEach((Declaration declaration) {
       if (declaration is ClassDeclaration) {
-        _addSuggestion(declaration.name, CompletionSuggestionKind.CLASS);
+        _addSuggestion(
+            declaration.name,
+            CompletionSuggestionKind.CLASS,
+            null,
+            null);
       } else if (declaration is EnumDeclaration) {
 //        _addSuggestion(d.name, CompletionSuggestionKind.ENUM);
       } else if (declaration is FunctionDeclaration) {
-        _addSuggestion(declaration.name, CompletionSuggestionKind.FUNCTION);
+        _addSuggestion(
+            declaration.name,
+            CompletionSuggestionKind.FUNCTION,
+            declaration.returnType,
+            null);
       } else if (declaration is TopLevelVariableDeclaration) {
-        _addSuggestions(
+        _addVarListSuggestions(
             declaration.variables,
-            CompletionSuggestionKind.TOP_LEVEL_VARIABLE);
+            CompletionSuggestionKind.TOP_LEVEL_VARIABLE,
+            null);
       } else if (declaration is ClassTypeAlias) {
-        _addSuggestion(declaration.name, CompletionSuggestionKind.CLASS_ALIAS);
+        _addSuggestion(
+            declaration.name,
+            CompletionSuggestionKind.CLASS_ALIAS,
+            null,
+            null);
       } else if (declaration is FunctionTypeAlias) {
         _addSuggestion(
             declaration.name,
-            CompletionSuggestionKind.FUNCTION_TYPE_ALIAS);
+            CompletionSuggestionKind.FUNCTION_TYPE_ALIAS,
+            declaration.returnType,
+            null);
       }
     });
   }
 
   @override
+  visitExpressionStatement(ExpressionStatement node) {
+    Expression expression = node.expression;
+    if (expression is SimpleIdentifier) {
+      if (expression.end < request.offset) {
+        // TODO (danrubel) suggest possible names for variable declaration
+        // based upon variable type
+        return;
+      }
+    }
+    visitNode(node);
+  }
+
+  @override
   visitForEachStatement(ForEachStatement node) {
-    _addSuggestion(node.identifier, CompletionSuggestionKind.LOCAL_VARIABLE);
+    // TODO (danrubel) supply type of local variable
+    _addSuggestion(
+        node.identifier,
+        CompletionSuggestionKind.LOCAL_VARIABLE,
+        null,
+        null);
     visitNode(node);
   }
 
   @override
   visitForStatement(ForStatement node) {
-    _addSuggestions(node.variables, CompletionSuggestionKind.LOCAL_VARIABLE);
+    _addVarListSuggestions(
+        node.variables,
+        CompletionSuggestionKind.LOCAL_VARIABLE,
+        null);
     visitNode(node);
   }
 
@@ -139,19 +198,13 @@
 
   @override
   visitFunctionExpression(FunctionExpression node) {
-    node.parameters.parameters.forEach((FormalParameter param) {
-      _addSuggestion(param.identifier, CompletionSuggestionKind.PARAMETER);
-    });
+    _addParamListSuggestions(node.parameters);
     visitNode(node);
   }
 
   @override
   visitMethodDeclaration(MethodDeclaration node) {
-    node.parameters.parameters.forEach((FormalParameter param) {
-      if (param.identifier != null) {
-        _addSuggestion(param.identifier, CompletionSuggestionKind.PARAMETER);
-      }
-    });
+    _addParamListSuggestions(node.parameters);
     visitNode(node);
   }
 
@@ -171,27 +224,72 @@
     }
   }
 
-  void _addSuggestion(SimpleIdentifier id, CompletionSuggestionKind kind) {
+  void _addParamListSuggestions(FormalParameterList paramList) {
+    if (paramList != null) {
+      paramList.parameters.forEach((FormalParameter param) {
+        NormalFormalParameter normalParam;
+        if (param is DefaultFormalParameter) {
+          normalParam = param.parameter;
+        } else if (param is NormalFormalParameter) {
+          normalParam = param;
+        }
+        TypeName type = null;
+        if (normalParam is FieldFormalParameter) {
+          type = normalParam.type;
+        } else if (normalParam is FunctionTypedFormalParameter) {
+          type = normalParam.returnType;
+        } else if (normalParam is SimpleFormalParameter) {
+          type = normalParam.type;
+        }
+        _addSuggestion(
+            param.identifier,
+            CompletionSuggestionKind.PARAMETER,
+            type,
+            null);
+      });
+    }
+  }
+
+  void _addSuggestion(SimpleIdentifier id, CompletionSuggestionKind kind,
+      TypeName typeName, ClassDeclaration classDecl) {
     if (id != null) {
       String completion = id.name;
       if (completion != null && completion.length > 0) {
-        request.suggestions.add(
-            new CompletionSuggestion(
-                kind,
-                CompletionRelevance.DEFAULT,
-                completion,
-                completion.length,
-                0,
-                false,
-                false));
+        CompletionSuggestion suggestion = new CompletionSuggestion(
+            kind,
+            CompletionRelevance.DEFAULT,
+            completion,
+            completion.length,
+            0,
+            false,
+            false);
+        if (classDecl != null) {
+          SimpleIdentifier identifier = classDecl.name;
+          if (identifier != null) {
+            String name = identifier.name;
+            if (name != null && name.length > 0) {
+              suggestion.declaringType = name;
+            }
+          }
+        }
+        if (typeName != null) {
+          Identifier identifier = typeName.name;
+          if (identifier != null) {
+            String name = identifier.name;
+            if (name != null && name.length > 0) {
+              suggestion.returnType = name;
+            }
+          }
+        }
+        request.suggestions.add(suggestion);
       }
     }
   }
 
-  void _addSuggestions(VariableDeclarationList variables,
-      CompletionSuggestionKind kind) {
+  void _addVarListSuggestions(VariableDeclarationList variables,
+      CompletionSuggestionKind kind, ClassDeclaration classDecl) {
     variables.variables.forEach((VariableDeclaration varDecl) {
-      _addSuggestion(varDecl.name, kind);
+      _addSuggestion(varDecl.name, kind, variables.type, classDecl);
     });
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
index f2e085d..b2a4453 100644
--- a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
@@ -34,24 +34,41 @@
 
   @override
   visitFieldElement(FieldElement element) {
-    _addSuggestion(element, CompletionSuggestionKind.FIELD);
+    _addSuggestion(
+        element,
+        CompletionSuggestionKind.FIELD,
+        element.type,
+        element.enclosingElement);
   }
 
   @override
   visitMethodElement(MethodElement element) {
-    _addSuggestion(element, CompletionSuggestionKind.METHOD);
+    _addSuggestion(
+        element,
+        CompletionSuggestionKind.METHOD,
+        element.returnType,
+        element.enclosingElement);
   }
 
   @override
   visitPropertyAccessorElement(PropertyAccessorElement element) {
     if (element.isGetter) {
-      _addSuggestion(element, CompletionSuggestionKind.GETTER);
+      _addSuggestion(
+          element,
+          CompletionSuggestionKind.GETTER,
+          element.returnType,
+          element.enclosingElement);
     } else if (element.isSetter) {
-      _addSuggestion(element, CompletionSuggestionKind.SETTER);
+      _addSuggestion(
+          element,
+          CompletionSuggestionKind.SETTER,
+          element.returnType,
+          element.enclosingElement);
     }
   }
 
-  void _addSuggestion(Element element, CompletionSuggestionKind kind) {
+  void _addSuggestion(Element element, CompletionSuggestionKind kind,
+      DartType type, ClassElement enclosingElement) {
     if (element.isSynthetic) {
       return;
     }
@@ -70,15 +87,24 @@
         !_completions.add(completion)) {
       return;
     }
-    request.suggestions.add(
-        new CompletionSuggestion(
-            kind,
-            CompletionRelevance.DEFAULT,
-            completion,
-            completion.length,
-            0,
-            element.isDeprecated,
-            false));
+    var suggestion = new CompletionSuggestion(
+        kind,
+        CompletionRelevance.DEFAULT,
+        completion,
+        completion.length,
+        0,
+        element.isDeprecated,
+        false);
+    if (enclosingElement != null) {
+      suggestion.declaringType = enclosingElement.displayName;
+    }
+    if (type != null) {
+      String typeName = type.displayName;
+      if (typeName != null && typeName.length > 0 && typeName != 'dynamic') {
+        suggestion.returnType = typeName;
+      }
+    }
+    request.suggestions.add(suggestion);
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 5280a44..9cc5675 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -524,13 +524,17 @@
     }
     // prepare whole import namespace
     ImportElement importElement = importDirective.element;
+    if (importElement == null) {
+      _coverageMarker();
+      return;
+    }
     Map<String, Element> namespace = getImportNamespace(importElement);
     // prepare names of referenced elements (from this import)
     SplayTreeSet<String> referencedNames = new SplayTreeSet<String>();
     _SimpleIdentifierRecursiveAstVisitor visitor =
         new _SimpleIdentifierRecursiveAstVisitor((SimpleIdentifier node) {
       Element element = node.staticElement;
-      if (namespace[node.name] == element) {
+      if (element != null && namespace[node.name] == element) {
         referencedNames.add(element.displayName);
       }
     });
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 00fb160..8b20c9a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -70,7 +70,7 @@
   static const CREATE_METHOD =
       const FixKind('CREATE_METHOD', 50, "Create method '{0}'");
   static const CREATE_MISSING_OVERRIDES =
-      const FixKind('CREATE_MISSING_OVERRIDES', 50, "Create %d missing override(s)");
+      const FixKind('CREATE_MISSING_OVERRIDES', 50, "Create {0} missing override(s)");
   static const CREATE_NO_SUCH_METHOD =
       const FixKind('CREATE_NO_SUCH_METHOD', 49, "Create 'noSuchMethod' method");
   static const CREATE_PART =
@@ -106,6 +106,10 @@
       const FixKind('REMOVE_UNUSED_IMPORT', 50, "Remove unused import");
   static const REPLACE_BOOLEAN_WITH_BOOL =
       const FixKind('REPLACE_BOOLEAN_WITH_BOOL', 50, "Replace 'boolean' with 'bool'");
+  static const REPLACE_IMPORT_URI =
+      const FixKind('REPLACE_IMPORT_URI', 50, "Replace with '{0}'");
+  static const REPLACE_VAR_WITH_DYNAMIC =
+      const FixKind('REPLACE_VAR_WITH_DYNAMIC', 50, "Replace 'var' with 'dynamic'");
   static const USE_CONST = const FixKind('USE_CONST', 50, "Change to constant");
   static const USE_EFFECTIVE_INTEGER_DIVISION =
       const FixKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 1cb09d5..08239cf 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -102,6 +102,22 @@
         CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE) {
       _addFix_replaceWithConstInstanceCreation();
     }
+    if (errorCode == CompileTimeErrorCode.INVALID_ANNOTATION) {
+      if (node is Annotation) {
+        Annotation annotation = node;
+        Identifier name = annotation.name;
+        if (name != null && name.staticElement == null) {
+          node = name;
+          if (annotation.arguments == null) {
+            _addFix_importLibrary_withTopLevelVariable();
+          } else {
+            _addFix_importLibrary_withType();
+            _addFix_createClass();
+            _addFix_undefinedClass_useSimilar();
+          }
+        }
+      }
+    }
     if (errorCode ==
         CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT) {
       _addFix_createConstructorSuperExplicit();
@@ -114,6 +130,9 @@
         CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT) {
       _addFix_createConstructorSuperExplicit();
     }
+    if (errorCode == CompileTimeErrorCode.URI_DOES_NOT_EXIST) {
+      _addFix_replaceImportUri();
+    }
     if (errorCode == HintCode.DIVISION_OPTIMIZATION) {
       _addFix_useEffectiveIntegerDivision();
     }
@@ -135,6 +154,9 @@
     if (errorCode == ParserErrorCode.GETTER_WITH_PARAMETERS) {
       _addFix_removeParameters_inGetterDeclaration();
     }
+    if (errorCode == ParserErrorCode.VAR_AS_TYPE_NAME) {
+      _addFix_replaceVarWithDynamic();
+    }
     if (errorCode == StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER) {
       _addFix_makeEnclosingClassAbstract();
     }
@@ -183,6 +205,10 @@
     if (errorCode == StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION) {
       _addFix_removeParentheses_inGetterInvocation();
     }
+    if (errorCode == StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT) {
+      _addFix_importLibrary_withType();
+      _addFix_createClass();
+    }
     if (errorCode == StaticTypeWarningCode.UNDEFINED_FUNCTION) {
       _addFix_importLibrary_withFunction();
       _addFix_undefinedFunction_useSimilar();
@@ -554,6 +580,7 @@
           argument = nameNode;
         }
       }
+      argument = stepUpNamedExpression(argument);
       // should be argument of some invocation
       ParameterElement parameterElement = argument.bestParameterElement;
       if (parameterElement == null) {
@@ -561,6 +588,10 @@
       }
       // should be parameter of function type
       DartType parameterType = parameterElement.type;
+      if (parameterType is InterfaceType && parameterType.isDartCoreFunction) {
+        ExecutableElement element = new MethodElementImpl('', -1);
+        parameterType = new FunctionTypeImpl.con1(element);
+      }
       if (parameterType is! FunctionType) {
         return;
       }
@@ -574,46 +605,77 @@
     }
   }
 
-  void
-      _addFix_createMissingOverrides(List<ExecutableElement> missingOverrides) {
-    // sort by name
-    missingOverrides.sort((Element firstElement, Element secondElement) {
-      return compareStrings(
-          firstElement.displayName,
-          secondElement.displayName);
+  void _addFix_createMissingOverrides(List<ExecutableElement> elements) {
+    elements = elements.toList();
+    int numElements = elements.length;
+    // sort by name, getters before setters
+    elements.sort((Element a, Element b) {
+      int names = compareStrings(a.displayName, b.displayName);
+      if (names != 0) {
+        return names;
+      }
+      if (a.kind == ElementKind.GETTER) {
+        return -1;
+      }
+      return 1;
     });
     ClassDeclaration targetClass = node.parent as ClassDeclaration;
     int insertOffset = targetClass.end - 1;
     SourceBuilder sb = new SourceBuilder(file, insertOffset);
-    // add elements
+    // EOL management
     bool isFirst = true;
-    for (ExecutableElement missingOverride in missingOverrides) {
+    void addEolIfNotFirst() {
       if (!isFirst || !targetClass.members.isEmpty) {
         sb.append(eol);
       }
-      _addFix_createMissingOverrides_single(sb, targetClass, missingOverride);
       isFirst = false;
     }
+    // merge getter/setter pairs into fields
+    for (int i = 0; i < elements.length; i++) {
+      ExecutableElement element = elements[i];
+      if (element.kind == ElementKind.GETTER && i + 1 < elements.length) {
+        ExecutableElement nextElement = elements[i + 1];
+        if (nextElement.kind == ElementKind.SETTER) {
+          // remove this and the next elements, adjust iterator
+          elements.removeAt(i + 1);
+          elements.removeAt(i);
+          i--;
+          numElements--;
+          // add field
+          addEolIfNotFirst();
+          sb.append(utils.getIndent(1));
+          _appendType(sb, element.type.returnType);
+          sb.append(element.name);
+          sb.append(';');
+          sb.append(eol);
+        }
+      }
+    }
+    // add elements
+    for (ExecutableElement element in elements) {
+      addEolIfNotFirst();
+      _addFix_createMissingOverrides_single(sb, targetClass, element);
+    }
     // add proposal
     exitPosition = new Position(file, insertOffset);
     _insertBuilder(sb);
-    _addFix(FixKind.CREATE_MISSING_OVERRIDES, [missingOverrides.length]);
+    _addFix(FixKind.CREATE_MISSING_OVERRIDES, [numElements]);
   }
 
   void _addFix_createMissingOverrides_single(SourceBuilder sb,
-      ClassDeclaration targetClass, ExecutableElement missingOverride) {
+      ClassDeclaration targetClass, ExecutableElement element) {
     // prepare environment
     String prefix = utils.getIndent(1);
     String prefix2 = utils.getIndent(2);
     // may be property
-    ElementKind elementKind = missingOverride.kind;
+    ElementKind elementKind = element.kind;
     bool isGetter = elementKind == ElementKind.GETTER;
     bool isSetter = elementKind == ElementKind.SETTER;
     bool isMethod = elementKind == ElementKind.METHOD;
-    bool isOperator = isMethod && (missingOverride as MethodElement).isOperator;
+    bool isOperator = isMethod && (element as MethodElement).isOperator;
     sb.append(prefix);
     if (isGetter) {
-      sb.append('// TODO: implement ${missingOverride.displayName}');
+      sb.append('// TODO: implement ${element.displayName}');
       sb.append(eol);
       sb.append(prefix);
     }
@@ -624,7 +686,7 @@
       sb.append(prefix);
     }
     // return type
-    _appendType(sb, missingOverride.type.returnType);
+    _appendType(sb, element.type.returnType);
     if (isGetter) {
       sb.append('get ');
     } else if (isSetter) {
@@ -633,18 +695,18 @@
       sb.append('operator ');
     }
     // name
-    sb.append(missingOverride.displayName);
+    sb.append(element.displayName);
     // parameters + body
     if (isGetter) {
       sb.append(' => null;');
     } else {
-      List<ParameterElement> parameters = missingOverride.parameters;
-      _appendParameters(sb, parameters, _getDefaultValueMap(parameters));
+      List<ParameterElement> parameters = element.parameters;
+      _appendParameters(sb, parameters);
       sb.append(' {');
       // TO-DO
       sb.append(eol);
       sb.append(prefix2);
-      sb.append('// TODO: implement ${missingOverride.displayName}');
+      sb.append('// TODO: implement ${element.displayName}');
       sb.append(eol);
       // close method
       sb.append(prefix);
@@ -954,6 +1016,39 @@
     _addFix(FixKind.REMOVE_UNUSED_IMPORT, []);
   }
 
+  void _addFix_replaceImportUri() {
+    if (node is SimpleStringLiteral) {
+      SimpleStringLiteral stringLiteral = node;
+      String uri = stringLiteral.value;
+      String uriName = substringAfterLast(uri, '/');
+      AnalysisContext context = unitLibraryElement.context;
+      for (Source libSource in context.librarySources) {
+        String libFile = libSource.fullName;
+        if (substringAfterLast(libFile, '/') == uriName) {
+          String fixedUri;
+          // may be "package:" URI
+          String libPackageUri = _findPackageUri(context, libFile);
+          if (libPackageUri != null) {
+            fixedUri = libPackageUri;
+          } else {
+            String relativeFile = relative(libFile, from: unitLibraryFolder);
+            fixedUri = split(relativeFile).join('/');
+          }
+          // add fix
+          SourceRange range = rf.rangeNode(node);
+          _addReplaceEdit(range, "'$fixedUri'");
+          _addFix(FixKind.REPLACE_IMPORT_URI, [fixedUri]);
+        }
+      }
+    }
+  }
+
+  void _addFix_replaceVarWithDynamic() {
+    SourceRange range = rf.rangeError(error);
+    _addReplaceEdit(range, "dynamic");
+    _addFix(FixKind.REPLACE_VAR_WITH_DYNAMIC, []);
+  }
+
   void _addFix_replaceWithConstInstanceCreation() {
     if (coveredNode is InstanceCreationExpression) {
       var instanceCreation = coveredNode as InstanceCreationExpression;
@@ -1443,8 +1538,7 @@
     sb.append(parameterSource);
   }
 
-  void _appendParameters(SourceBuilder sb, List<ParameterElement> parameters,
-      Map<ParameterElement, String> defaultValueMap) {
+  void _appendParameters(SourceBuilder sb, List<ParameterElement> parameters) {
     sb.append("(");
     bool firstParameter = true;
     bool sawNamed = false;
@@ -1472,16 +1566,14 @@
       // parameter
       _appendParameterSource(sb, parameter.type, parameter.name);
       // default value
-      if (defaultValueMap != null) {
-        String defaultSource = defaultValueMap[parameter];
-        if (defaultSource != null) {
-          if (sawPositional) {
-            sb.append(" = ");
-          } else {
-            sb.append(": ");
-          }
-          sb.append(defaultSource);
+      String defaultCode = parameter.defaultValueCode;
+      if (defaultCode != null) {
+        if (sawPositional) {
+          sb.append(" = ");
+        } else {
+          sb.append(": ");
         }
+        sb.append(defaultCode);
       }
     }
     // close parameters
@@ -1521,7 +1613,7 @@
       proposalNameBuffer.append(constructorName);
     }
     // parameters
-    _appendParameters(proposalNameBuffer, constructor.parameters, null);
+    _appendParameters(proposalNameBuffer, constructor.parameters);
     // done
     return proposalNameBuffer.toString();
   }
@@ -1543,27 +1635,6 @@
     return null;
   }
 
-  Map<ParameterElement, String>
-      _getDefaultValueMap(List<ParameterElement> parameters) {
-    Map<ParameterElement, String> defaultSourceMap = {};
-    Map<Source, String> sourceContentMap = {};
-    for (ParameterElement parameter in parameters) {
-      SourceRange valueRange = parameter.defaultValueRange;
-      if (valueRange != null) {
-        Source source = parameter.source;
-        String sourceContent = sourceContentMap[source];
-        if (sourceContent == null) {
-          sourceContent = getSourceContent(parameter.context, source);
-          sourceContentMap[source] = sourceContent;
-        }
-        String valueSource =
-            sourceContent.substring(valueRange.offset, valueRange.end);
-        defaultSourceMap[parameter] = valueSource;
-      }
-    }
-    return defaultSourceMap;
-  }
-
   /**
    * Returns an existing or just added [LinkedEditGroup] with [groupId].
    */
@@ -1803,7 +1874,6 @@
    * Returns the "package" URI, may be `null`.
    */
   static String _findPackageUri(AnalysisContext context, String path) {
-//    Source fileSource = new FileBasedSource.con1(path);
     Source fileSource = new NonExistingSource(path, UriKind.FILE_URI);
     Uri uri = context.sourceFactory.restoreUri(fileSource);
     if (uri == null) {
@@ -1831,6 +1901,9 @@
   static bool _mayBeTypeIdentifier(AstNode node) {
     if (node is SimpleIdentifier) {
       AstNode parent = node.parent;
+      if (parent is Annotation) {
+        return true;
+      }
       if (parent is TypeName) {
         return true;
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/strings.dart b/pkg/analysis_server/lib/src/services/correction/strings.dart
index ff5c495..53da60b 100644
--- a/pkg/analysis_server/lib/src/services/correction/strings.dart
+++ b/pkg/analysis_server/lib/src/services/correction/strings.dart
@@ -107,6 +107,16 @@
   return str.replaceAll(remove, '');
 }
 
+String removeEnd(String str, String remove) {
+  if (isEmpty(str) || isEmpty(remove)) {
+    return str;
+  }
+  if (str.endsWith(remove)) {
+    return str.substring(0, str.length - remove.length);
+  }
+  return str;
+}
+
 String removeStart(String str, String remove) {
   if (isEmpty(str) || isEmpty(remove)) {
     return str;
@@ -125,3 +135,22 @@
   }
   return sb.toString();
 }
+
+
+/**
+ * Gets the substring after the last occurrence of a separator.
+ * The separator is not returned.
+ */
+String substringAfterLast(String str, String separator) {
+  if (isEmpty(str)) {
+    return str;
+  }
+  if (isEmpty(separator)) {
+    return '';
+  }
+  int pos = str.lastIndexOf(separator);
+  if (pos == -1) {
+    return str;
+  }
+  return str.substring(pos + separator.length);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index fdec5b8..d7a7bf5 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -459,6 +459,21 @@
 }
 
 
+/**
+ * If the given [expression] is the `expression` property of a [NamedExpression]
+ * then returns this [NamedExpression]. Otherwise returns [expression].
+ */
+Expression stepUpNamedExpression(Expression expression) {
+  if (expression != null) {
+    AstNode parent = expression.parent;
+    if (parent is NamedExpression && parent.expression == expression) {
+      return parent;
+    }
+  }
+  return expression;
+}
+
+
 class CorrectionUtils {
   final CompilationUnit unit;
 
diff --git a/pkg/analysis_server/lib/src/services/index/store/split_store.dart b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
index 0ba0702..1db798d 100644
--- a/pkg/analysis_server/lib/src/services/index/store/split_store.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
@@ -258,12 +258,11 @@
    */
   List<Location> getRelationships(Element element, Relationship relationship) {
     // prepare key
-    RelationKeyData key =
-        new RelationKeyData.forObject(
-            _elementCodec,
-            _relationshipCodec,
-            element,
-            relationship);
+    RelationKeyData key = new RelationKeyData.forObject(
+        _elementCodec,
+        _relationshipCodec,
+        element,
+        relationship);
     // find LocationData(s)
     List<LocationData> locationDatas = _relations[key];
     if (locationDatas == null) {
@@ -289,12 +288,11 @@
    */
   void recordRelationship(Element element, Relationship relationship,
       Location location) {
-    RelationKeyData key =
-        new RelationKeyData.forObject(
-            _elementCodec,
-            _relationshipCodec,
-            element,
-            relationship);
+    RelationKeyData key = new RelationKeyData.forObject(
+        _elementCodec,
+        _relationshipCodec,
+        element,
+        relationship);
     // prepare LocationData(s)
     List<LocationData> locationDatas = _relations[key];
     if (locationDatas == null) {
@@ -462,8 +460,7 @@
    *
    * Order of keys: contextId, nodeId, Relationship.
    */
-  Map<int, Map<int, Map<Relationship, List<LocationData>>>>
-      _contextNodeRelations =
+  Map<int, Map<int, Map<Relationship, List<LocationData>>>> _contextNodeRelations =
       new HashMap<int, Map<int, Map<Relationship, List<LocationData>>>>();
 
   /**
@@ -495,7 +492,8 @@
    * A table mapping element names to the node names that may have relations with elements with
    * these names.
    */
-  IntToIntSetMap _nameToNodeNames = new IntToIntSetMap();
+  Map<Relationship, IntToIntSetMap> _relToNameMap =
+      new HashMap<Relationship, IntToIntSetMap>();
 
   /**
    * The [NodeManager] to get/put [IndexNode]s.
@@ -519,8 +517,19 @@
   }
 
   @override
-  String get statistics =>
-      '[${_nodeManager.locationCount} locations, ${_sources.length} sources, ${_nameToNodeNames.length} names]';
+  String get statistics {
+    StringBuffer buf = new StringBuffer();
+    buf.write('[');
+    buf.write(_nodeManager.locationCount);
+    buf.write(' locations, ');
+    buf.write(_sources.length);
+    buf.write(' sources, ');
+    int namesCount = _relToNameMap.values.fold(0, (c, m) => c + m.length);
+    buf.write(namesCount);
+    buf.write(' names');
+    buf.write(']');
+    return buf.toString();
+  }
 
   @override
   bool aboutToIndexDart(AnalysisContext context,
@@ -618,7 +627,7 @@
   void clear() {
     _contextNodeRelations.clear();
     _nodeManager.clear();
-    _nameToNodeNames.clear();
+    _relToNameMap.clear();
   }
 
   @override
@@ -640,8 +649,16 @@
       return new Future.value(locations);
     }
     // prepare node names
-    int nameId = _elementCodec.encodeHash(element);
-    List<int> nodeNameIds = _nameToNodeNames.get(nameId);
+    List<int> nodeNameIds;
+    {
+      int nameId = _elementCodec.encodeHash(element);
+      IntToIntSetMap nameToNodeNames = _relToNameMap[relationship];
+      if (nameToNodeNames != null) {
+        nodeNameIds = nameToNodeNames.get(nameId);
+      } else {
+        nodeNameIds = <int>[];
+      }
+    }
     // prepare Future(s) for reading each IndexNode
     List<Future<List<Location>>> nodeFutures = <Future<List<Location>>>[];
     for (int nodeNameId in nodeNameIds) {
@@ -678,7 +695,7 @@
       return;
     }
     // other elements
-    _recordNodeNameForElement(element);
+    _recordNodeNameForElement(element, relationship);
     _currentNode.recordRelationship(element, relationship, location);
   }
 
@@ -756,8 +773,6 @@
     }
   }
 
-  String _getElementName(Element element) => element.name;
-
   List<Location> _getRelationshipsUniverse(Relationship relationship) {
     List<Location> locations = <Location>[];
     _contextNodeRelations.forEach((contextId, contextRelations) {
@@ -796,9 +811,14 @@
     units.add(unit);
   }
 
-  void _recordNodeNameForElement(Element element) {
+  void _recordNodeNameForElement(Element element, Relationship relationship) {
+    IntToIntSetMap nameToNodeNames = _relToNameMap[relationship];
+    if (nameToNodeNames == null) {
+      nameToNodeNames = new IntToIntSetMap();
+      _relToNameMap[relationship] = nameToNodeNames;
+    }
     int nameId = _elementCodec.encodeHash(element);
-    _nameToNodeNames.add(nameId, _currentNodeNameId);
+    nameToNodeNames.add(nameId, _currentNodeNameId);
   }
 
   void _recordRelationshipUniverse(Relationship relationship,
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index ba189d2..0bbda87 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -129,22 +129,52 @@
     {
       String declarationSource;
       if (stringLiteralPart != null) {
-        declarationSource = "var ${name} = '${stringLiteralPart}';";
+        declarationSource = "var $name = '$stringLiteralPart';";
       } else {
         String keyword = _declarationKeyword;
         String initializerSource = utils.getRangeText(selectionRange);
-        declarationSource = "${keyword} ${name} = ${initializerSource};";
+        declarationSource = "$keyword $name = $initializerSource;";
       }
-      // prepare location for declaration
-      Statement targetStatement = _findTargetStatement(occurrences);
-      String prefix = utils.getNodePrefix(targetStatement);
-      // insert variable declaration
       String eol = utils.endOfLine;
-      SourceEdit edit = new SourceEdit(
-          targetStatement.offset,
-          0,
-          '${declarationSource}${eol}${prefix}');
-      change.addEdit(file, edit);
+      // prepare location for declaration
+      AstNode target_;
+      {
+        List<AstNode> nodes = _findNodes(occurrences);
+        AstNode commonParent = getNearestCommonAncestor(nodes);
+        if (commonParent is Block) {
+          List<AstNode> firstParents = getParents(nodes[0]);
+          int commonIndex = firstParents.indexOf(commonParent);
+          target_ = firstParents[commonIndex + 1];
+        } else {
+          target_ = _getEnclosingExpressionBody(commonParent);
+          if (target_ == null) {
+            target_ = commonParent.getAncestor((node) => node is Statement);
+          }
+        }
+      }
+      AstNode target = target_;
+      // insert variable declaration
+      if (target is Statement) {
+        String prefix = utils.getNodePrefix(target);
+        SourceEdit edit =
+            new SourceEdit(target.offset, 0, declarationSource + eol + prefix);
+        change.addEdit(file, edit);
+      } else if (target is ExpressionFunctionBody) {
+        String prefix = utils.getNodePrefix(target.parent);
+        String indent = utils.getIndent(1);
+        String declStatement = prefix + indent + declarationSource + eol;
+        String exprStatement = prefix + indent + 'return ';
+        Expression expr = target.expression;
+        change.addEdit(
+            file,
+            new SourceEdit(
+                target.offset,
+                expr.offset - target.offset,
+                '{' + eol + declStatement + exprStatement));
+        change.addEdit(
+            file,
+            new SourceEdit(expr.end, 0, ';' + eol + prefix + '}'));
+      }
     }
     // prepare replacement
     String occurrenceReplacement = name;
@@ -241,19 +271,20 @@
   }
 
   /**
-   * Returns the [Statement] such that variable declaration added before it is
-   * visible at all given occurrences.
+   * Returns the [ExpressionFunctionBody] that encloses [node], or `null`
+   * if [node] is not enclosed with an [ExpressionFunctionBody].
    */
-  Statement _findTargetStatement(List<SourceRange> occurrences) {
-    List<AstNode> nodes = _findNodes(occurrences);
-    List<AstNode> firstParents = getParents(nodes[0]);
-    AstNode commonParent = getNearestCommonAncestor(nodes);
-    if (commonParent is Block) {
-      int commonIndex = firstParents.indexOf(commonParent);
-      return firstParents[commonIndex + 1] as Statement;
-    } else {
-      return commonParent.getAncestor((node) => node is Statement);
+  ExpressionFunctionBody _getEnclosingExpressionBody(AstNode node) {
+    while (node != null) {
+      if (node is Statement) {
+        return null;
+      }
+      if (node is ExpressionFunctionBody) {
+        return node;
+      }
+      node = node.parent;
     }
+    return null;
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 42316c2..1008e65 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analysis_server/src/services/correction/source_range.dart';
 import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/correction/strings.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
@@ -178,6 +179,7 @@
   bool inlineAll = true;
 
   ExecutableElement _methodElement;
+  bool _isAccessor;
   String _methodFile;
   CompilationUnit _methodUnit;
   CorrectionUtils _methodUtils;
@@ -300,48 +302,53 @@
     _methodBody = null;
     deleteSource = false;
     inlineAll = false;
+    // prepare for failure
+    RefactoringStatus fatalStatus = new RefactoringStatus.fatal(
+        'Method declaration or reference must be selected to activate this refactoring.');
     // prepare selected SimpleIdentifier
-    AstNode selectedNode = new NodeLocator.con1(offset).searchWithin(unit);
-    if (selectedNode is! SimpleIdentifier) {
-      return new RefactoringStatus.fatal(
-          'Method declaration or reference must be selected to activate this refactoring.');
+    AstNode node = new NodeLocator.con1(offset).searchWithin(unit);
+    if (node is! SimpleIdentifier) {
+      return fatalStatus;
     }
-    SimpleIdentifier selectedIdentifier = selectedNode as SimpleIdentifier;
+    SimpleIdentifier identifier = node as SimpleIdentifier;
     // prepare selected ExecutableElement
-    Element selectedElement = selectedIdentifier.bestElement;
-    if (selectedElement is! ExecutableElement) {
-      return new RefactoringStatus.fatal(
-          'Method declaration or reference must be selected to activate this refactoring.');
+    Element element = identifier.bestElement;
+    if (element is! ExecutableElement) {
+      return fatalStatus;
     }
-    _methodElement = selectedElement as ExecutableElement;
+    _methodElement = element as ExecutableElement;
+    _isAccessor = element is PropertyAccessorElement;
     _methodFile = _methodElement.source.fullName;
-    _methodUnit = selectedElement.unit;
+    _methodUnit = element.unit;
     _methodUtils = new CorrectionUtils(_methodUnit);
-    if (selectedElement is MethodElement ||
-        selectedElement is PropertyAccessorElement) {
-      MethodDeclaration methodDeclaration =
-          _methodElement.node as MethodDeclaration;
+    // class member
+    bool isClassMember = element.enclosingElement is ClassElement;
+    if (element is MethodElement || _isAccessor && isClassMember) {
+      MethodDeclaration methodDeclaration = element.node;
       _methodNode = methodDeclaration;
       _methodParameters = methodDeclaration.parameters;
       _methodBody = methodDeclaration.body;
       // prepare mode
-      isDeclaration = selectedNode == methodDeclaration.name;
+      isDeclaration = node == methodDeclaration.name;
       deleteSource = isDeclaration;
       inlineAll = deleteSource;
+      return new RefactoringStatus();
     }
-    if (selectedElement is FunctionElement) {
-      FunctionDeclaration functionDeclaration =
-          _methodElement.node as FunctionDeclaration;
+    // unit member
+    bool isUnitMember = element.enclosingElement is CompilationUnitElement;
+    if (element is FunctionElement || _isAccessor && isUnitMember) {
+      FunctionDeclaration functionDeclaration = element.node;
       _methodNode = functionDeclaration;
       _methodParameters = functionDeclaration.functionExpression.parameters;
       _methodBody = functionDeclaration.functionExpression.body;
       // prepare mode
-      isDeclaration = selectedNode == functionDeclaration.name;
+      isDeclaration = node == functionDeclaration.name;
       deleteSource = isDeclaration;
       inlineAll = deleteSource;
+      return new RefactoringStatus();
     }
     // OK
-    return new RefactoringStatus();
+    return fatalStatus;
   }
 
   /**
@@ -400,7 +407,7 @@
 
   String _refFile;
   CorrectionUtils _refUtils;
-  AstNode _node;
+  SimpleIdentifier _node;
   SourceRange _refLineRange;
   String _refPrefix;
 
@@ -464,23 +471,23 @@
     return false;
   }
 
-  void _inlineMethodInvocation(RefactoringStatus status, Expression methodUsage,
+  void _inlineMethodInvocation(RefactoringStatus status, Expression usage,
       bool cascaded, Expression target, List<Expression> arguments) {
     // we don't support cascade
     if (cascaded) {
       status.addError(
           'Cannot inline cascade invocation.',
-          new Location.fromNode(methodUsage));
+          new Location.fromNode(usage));
     }
     // can we inline method body into "methodUsage" block?
-    if (_canInlineBody(methodUsage)) {
+    if (_canInlineBody(usage)) {
       // insert non-return statements
       if (ref._methodStatementsPart != null) {
         // prepare statements source for invocation
         String source = _getMethodSourceForInvocation(
             ref._methodStatementsPart,
             _refUtils,
-            methodUsage,
+            usage,
             target,
             arguments);
         source = _refUtils.replaceSourceIndent(
@@ -498,15 +505,15 @@
         String source = _getMethodSourceForInvocation(
             ref._methodExpressionPart,
             _refUtils,
-            methodUsage,
+            usage,
             target,
             arguments);
         if (getExpressionPrecedence(ref._methodExpression) <
-            getExpressionParentPrecedence(methodUsage)) {
+            getExpressionParentPrecedence(usage)) {
           source = "(${source})";
         }
         // do replace
-        SourceRange methodUsageRange = rangeNode(methodUsage);
+        SourceRange methodUsageRange = rangeNode(usage);
         SourceEdit edit = new SourceEdit.range(methodUsageRange, source);
         ref.change.addEdit(_refFile, edit);
       } else {
@@ -558,31 +565,30 @@
       }
       // PropertyAccessorElement
       if (ref._methodElement is PropertyAccessorElement) {
+        Expression usage = _node;
         Expression target = null;
         bool cascade = false;
         if (nodeParent is PrefixedIdentifier) {
           PrefixedIdentifier propertyAccess = nodeParent;
+          usage = propertyAccess;
           target = propertyAccess.prefix;
           cascade = false;
         }
         if (nodeParent is PropertyAccess) {
           PropertyAccess propertyAccess = nodeParent;
+          usage = propertyAccess;
           target = propertyAccess.realTarget;
           cascade = propertyAccess.isCascaded;
         }
         // prepare arguments
         List<Expression> arguments = [];
-        if ((_node as SimpleIdentifier).inSetterContext()) {
-          arguments.add(
-              (nodeParent.parent as AssignmentExpression).rightHandSide);
+        if (_node.inSetterContext()) {
+          AssignmentExpression assignment =
+              _node.getAncestor((node) => node is AssignmentExpression);
+          arguments.add(assignment.rightHandSide);
         }
         // inline body
-        _inlineMethodInvocation(
-            status,
-            nodeParent as Expression,
-            cascade,
-            target,
-            arguments);
+        _inlineMethodInvocation(status, usage, cascade, target, arguments);
         return;
       }
       // not invocation, just reference to function
@@ -595,6 +601,7 @@
         source =
             _refUtils.replaceSourceIndent(source, methodPrefix, _refPrefix);
         source = source.trim();
+        source = removeEnd(source, ';');
       }
       // do insert
       SourceRange range = rangeNode(_node);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
index 2e815fa..8e3539f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
@@ -114,6 +114,16 @@
  *   WARNING if the name is discouraged;
  *   ERROR if the name is illegal.
  */
+RefactoringStatus validateLabelName(String name) {
+  return _validateLowerCamelCase(name, "Label");
+}
+
+/**
+ * Returns the [RefactoringStatus] with severity:
+ *   OK if the name is valid;
+ *   WARNING if the name is discouraged;
+ *   ERROR if the name is illegal.
+ */
 RefactoringStatus validateLibraryName(String name) {
   // null
   if (name == null) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index fac12c1..25f76e9 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -16,6 +16,7 @@
 import 'package:analysis_server/src/services/refactoring/rename_class_member.dart';
 import 'package:analysis_server/src/services/refactoring/rename_constructor.dart';
 import 'package:analysis_server/src/services/refactoring/rename_import.dart';
+import 'package:analysis_server/src/services/refactoring/rename_label.dart';
 import 'package:analysis_server/src/services/refactoring/rename_library.dart';
 import 'package:analysis_server/src/services/refactoring/rename_local.dart';
 import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
@@ -321,6 +322,9 @@
     if (element is ImportElement) {
       return new RenameImportRefactoringImpl(searchEngine, element);
     }
+    if (element is LabelElement) {
+      return new RenameLabelRefactoringImpl(searchEngine, element);
+    }
     if (element is LibraryElement) {
       return new RenameLibraryRefactoringImpl(searchEngine, element);
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index a2a143d..9491930 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -238,7 +238,8 @@
     if (element is ClassMemberElement) {
       return getHierarchyMembers(
           searchEngine,
-          element).then((Set<Element> elements) {
+          element,
+          false).then((Set<Element> elements) {
         this.elements = elements;
       });
     } else {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
new file mode 100644
index 0000000..9824b0e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.refactoring.rename_label;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/rename.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+
+/**
+ * A [Refactoring] for renaming [LabelElement]s.
+ */
+class RenameLabelRefactoringImpl extends RenameRefactoringImpl {
+  RenameLabelRefactoringImpl(SearchEngine searchEngine, LabelElement element)
+      : super(searchEngine, element);
+
+  @override
+  LabelElement get element => super.element as LabelElement;
+
+  @override
+  String get refactoringName => "Rename Label";
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    return new Future.value(result);
+  }
+
+  @override
+  RefactoringStatus checkNewName() {
+    RefactoringStatus result = super.checkNewName();
+    result.addStatus(validateLabelName(newName));
+    return result;
+  }
+
+  @override
+  Future<SourceChange> createChange() {
+    SourceChange change = new SourceChange(refactoringName);
+    // update declaration
+    addDeclarationEdit(change, element);
+    // update references
+    return searchEngine.searchReferences(element).then((refMatches) {
+      List<SourceReference> references = getSourceReferences(refMatches);
+      for (SourceReference reference in references) {
+        addReferenceEdit(change, reference);
+      }
+      return change;
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index 906a700..9e1ab32 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -103,7 +103,7 @@
 }
 
 
-class _ConflictValidatorVisitor extends RecursiveAstVisitor<Object> {
+class _ConflictValidatorVisitor extends RecursiveAstVisitor {
   final RenameLocalRefactoringImpl refactoring;
   final RefactoringStatus result;
   final SourceRange elementRange;
@@ -111,7 +111,7 @@
   _ConflictValidatorVisitor(this.refactoring, this.result, this.elementRange);
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  visitSimpleIdentifier(SimpleIdentifier node) {
     Element nodeElement = node.bestElement;
     String newName = refactoring.newName;
     if (nodeElement != null && nodeElement.name == newName) {
@@ -120,10 +120,12 @@
         String nodeKind = nodeElement.kind.displayName;
         String message = "Duplicate ${nodeKind} '$newName'.";
         result.addError(message, new Location.fromElement(nodeElement));
-        return null;
+        return;
       }
       // shadowing referenced element
-      if (elementRange.contains(node.offset) && !node.isQualified) {
+      if (elementRange.contains(node.offset) &&
+          !node.isQualified &&
+          !_isNamedExpressionName(node)) {
         nodeElement = getSyntheticAccessorVariable(nodeElement);
         String nodeKind = nodeElement.kind.displayName;
         String nodeName = getElementQualifiedName(nodeElement);
@@ -135,6 +137,9 @@
         result.addError(message, new Location.fromNode(node));
       }
     }
-    return null;
+  }
+
+  static bool _isNamedExpressionName(SimpleIdentifier node) {
+    return node.parent is Label && node.parent.parent is NamedExpression;
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index bcc8092..729792c 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -74,11 +74,11 @@
 
 
 /**
- * @return all implementations of the given {@link ClassMemberElement} is its superclasses and
- *         their subclasses.
+ * Returns all the declarations of the given [ClassMemberElement] in
+ * superclasses of the declaring class, and its subclasses if not [onlySuper].
  */
 Future<Set<ClassMemberElement>> getHierarchyMembers(SearchEngine searchEngine,
-    ClassMemberElement member) {
+    ClassMemberElement member, bool onlySuper) {
   Set<ClassMemberElement> result = new HashSet<ClassMemberElement>();
   // constructor
   if (member is ConstructorElement) {
@@ -92,21 +92,22 @@
   Set<ClassElement> searchClasses = getSuperClasses(memberClass);
   searchClasses.add(memberClass);
   for (ClassElement superClass in searchClasses) {
+    List<Element> superClassMembers = getChildren(superClass, name);
     // ignore if super- class does not declare member
-    if (getClassMembers(superClass, name).isEmpty) {
+    if (superClassMembers.isEmpty) {
+      continue;
+    }
+    // add super- class members
+    _addClassMembers(result, superClassMembers);
+    if (onlySuper) {
       continue;
     }
     // check all sub- classes
     var subClassFuture = getSubClasses(searchEngine, superClass);
     var membersFuture = subClassFuture.then((Set<ClassElement> subClasses) {
-      subClasses.add(superClass);
       for (ClassElement subClass in subClasses) {
         List<Element> subClassMembers = getChildren(subClass, name);
-        for (Element member in subClassMembers) {
-          if (member is ClassMemberElement) {
-            result.add(member);
-          }
-        }
+        _addClassMembers(result, subClassMembers);
       }
     });
     futures.add(membersFuture);
@@ -116,6 +117,17 @@
   });
 }
 
+/**
+ * Adds [ClassMemberElement]s from [elements] to [result].
+ */
+void _addClassMembers(Set<ClassMemberElement> result, List<Element> elements) {
+  for (Element member in elements) {
+    if (member is ClassMemberElement) {
+      result.add(member);
+    }
+  }
+}
+
 
 /**
  * Returns non-synthetic members of the given [ClassElement] and its super
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index bc49db0..712d8a4 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -81,6 +81,8 @@
           element as PropertyAccessorElement);
     } else if (element.kind == ElementKind.IMPORT) {
       return _searchReferences_Import(element as ImportElement);
+    } else if (element.kind == ElementKind.LABEL) {
+      return _searchReferences_Label(element as LabelElement);
     } else if (element.kind == ElementKind.LIBRARY) {
       return _searchReferences_Library(element as LibraryElement);
     } else if (element.kind == ElementKind.LOCAL_VARIABLE) {
@@ -142,7 +144,6 @@
 
   Future<List<SearchMatch>>
       _searchReferences_CompilationUnit(CompilationUnitElement unit) {
-    // TODO(merge?)
     _Requestor requestor = new _Requestor(_index);
     requestor.add(unit, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
     return requestor.merge();
@@ -206,6 +207,15 @@
     return requestor.merge();
   }
 
+  Future<List<SearchMatch>> _searchReferences_Label(LabelElement variable) {
+    _Requestor requestor = new _Requestor(_index);
+    requestor.add(
+        variable,
+        IndexConstants.IS_REFERENCED_BY,
+        MatchKind.REFERENCE);
+    return requestor.merge();
+  }
+
   Future<List<SearchMatch>> _searchReferences_Library(LibraryElement library) {
     _Requestor requestor = new _Requestor(_index);
     requestor.add(
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 4843c93..beb2d68 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,7 +6,7 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: '0.23.0-dev.1'
+  analyzer: '0.23.0-dev.4'
   args: any
   logging: any
   path: any
diff --git a/pkg/analysis_server/test/analysis/reanalyze_test.dart b/pkg/analysis_server/test/analysis/reanalyze_test.dart
new file mode 100644
index 0000000..181b49f
--- /dev/null
+++ b/pkg/analysis_server/test/analysis/reanalyze_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.analysis.reanalyze;
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:unittest/unittest.dart';
+
+import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(ReanalyzeTest);
+}
+
+
+@ReflectiveTestCase()
+class ReanalyzeTest extends AbstractAnalysisTest {
+  test_reanalyze() {
+    createProject();
+    List<AnalysisContext> contexts = server.folderMap.values.toList();
+    expect(contexts, hasLength(1));
+    AnalysisContext oldContext = contexts[0];
+    // Reanalyze should cause a brand new context to be built.
+    Request request = new Request("0", ANALYSIS_REANALYZE);
+    handleSuccessfulRequest(request);
+    contexts = server.folderMap.values.toList();
+    expect(contexts, hasLength(1));
+    AnalysisContext newContext = contexts[0];
+    expect(newContext, isNot(same(oldContext)));
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/analysis_notification_highlights_test.dart b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
index d4ecdde3..721d72e 100644
--- a/pkg/analysis_server/test/analysis_notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
@@ -8,10 +8,10 @@
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
 import 'analysis_abstract.dart';
+import 'reflective_tests.dart';
 
 
 main() {
@@ -37,7 +37,8 @@
             '${regions.join('\n')}');
   }
 
-  void assertHasRegion(HighlightRegionType type, String search, [int length = -1]) {
+  void assertHasRegion(HighlightRegionType type, String search, [int length =
+      -1]) {
     int offset = findOffset(search);
     length = findRegionLength(search, length);
     assertHasRawRegion(type, offset, length);
@@ -62,7 +63,8 @@
   }
 
 
-  void assertNoRegion(HighlightRegionType type, String search, [int length = -1]) {
+  void assertNoRegion(HighlightRegionType type, String search, [int length =
+      -1]) {
     int offset = findOffset(search);
     length = findRegionLength(search, length);
     assertNoRawRegion(type, offset, length);
@@ -343,7 +345,10 @@
 }''');
     _addLibraryForTestPart();
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightRegionType.BUILT_IN, 'part of', 'part of'.length);
+      assertHasRegion(
+          HighlightRegionType.BUILT_IN,
+          'part of',
+          'part of'.length);
       assertNoRegion(HighlightRegionType.BUILT_IN, 'part = 1');
       assertNoRegion(HighlightRegionType.BUILT_IN, 'of = 2');
     });
@@ -483,8 +488,12 @@
 ''');
     return prepareHighlights().then((_) {
       assertHasStringRegion(HighlightRegionType.DIRECTIVE, "library lib;");
-      assertHasStringRegion(HighlightRegionType.DIRECTIVE, "import 'dart:math';");
-      assertHasStringRegion(HighlightRegionType.DIRECTIVE, "export 'dart:math';");
+      assertHasStringRegion(
+          HighlightRegionType.DIRECTIVE,
+          "import 'dart:math';");
+      assertHasStringRegion(
+          HighlightRegionType.DIRECTIVE,
+          "export 'dart:math';");
       assertHasStringRegion(HighlightRegionType.DIRECTIVE, "part 'part.dart';");
     });
   }
@@ -706,6 +715,21 @@
     });
   }
 
+  test_LABEL() {
+    addTestFile('''
+main() {
+myLabel:
+  while (true) {
+    break myLabel;
+  }
+}
+''');
+    return prepareHighlights().then((_) {
+      assertHasRegion(HighlightRegionType.LABEL, 'myLabel:');
+      assertHasRegion(HighlightRegionType.LABEL, 'myLabel;');
+    });
+  }
+
   test_LITERAL_BOOLEAN() {
     addTestFile('var V = true;');
     return prepareHighlights().then((_) {
@@ -746,7 +770,10 @@
   test_LITERAL_STRING() {
     addTestFile('var V = "abc";');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightRegionType.LITERAL_STRING, '"abc";', '"abc"'.length);
+      assertHasRegion(
+          HighlightRegionType.LITERAL_STRING,
+          '"abc";',
+          '"abc"'.length);
     });
   }
 
@@ -759,7 +786,9 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
+      assertHasRegion(
+          HighlightRegionType.LOCAL_VARIABLE_DECLARATION,
+          'vvv = 0');
       assertHasRegion(HighlightRegionType.LOCAL_VARIABLE, 'vvv;');
       assertHasRegion(HighlightRegionType.LOCAL_VARIABLE, 'vvv = 1;');
     });
@@ -780,7 +809,9 @@
 ''');
     return prepareHighlights().then((_) {
       assertHasRegion(HighlightRegionType.METHOD_DECLARATION, 'aaa() {}');
-      assertHasRegion(HighlightRegionType.METHOD_DECLARATION_STATIC, 'bbb() {}');
+      assertHasRegion(
+          HighlightRegionType.METHOD_DECLARATION_STATIC,
+          'bbb() {}');
       assertHasRegion(HighlightRegionType.METHOD, 'aaa();');
       assertHasRegion(HighlightRegionType.METHOD, 'aaa;');
       assertHasRegion(HighlightRegionType.METHOD_STATIC, 'bbb();');
@@ -845,7 +876,9 @@
 ''');
     return prepareHighlights().then((_) {
       assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV = 0');
-      assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV // annotation');
+      assertHasRegion(
+          HighlightRegionType.TOP_LEVEL_VARIABLE,
+          'VVV // annotation');
       assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV);');
       assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV = 1');
     });
@@ -890,16 +923,16 @@
 
 @ReflectiveTestCase()
 class HighlightTypeTest {
-  void test_toString() {
-    expect(HighlightRegionType.CLASS.toString(), 'HighlightRegionType.CLASS');
-  }
-
   void test_constructor() {
     expect(
         HighlightRegionType.CLASS,
         new HighlightRegionType(HighlightRegionType.CLASS.name));
   }
 
+  void test_toString() {
+    expect(HighlightRegionType.CLASS.toString(), 'HighlightRegionType.CLASS');
+  }
+
   void test_valueOf_unknown() {
     expect(() {
       new HighlightRegionType('no-such-type');
diff --git a/pkg/analysis_server/test/analysis_notification_navigation_test.dart b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
index e05cee6..6a1ddea 100644
--- a/pkg/analysis_server/test/analysis_notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
@@ -8,10 +8,10 @@
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
 import 'analysis_abstract.dart';
+import 'reflective_tests.dart';
 
 
 main() {
@@ -43,7 +43,7 @@
     }
     fail(
         'Expected to find target (file=$file; offset=$offset; length=$length) in\n'
-            '${testRegion} in\n' '${regions.join('\n')}');
+            '${testRegion} in\n' '${testTargets.join('\n')}');
   }
 
   void assertHasOperatorRegion(String regionSearch, int regionLength,
@@ -268,7 +268,7 @@
 }
 ''');
     return prepareNavigation().then((_) {
-      assertHasRegionString('new A');
+      findRegion(findOffset('new A'), 'new A'.length, true);
       assertHasTarget('A {');
     });
   }
@@ -283,8 +283,18 @@
 }
 ''');
     return prepareNavigation().then((_) {
-      assertHasRegionString('new A.named');
-      assertHasTarget('named() {}');
+      {
+        findRegion(findOffset('new '), 'new '.length, true);
+        assertHasTarget('named() {}');
+      }
+      {
+        findRegion(findOffset('A.named();'), 'A'.length, true);
+        assertHasTarget('A {');
+      }
+      {
+        findRegion(findOffset('.named();'), '.named'.length, true);
+        assertHasTarget('named() {}');
+      }
     });
   }
 
@@ -298,8 +308,14 @@
 }
 ''');
     return prepareNavigation().then((_) {
-      assertHasRegionString('new A');
-      assertHasTarget("A() {}", 0);
+      {
+        findRegion(findOffset('new '), 'new '.length, true);
+        assertHasTarget('A() {}', 0);
+      }
+      {
+        findRegion(findOffset('A();'), 'A'.length, true);
+        assertHasTarget('A {');
+      }
     });
   }
 
diff --git a/pkg/analysis_server/test/computer/element_test.dart b/pkg/analysis_server/test/computer/element_test.dart
index 2b26ffd..5539c22 100644
--- a/pkg/analysis_server/test/computer/element_test.dart
+++ b/pkg/analysis_server/test/computer/element_test.dart
@@ -5,14 +5,15 @@
 library test.computer.element;
 
 import 'package:analysis_server/src/protocol.dart';
-import '../abstract_context.dart';
-import '../reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart' as engine;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
 import 'package:unittest/unittest.dart';
 
+import '../abstract_context.dart';
+import '../reflective_tests.dart';
+
 
 
 main() {
@@ -46,6 +47,9 @@
         new ElementKind.fromEngine(engine.ElementKind.GETTER),
         ElementKind.GETTER);
     expect(
+        new ElementKind.fromEngine(engine.ElementKind.LABEL),
+        ElementKind.LABEL);
+    expect(
         new ElementKind.fromEngine(engine.ElementKind.LIBRARY),
         ElementKind.LIBRARY);
     expect(
@@ -83,9 +87,7 @@
         new ElementKind(ElementKind.CONSTRUCTOR.name),
         ElementKind.CONSTRUCTOR);
     expect(new ElementKind(ElementKind.FIELD.name), ElementKind.FIELD);
-    expect(
-        new ElementKind(ElementKind.FUNCTION.name),
-        ElementKind.FUNCTION);
+    expect(new ElementKind(ElementKind.FUNCTION.name), ElementKind.FUNCTION);
     expect(
         new ElementKind(ElementKind.FUNCTION_TYPE_ALIAS.name),
         ElementKind.FUNCTION_TYPE_ALIAS);
@@ -95,9 +97,7 @@
         new ElementKind(ElementKind.LOCAL_VARIABLE.name),
         ElementKind.LOCAL_VARIABLE);
     expect(new ElementKind(ElementKind.METHOD.name), ElementKind.METHOD);
-    expect(
-        new ElementKind(ElementKind.PARAMETER.name),
-        ElementKind.PARAMETER);
+    expect(new ElementKind(ElementKind.PARAMETER.name), ElementKind.PARAMETER);
     expect(new ElementKind(ElementKind.SETTER.name), ElementKind.SETTER);
     expect(
         new ElementKind(ElementKind.TOP_LEVEL_VARIABLE.name),
@@ -119,7 +119,8 @@
 
   void test_toString() {
     expect(ElementKind.CLASS.toString(), 'ElementKind.CLASS');
-    expect(ElementKind.COMPILATION_UNIT.toString(),
+    expect(
+        ElementKind.COMPILATION_UNIT.toString(),
         'ElementKind.COMPILATION_UNIT');
   }
 }
@@ -229,6 +230,33 @@
     expect(element.flags, 0);
   }
 
+  void test_fromElement_LABEL() {
+    Source source = addSource('/test.dart', '''
+main() {
+myLabel:
+  while (true) {
+    break myLabel;
+  }
+}''');
+    CompilationUnit unit = resolveLibraryUnit(source);
+    engine.LabelElement engineElement = findElementInUnit(unit, 'myLabel');
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.LABEL);
+    expect(element.name, 'myLabel');
+    {
+      Location location = element.location;
+      expect(location.file, '/test.dart');
+      expect(location.offset, 9);
+      expect(location.length, 'myLabel'.length);
+      expect(location.startLine, 2);
+      expect(location.startColumn, 1);
+    }
+    expect(element.parameters, isNull);
+    expect(element.returnType, isNull);
+    expect(element.flags, 0);
+  }
+
   void test_fromElement_METHOD() {
     Source source = addSource('/test.dart', '''
 class A {
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index a60bb60..73b2607 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -78,6 +78,47 @@
     expect(manager.isInAnalysisRoot('/test.dart'), isFalse);
   }
 
+  test_refresh_folder_with_pubspec() {
+    // create a context with a pubspec.yaml file
+    String pubspecPath = posix.join(projPath, 'pubspec.yaml');
+    resourceProvider.newFile(pubspecPath, 'pubspec');
+    manager.setRoots(<String>[projPath], <String>[]);
+    return pumpEventQueue().then((_) {
+      expect(manager.currentContextPaths.toList(), [projPath]);
+      manager.now++;
+      manager.refresh();
+      return pumpEventQueue().then((_) {
+        expect(manager.currentContextPaths.toList(), [projPath]);
+        expect(manager.currentContextTimestamps[projPath], manager.now);
+      });
+    });
+  }
+
+  test_refresh_folder_with_pubspec_subfolders() {
+    // Create a folder with no pubspec.yaml, containing two subfolders with
+    // pubspec.yaml files.
+    String subdir1Path = posix.join(projPath, 'subdir1');
+    String subdir2Path = posix.join(projPath, 'subdir2');
+    String pubspec1Path = posix.join(subdir1Path, 'pubspec.yaml');
+    String pubspec2Path = posix.join(subdir2Path, 'pubspec.yaml');
+    resourceProvider.newFile(pubspec1Path, 'pubspec');
+    resourceProvider.newFile(pubspec2Path, 'pubspec');
+    manager.setRoots(<String>[projPath], <String>[]);
+    return pumpEventQueue().then((_) {
+      expect(manager.currentContextPaths.toSet(),
+          [projPath, subdir1Path, subdir2Path].toSet());
+      manager.now++;
+      manager.refresh();
+      return pumpEventQueue().then((_) {
+        expect(manager.currentContextPaths.toSet(),
+          [projPath, subdir1Path, subdir2Path].toSet());
+        expect(manager.currentContextTimestamps[projPath], manager.now);
+        expect(manager.currentContextTimestamps[subdir1Path], manager.now);
+        expect(manager.currentContextTimestamps[subdir2Path], manager.now);
+      });
+    });
+  }
+
   void test_setRoots_addFolderWithDartFile() {
     String filePath = posix.join(projPath, 'foo.dart');
     resourceProvider.newFile(filePath, 'contents');
@@ -638,7 +679,15 @@
    */
   int now = 0;
 
-  final Set<String> currentContextPaths = new Set<String>();
+  /**
+   * Map from context to the timestamp when the context was created.
+   */
+  Map<String, int> currentContextTimestamps = <String, int>{};
+
+  /**
+   * Iterable of the paths to contexts that currently exist.
+   */
+  Iterable<String> get currentContextPaths => currentContextTimestamps.keys;
 
   /**
    * Map from context to (map from file path to timestamp of last event).
@@ -659,7 +708,8 @@
   @override
   void addContext(Folder folder, Map<String, List<Folder>> packageMap) {
     String path = folder.path;
-    currentContextPaths.add(path);
+    expect(currentContextPaths, isNot(contains(path)));
+    currentContextTimestamps[path] = now;
     currentContextFilePaths[path] = <String, int>{};
     currentContextPackageMaps[path] = packageMap;
   }
@@ -693,7 +743,8 @@
   @override
   void removeContext(Folder folder) {
     String path = folder.path;
-    currentContextPaths.remove(path);
+    expect(currentContextPaths, contains(path));
+    currentContextTimestamps.remove(path);
     currentContextFilePaths.remove(path);
     currentContextPackageMaps.remove(path);
   }
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index 9fee3fc..3e45bfa 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -70,64 +70,64 @@
       });
     });
 
-    group('mapUri', () {
-      String contextId;
-
-      setUp(() {
-        Request request =
-            new ExecutionCreateContextParams('/a/b.dart').toRequest('0');
-        Response response = handler.handleRequest(request);
-        expect(response, isResponseSuccess('0'));
-        ExecutionCreateContextResult result =
-            new ExecutionCreateContextResult.fromResponse(response);
-        contextId = result.id;
-      });
-
-      tearDown(() {
-        Request request =
-            new ExecutionDeleteContextParams(contextId).toRequest('1');
-        Response response = handler.handleRequest(request);
-        expect(response, isResponseSuccess('1'));
-      });
-
-      test('file to URI', () {
-        Request request =
-            new ExecutionMapUriParams(contextId, file: '/a/b.dart').toRequest('2');
-        Response response = handler.handleRequest(request);
-        expect(response, isResponseSuccess('2'));
-        ExecutionMapUriResult result =
-            new ExecutionMapUriResult.fromResponse(response);
-        expect(result.file, isNull);
-        expect(result.uri, isNotNull);
-        // TODO(brianwilkerson) Test for the correct result.
-      });
-
-      test('URI to file', () {
-        Request request =
-            new ExecutionMapUriParams(contextId, uri: '/a/b.dart').toRequest('3');
-        Response response = handler.handleRequest(request);
-        expect(response, isResponseSuccess('3'));
-        ExecutionMapUriResult result =
-            new ExecutionMapUriResult.fromResponse(response);
-        expect(result.file, isNotNull);
-        expect(result.uri, isNull);
-        // TODO(brianwilkerson) Test for the correct result.
-      });
-
-      test('invalid context id', () {
-        Request request =
-            new ExecutionMapUriParams('xxx', uri: '').toRequest('4');
-        Response response = handler.handleRequest(request);
-        expect(response, isResponseFailure('4'));
-      });
-
-      test('both file and uri', () {
-        Request request =
-            new ExecutionMapUriParams('xxx', file: '', uri: '').toRequest('5');
-        Response response = handler.handleRequest(request);
-        expect(response, isResponseFailure('5'));
-      });
-    });
+//    group('mapUri', () {
+//      String contextId;
+//
+//      setUp(() {
+//        Request request =
+//            new ExecutionCreateContextParams('/a/b.dart').toRequest('0');
+//        Response response = handler.handleRequest(request);
+//        expect(response, isResponseSuccess('0'));
+//        ExecutionCreateContextResult result =
+//            new ExecutionCreateContextResult.fromResponse(response);
+//        contextId = result.id;
+//      });
+//
+//      tearDown(() {
+//        Request request =
+//            new ExecutionDeleteContextParams(contextId).toRequest('1');
+//        Response response = handler.handleRequest(request);
+//        expect(response, isResponseSuccess('1'));
+//      });
+//
+//      test('file to URI', () {
+//        Request request =
+//            new ExecutionMapUriParams(contextId, file: '/a/b.dart').toRequest('2');
+//        Response response = handler.handleRequest(request);
+//        expect(response, isResponseSuccess('2'));
+//        ExecutionMapUriResult result =
+//            new ExecutionMapUriResult.fromResponse(response);
+//        expect(result.file, isNull);
+//        expect(result.uri, isNotNull);
+//        // TODO(brianwilkerson) Test for the correct result.
+//      });
+//
+//      test('URI to file', () {
+//        Request request =
+//            new ExecutionMapUriParams(contextId, uri: '/a/b.dart').toRequest('3');
+//        Response response = handler.handleRequest(request);
+//        expect(response, isResponseSuccess('3'));
+//        ExecutionMapUriResult result =
+//            new ExecutionMapUriResult.fromResponse(response);
+//        expect(result.file, isNotNull);
+//        expect(result.uri, isNull);
+//        // TODO(brianwilkerson) Test for the correct result.
+//      });
+//
+//      test('invalid context id', () {
+//        Request request =
+//            new ExecutionMapUriParams('xxx', uri: '').toRequest('4');
+//        Response response = handler.handleRequest(request);
+//        expect(response, isResponseFailure('4'));
+//      });
+//
+//      test('both file and uri', () {
+//        Request request =
+//            new ExecutionMapUriParams('xxx', file: '', uri: '').toRequest('5');
+//        Response response = handler.handleRequest(request);
+//        expect(response, isResponseFailure('5'));
+//      });
+//    });
 
     group('setSubscriptions', () {
       test('failure - invalid service name', () {
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index ea4f3bd..e28c227 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -802,6 +802,31 @@
 ''');
   }
 
+  test_class_fromInstanceCreation() {
+    addTestFile('''
+class Test {
+  Test() {}
+  Test.named() {}
+}
+main() {
+  new Test();
+  new Test.named();
+}
+''');
+    return assertSuccessfulRefactoring(() {
+      return sendRenameRequest('Test();', 'NewName');
+    }, '''
+class NewName {
+  NewName() {}
+  NewName.named() {}
+}
+main() {
+  new NewName();
+  new NewName.named();
+}
+''');
+  }
+
   test_class_options_fatalError() {
     addTestFile('''
 class Test {}
@@ -873,7 +898,7 @@
     });
   }
 
-  test_constructor() {
+  test_constructor_fromInstanceCreation() {
     addTestFile('''
 class A {
   A.test() {}
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
new file mode 100644
index 0000000..aafb34e
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_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.
+
+library test.integration.analysis.reanalyze;
+
+import '../../reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import '../integration_tests.dart';
+
+@ReflectiveTestCase()
+class Test extends AbstractAnalysisServerIntegrationTest {
+  test_reanalyze() {
+    String pathname = sourcePath('test.dart');
+    String text = 'main() {}';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+    return analysisFinished.then((_) {
+      // Make sure that reanalyze causes analysis to restart.
+      bool analysisRestarted = false;
+      onServerStatus.listen((data) {
+        if (data.containsKey('analysis')) {
+          if (data['analysis']['isAnalyzing']) {
+            analysisRestarted = true;
+          }
+        }
+      });
+      sendAnalysisReanalyze();
+      return analysisFinished.then((_) {
+        expect(analysisRestarted, isTrue);
+      });
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(Test);
+}
diff --git a/pkg/analysis_server/test/integration/integration_test_methods.dart b/pkg/analysis_server/test/integration/integration_test_methods.dart
index 905bc63..8e0472a 100644
--- a/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -4,7 +4,7 @@
 //
 // This file has been automatically generated.  Please do not edit it manually.
 // To regenerate the file, use the script
-// "pkg/analysis_server/spec/generate_files".
+// "pkg/analysis_server/tool/spec/generate_files".
 
 /**
  * Convenience methods for running integration tests
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index c6fdc83..8956f99 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -4,7 +4,7 @@
 //
 // This file has been automatically generated.  Please do not edit it manually.
 // To regenerate the file, use the script
-// "pkg/analysis_server/spec/generate_files".
+// "pkg/analysis_server/tool/spec/generate_files".
 
 /**
  * Matchers for data types defined in the analysis server API
@@ -837,8 +837,10 @@
  * AnalysisErrorType
  *
  * enum {
+ *   ANGULAR
  *   COMPILE_TIME_ERROR
  *   HINT
+ *   POLYMER
  *   STATIC_TYPE_WARNING
  *   STATIC_WARNING
  *   SYNTACTIC_ERROR
@@ -846,8 +848,10 @@
  * }
  */
 final Matcher isAnalysisErrorType = new MatchesEnum("AnalysisErrorType", [
+  "ANGULAR",
   "COMPILE_TIME_ERROR",
   "HINT",
+  "POLYMER",
   "STATIC_TYPE_WARNING",
   "STATIC_WARNING",
   "SYNTACTIC_ERROR",
@@ -1005,6 +1009,7 @@
  *   GETTER
  *   IMPORT
  *   KEYWORD
+ *   LABEL
  *   LIBRARY_PREFIX
  *   LOCAL_VARIABLE
  *   METHOD
@@ -1028,6 +1033,7 @@
   "GETTER",
   "IMPORT",
   "KEYWORD",
+  "LABEL",
   "LIBRARY_PREFIX",
   "LOCAL_VARIABLE",
   "METHOD",
@@ -1075,6 +1081,7 @@
  *   FUNCTION
  *   FUNCTION_TYPE_ALIAS
  *   GETTER
+ *   LABEL
  *   LIBRARY
  *   LOCAL_VARIABLE
  *   METHOD
@@ -1096,6 +1103,7 @@
   "FUNCTION",
   "FUNCTION_TYPE_ALIAS",
   "GETTER",
+  "LABEL",
   "LIBRARY",
   "LOCAL_VARIABLE",
   "METHOD",
@@ -1235,6 +1243,7 @@
  *   IDENTIFIER_DEFAULT
  *   IMPORT_PREFIX
  *   KEYWORD
+ *   LABEL
  *   LITERAL_BOOLEAN
  *   LITERAL_DOUBLE
  *   LITERAL_INTEGER
@@ -1273,6 +1282,7 @@
   "IDENTIFIER_DEFAULT",
   "IMPORT_PREFIX",
   "KEYWORD",
+  "LABEL",
   "LITERAL_BOOLEAN",
   "LITERAL_DOUBLE",
   "LITERAL_INTEGER",
@@ -1617,7 +1627,7 @@
  * {
  *   "code": RequestErrorCode
  *   "message": String
- *   "data": optional object
+ *   "stackTrace": optional String
  * }
  */
 final Matcher isRequestError = new LazyMatcher(() => new MatchesJsonObject(
@@ -1625,7 +1635,7 @@
     "code": isRequestErrorCode,
     "message": isString
   }, optionalFields: {
-    "data": isObject
+    "stackTrace": isString
   }));
 
 /**
@@ -1637,6 +1647,7 @@
  *   INVALID_PARAMETER
  *   INVALID_REQUEST
  *   SERVER_ALREADY_STARTED
+ *   SERVER_ERROR
  *   UNANALYZED_PRIORITY_FILES
  *   UNKNOWN_REQUEST
  *   UNSUPPORTED_FEATURE
@@ -1648,6 +1659,7 @@
   "INVALID_PARAMETER",
   "INVALID_REQUEST",
   "SERVER_ALREADY_STARTED",
+  "SERVER_ERROR",
   "UNANALYZED_PRIORITY_FILES",
   "UNKNOWN_REQUEST",
   "UNSUPPORTED_FEATURE"
diff --git a/pkg/analysis_server/test/mock_sdk.dart b/pkg/analysis_server/test/mock_sdk.dart
index fa520df..07d8cf0 100644
--- a/pkg/analysis_server/test/mock_sdk.dart
+++ b/pkg/analysis_server/test/mock_sdk.dart
@@ -110,6 +110,11 @@
   final resource.MemoryResourceProvider provider =
       new resource.MemoryResourceProvider();
 
+  /**
+   * The [AnalysisContext] which is used for all of the sources.
+   */
+  InternalAnalysisContext _analysisContext;
+
   MockSdk() {
     LIBRARIES.forEach((_MockSdkLibrary library) {
       provider.newFile(library.path, library.content);
@@ -117,7 +122,20 @@
   }
 
   @override
-  AnalysisContext get context => throw unimplemented;
+  AnalysisContext get context {
+    if (_analysisContext == null) {
+      _analysisContext = new SdkAnalysisContext();
+      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
+      _analysisContext.sourceFactory = factory;
+      ChangeSet changeSet = new ChangeSet();
+      for (String uri in uris) {
+        Source source = factory.forUri(uri);
+        changeSet.addedSource(source);
+      }
+      _analysisContext.applyChanges(changeSet);
+    }
+    return _analysisContext;
+  }
 
   @override
   List<SdkLibrary> get sdkLibraries => LIBRARIES;
@@ -128,7 +146,13 @@
   UnimplementedError get unimplemented => new UnimplementedError();
 
   @override
-  List<String> get uris => throw unimplemented;
+  List<String> get uris {
+    List<String> uris = <String>[];
+    for (SdkLibrary library in LIBRARIES) {
+      uris.add(library.shortName);
+    }
+    return uris;
+  }
 
   @override
   Source fromFileUri(Uri uri) {
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index aed7483..b12e131 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -105,32 +105,27 @@
   }
 
   void test_fromJson() {
+    var trace = 'a stack trace\r\nfoo';
     var json = {
       CODE: RequestErrorCode.INVALID_PARAMETER.name,
       MESSAGE: 'foo',
-      DATA: {
-        'ints': [1, 2, 3]
-      }
+      STACK_TRACE: trace
     };
     RequestError error = new RequestError.fromJson(new ResponseDecoder(null), '',
         json);
     expect(error.code, RequestErrorCode.INVALID_PARAMETER);
     expect(error.message, "foo");
-    expect(error.data['ints'], [1, 2, 3]);
+    expect(error.stackTrace, trace);
   }
 
   void test_toJson() {
+    var trace = 'a stack trace\r\nbar';
     RequestError error = new RequestError(
-        RequestErrorCode.UNKNOWN_REQUEST, 'msg', data: {});
-    error.data['answer'] = 42;
-    error.data['question'] = 'unknown';
+        RequestErrorCode.UNKNOWN_REQUEST, 'msg', stackTrace: trace);
     expect(error.toJson(), {
       CODE: 'UNKNOWN_REQUEST',
       MESSAGE: 'msg',
-      DATA: {
-        'answer': 42,
-        'question': 'unknown'
-      }
+      STACK_TRACE: trace
     });
   }
 }
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index 07ae6ca..3c78b7f 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -7,9 +7,9 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
-import '../reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
+import '../reflective_tests.dart';
 import 'abstract_search_domain.dart';
 
 
@@ -23,6 +23,11 @@
 class ElementReferencesTest extends AbstractSearchDomainTest {
   Element searchElement;
 
+  void assertHasRef(SearchResultKind kind, String search, bool isPotential) {
+    assertHasResult(kind, search);
+    expect(result.isPotential, isPotential);
+  }
+
   Future findElementReferences(String search, bool includePotential) {
     int offset = findOffset(search);
     return waitForTasksFinished().then((_) {
@@ -239,56 +244,166 @@
     });
   }
 
-  test_hierarchy_field_explicit() {
+  test_hierarchy_whenExtends_field() {
     addTestFile('''
 class A {
-  int fff; // in A
+  int mmm;
+  use_mmm_a() {
+    mmm = 1;
+  }
 }
 class B extends A {
-  int fff; // in B
+  int mmm;
+  use_mmm_b() {
+    mmm = 2;
+  }
 }
 class C extends B {
-  int fff; // in C
+  int mmm; // of C
+  use_mmm_c() {
+    mmm = 3;
+  }
 }
-main(A a, B b, C c) {
-  a.fff = 10;
-  b.fff = 20;
-  c.fff = 30;
+class D extends A {
+  int mmm;
+  use_mmm_d() {
+    mmm = 4;
+  }
+}
+class E extends C {
+  use_mmm_e() {
+    mmm = 5;
+  }
+}
+class F extends C {
+  int mmm;
+  use_mmm_f() {
+    mmm = 6;
+    mmm(6);
+  }
+}
+main(A a, B b, C c, D d, E e, F f) {
+  a.mmm = 10;
+  b.mmm = 20;
+  c.mmm = 30;
+  d.mmm = 40;
+  e.mmm = 50;
+  f.mmm = 60;
 }
 ''');
-    return findElementReferences('fff; // in B', false).then((_) {
+    return findElementReferences('mmm; // of C', false).then((_) {
       expect(searchElement.kind, ElementKind.FIELD);
-      assertHasResult(SearchResultKind.DECLARATION, 'fff; // in A');
-      assertHasResult(SearchResultKind.DECLARATION, 'fff; // in B');
-      assertHasResult(SearchResultKind.DECLARATION, 'fff; // in C');
-      assertHasResult(SearchResultKind.WRITE, 'fff = 10;');
-      assertHasResult(SearchResultKind.WRITE, 'fff = 20;');
-      assertHasResult(SearchResultKind.WRITE, 'fff = 30;');
+      // unqualified
+      {
+        assertHasResult(SearchResultKind.WRITE, 'mmm = 1');
+        assertHasResult(SearchResultKind.WRITE, 'mmm = 2');
+        assertHasResult(SearchResultKind.WRITE, 'mmm = 3');
+        assertNoResult(SearchResultKind.WRITE, 'mmm = 4');
+        assertHasResult(SearchResultKind.WRITE, 'mmm = 5');
+        assertNoResult(SearchResultKind.WRITE, 'mmm = 6');
+      }
+      // qualified
+      {
+        assertHasResult(SearchResultKind.WRITE, 'mmm = 10');
+        assertHasResult(SearchResultKind.WRITE, 'mmm = 20');
+        assertHasResult(SearchResultKind.WRITE, 'mmm = 30');
+        assertNoResult(SearchResultKind.WRITE, 'mmm = 40');
+        assertHasResult(SearchResultKind.WRITE, 'mmm = 50');
+        assertNoResult(SearchResultKind.WRITE, 'mmm = 60');
+      }
     });
   }
 
-  test_hierarchy_method() {
+  test_hierarchy_whenExtends_method() {
+    // TODO(scheglov) ideally we need to remove D.mmm() declaration
+    // to actually test that we have fixed
+    // https://code.google.com/p/dart/issues/detail?id=19697
     addTestFile('''
 class A {
-  mmm() {} // in A
+  mmm(_) {}
+  use_mmm_a() {
+    mmm(1);
+  }
 }
 class B extends A {
-  mmm() {} // in B
+  mmm(_) {}
+  use_mmm_b() {
+    mmm(2);
+  }
 }
 class C extends B {
-  mmm() {} // in C
+  mmm(_) {} // of C
+  use_mmm_c() {
+    mmm(3);
+  }
 }
-main(A a, B b, C c) {
+class D extends A {
+  mmm(_) {}
+  use_mmm_d() {
+    mmm(4);
+  }
+}
+class E extends C {
+  use_mmm_e() {
+    mmm(5);
+  }
+}
+class F extends C {
+  mmm(_) {}
+  use_mmm_f() {
+    mmm(6);
+  }
+}
+main(A a, B b, C c, D d, E e, F f) {
   a.mmm(10);
   b.mmm(20);
   c.mmm(30);
+  d.mmm(40);
+  e.mmm(50);
+  f.mmm(60);
 }
 ''');
-    return findElementReferences('mmm() {} // in B', false).then((_) {
+    return findElementReferences('mmm(_) {} // of C', false).then((_) {
       expect(searchElement.kind, ElementKind.METHOD);
-      assertHasResult(SearchResultKind.INVOCATION, 'mmm(10)');
-      assertHasResult(SearchResultKind.INVOCATION, 'mmm(20)');
-      assertHasResult(SearchResultKind.INVOCATION, 'mmm(30)');
+      // unqualified
+      {
+        assertHasResult(SearchResultKind.INVOCATION, 'mmm(1)');
+        assertHasResult(SearchResultKind.INVOCATION, 'mmm(2)');
+        assertHasResult(SearchResultKind.INVOCATION, 'mmm(3)');
+        assertNoResult(SearchResultKind.INVOCATION, 'mmm(4)');
+        assertHasResult(SearchResultKind.INVOCATION, 'mmm(5)');
+        assertNoResult(SearchResultKind.INVOCATION, 'mmm(6)');
+      }
+      // qualified
+      {
+        assertHasResult(SearchResultKind.INVOCATION, 'mmm(10)');
+        assertHasResult(SearchResultKind.INVOCATION, 'mmm(20)');
+        assertHasResult(SearchResultKind.INVOCATION, 'mmm(30)');
+        assertNoResult(SearchResultKind.INVOCATION, 'mmm(40)');
+        assertHasResult(SearchResultKind.INVOCATION, 'mmm(50)');
+        assertNoResult(SearchResultKind.INVOCATION, 'mmm(60)');
+      }
+    });
+  }
+
+  test_label() {
+    addTestFile('''
+main() {
+myLabel:
+  for (int i = 0; i < 10; i++) {
+    if (i == 2) {
+      continue myLabel; // continue
+    }
+    break myLabel; // break
+  }
+}
+''');
+    return findElementReferences('myLabel; // break', false).then((_) {
+      expect(searchElement.kind, ElementKind.LABEL);
+      expect(results, hasLength(3));
+      assertHasResult(SearchResultKind.DECLARATION, 'myLabel:');
+      assertHasResult(SearchResultKind.REFERENCE, 'myLabel; // continue');
+      assertHasResult(SearchResultKind.REFERENCE, 'myLabel; // break');
     });
   }
 
@@ -566,6 +681,30 @@
     });
   }
 
+  test_potential_method_definedInSubclass() {
+    addTestFile('''
+class Base {
+  methodInBase() {
+    test(1);
+  }
+}
+class Derived extends Base {
+  test(_) {} // of Derived
+  methodInDerived() {
+    test(2);
+  }
+}
+globalFunction(Base b) {
+  b.test(3);
+}
+''');
+    return findElementReferences('test(_) {} // of Derived', true).then((_) {
+      assertHasRef(SearchResultKind.INVOCATION, 'test(1);', true);
+      assertHasRef(SearchResultKind.INVOCATION, 'test(2);', false);
+      assertHasRef(SearchResultKind.INVOCATION, 'test(3);', true);
+    });
+  }
+
   test_topLevelVariable_explicit() {
     addTestFile('''
 var vvv = 1;
diff --git a/pkg/analysis_server/test/services/completion/completion_test_util.dart b/pkg/analysis_server/test/services/completion/completion_test_util.dart
index e16ff1e..f40ede7 100644
--- a/pkg/analysis_server/test/services/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -44,11 +44,8 @@
     content = content.substring(0, completionOffset) +
         content.substring(completionOffset + 1);
     testSource = addSource(testFile, content);
-    request = new DartCompletionRequest(
-        context,
-        searchEngine,
-        testSource,
-        completionOffset);
+    request =
+        new DartCompletionRequest(context, searchEngine, testSource, completionOffset);
   }
 
   void assertNotSuggested(String completion) {
@@ -57,9 +54,9 @@
     }
   }
 
-  void assertSuggest(CompletionSuggestionKind kind, String completion,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT, bool isDeprecated
-      = false, bool isPotential = false]) {
+  CompletionSuggestion assertSuggest(CompletionSuggestionKind kind,
+      String completion, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      bool isDeprecated = false, bool isPotential = false]) {
     CompletionSuggestion cs;
     request.suggestions.forEach((s) {
       if (s.completion == completion) {
@@ -84,6 +81,7 @@
     expect(cs.selectionLength, equals(0));
     expect(cs.isDeprecated, equals(isDeprecated));
     expect(cs.isPotential, equals(isPotential));
+    return cs;
   }
 
   void assertSuggestClass(String className, [CompletionRelevance relevance =
@@ -91,19 +89,26 @@
     assertSuggest(CompletionSuggestionKind.CLASS, className, relevance);
   }
 
-  void assertSuggestField(String completion, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
-    assertSuggest(CompletionSuggestionKind.FIELD, completion, relevance);
+  void assertSuggestField(String completion, String declaringType, String type,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.FIELD, completion, relevance);
+    expect(cs.declaringType, equals(declaringType));
+    expect(cs.returnType, equals(type));
   }
 
-  void assertSuggestFunction(String completion, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
-    assertSuggest(CompletionSuggestionKind.FUNCTION, completion, relevance);
+  void assertSuggestFunction(String completion, String returnType,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.FUNCTION, completion, relevance);
+    expect(cs.returnType, equals(returnType));
   }
 
-  void assertSuggestGetter(String className, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
-    assertSuggest(CompletionSuggestionKind.GETTER, className, relevance);
+  void assertSuggestGetter(String className, String returnType,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.GETTER, className, relevance);
+    expect(cs.returnType, equals(returnType));
   }
 
   void assertSuggestLibraryPrefix(String completion,
@@ -114,26 +119,33 @@
         relevance);
   }
 
-  void assertSuggestLocalVariable(String completion,
+  void assertSuggestLocalVariable(String completion, String returnType,
       [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    assertSuggest(
-        CompletionSuggestionKind.LOCAL_VARIABLE,
-        completion,
-        relevance);
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.LOCAL_VARIABLE, completion, relevance);
+    expect(cs.returnType, equals(returnType));
   }
 
-  void assertSuggestMethod(String className, [CompletionRelevance relevance =
+  void assertSuggestMethod(String className, String declaringType,
+      String returnType, [CompletionRelevance relevance =
       CompletionRelevance.DEFAULT]) {
-    assertSuggest(CompletionSuggestionKind.METHOD, className, relevance);
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.METHOD, className, relevance);
+    expect(cs.declaringType, equals(declaringType));
+    expect(cs.returnType, equals(returnType));
   }
 
-  void assertSuggestMethodName(String completion, [CompletionRelevance relevance
-      = CompletionRelevance.DEFAULT]) {
-    assertSuggest(CompletionSuggestionKind.METHOD_NAME, completion, relevance);
+  void assertSuggestMethodName(String completion, String declaringType,
+      String returnType, [CompletionRelevance relevance =
+      CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.METHOD_NAME, completion, relevance);
+    expect(cs.declaringType, equals(declaringType));
+    expect(cs.returnType, equals(returnType));
   }
 
-  void assertSuggestParameter(String completion, [CompletionRelevance relevance
-      = CompletionRelevance.DEFAULT]) {
+  void assertSuggestParameter(String completion, String returnType,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
     assertSuggest(CompletionSuggestionKind.PARAMETER, completion, relevance);
   }
 
@@ -142,12 +154,13 @@
     assertSuggest(CompletionSuggestionKind.SETTER, className, relevance);
   }
 
-  void assertSuggestTopLevelVar(String completion,
+  void assertSuggestTopLevelVar(String completion, String returnType,
       [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    assertSuggest(
+    CompletionSuggestion cs = assertSuggest(
         CompletionSuggestionKind.TOP_LEVEL_VARIABLE,
         completion,
         relevance);
+    expect(cs.returnType, equals(returnType));
   }
 
   bool computeFast() {
@@ -165,9 +178,10 @@
 
     // Index SDK
     for (Source librarySource in context.librarySources) {
-      CompilationUnit unit = context.getResolvedCompilationUnit2(librarySource, librarySource);
+      CompilationUnit unit =
+          context.getResolvedCompilationUnit2(librarySource, librarySource);
       if (unit != null) {
-          index.indexUnit(context, unit);
+        index.indexUnit(context, unit);
       }
     }
 
@@ -190,8 +204,8 @@
             context.getResolvedCompilationUnit(testSource, library);
         if (unit != null) {
           request.unit = unit;
-          request.node = new NodeLocator.con1(
-              completionOffset).searchWithin(unit);
+          request.node =
+              new NodeLocator.con1(completionOffset).searchWithin(unit);
           resolved = true;
           if (!fullAnalysis) {
             break;
diff --git a/pkg/analysis_server/test/services/completion/imported_computer_test.dart b/pkg/analysis_server/test/services/completion/imported_computer_test.dart
index 6b07e6e..2943da5 100644
--- a/pkg/analysis_server/test/services/completion/imported_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/imported_computer_test.dart
@@ -147,13 +147,10 @@
   }
 
   test_local_name() {
-    addSource('/testA.dart', 'var T1;');
+    addSource('/testA.dart', 'B T1; class B{}');
     addTestSource('import "/testA.dart"; class C {a() {C ^}}');
     return computeFull().then((_) {
-      //TODO (danrubel) should not be suggested
-      // but C ^ in this test
-      // parses differently than var ^ in test below
-      assertSuggestTopLevelVar('T1');
+      assertNotSuggested('T1');
     });
   }
 
@@ -165,11 +162,18 @@
     });
   }
 
+  test_import_dart() {
+    addTestSource('import "dart^"; main() {}');
+    return computeFull().then((_) {
+      assertNotSuggested('T1');
+    });
+  }
+
   test_topLevelVar() {
-    addSource('/testA.dart', 'var T1; var _T2;');
+    addSource('/testA.dart', 'String T1; var _T2;');
     addTestSource('import "/testA.dart"; class C {foo(){^}}');
     return computeFull().then((_) {
-      assertSuggestTopLevelVar('T1');
+      assertSuggestTopLevelVar('T1', 'String');
       assertNotSuggested('_T2');
     });
   }
@@ -194,7 +198,7 @@
     addSource('/testA.dart', 'var T1; var _T2;');
     addTestSource('class C {foo(){^}}');
     return computeFull(true).then((_) {
-      assertSuggestTopLevelVar('T1', CompletionRelevance.LOW);
+      assertSuggestTopLevelVar('T1', null, CompletionRelevance.LOW);
       assertNotSuggested('_T2');
     });
   }
diff --git a/pkg/analysis_server/test/services/completion/invocation_computer_test.dart b/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
index 45bcb5e..9c11f1a 100644
--- a/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
@@ -26,59 +26,58 @@
   }
 
   test_field() {
-    addTestSource('class A {var b; var _c;} main() {A a; a.^}');
+    addTestSource('class A {var b; X _c;} class X{} main() {A a; a.^}');
     return computeFull().then((_) {
-      assertSuggestField('b');
-      assertSuggestField('_c');
+      assertSuggestField('b', 'A', null);
+      assertSuggestField('_c', 'A', 'X');
     });
   }
 
   test_field_imported() {
-    addSource('/testB.dart', 'lib B; class X {var y; var _z;}');
+    addSource('/testB.dart', 'lib B; class X {M y; var _z;} class M{}');
     addTestSource('import "/testB.dart"; main() {X x; x.^}');
     return computeFull().then((_) {
-      assertSuggestField('y');
+      assertSuggestField('y', 'X', 'M');
       assertNotSuggested('_z');
     });
   }
 
   test_field_superclass() {
     addTestSource(
-        'class A {var b; var _c;} class B extends A {} main() {B b; b.^}');
+        'class A {X b; var _c;} class X{} class B extends A {} main() {B b; b.^}');
     return computeFull().then((_) {
-      assertSuggestField('b');
-      assertSuggestField('_c');
+      assertSuggestField('b', 'A', 'X');
+      assertSuggestField('_c', 'A', null);
     });
   }
 
   test_getter() {
     addTestSource(
-        'class A {A get b => new A();A get _c => new A();} main() {A a; a.^}');
+        'class A {X get b => new A();get _c => new A();} class X{} main() {A a; a.^}');
     return computeFull().then((_) {
-      assertSuggestGetter('b');
-      assertSuggestGetter('_c');
+      assertSuggestGetter('b', 'X');
+      assertSuggestGetter('_c', null);
     });
   }
 
   test_getter_imported() {
     addSource(
         '/testB.dart',
-        'lib B; class X {X get y => new X(); X get _z => new X();}');
+        'lib B; class S{} class X {S get y => new X(); X get _z => new X();}');
     addTestSource('import "/testB.dart"; main() {X x; x.^}');
     return computeFull().then((_) {
-      assertSuggestGetter('y');
+      assertSuggestGetter('y', 'S');
       assertNotSuggested('_z');
     });
   }
 
   test_getter_interface() {
-    addTestSource(
-        '''class A {A get b => new A();A get _c => new A();}
-           class B implements A {A get b => new A();}
+    addTestSource('''class A {S get b => new A();A get _c => new A();}
+           class B implements A {S get b => new A();} class S{}
            main() {B b; b.^}''');
     return computeFull().then((_) {
-      assertSuggestGetter('b');
-      assertSuggestGetter('_c');
+      assertSuggestGetter('b', 'S');
+      assertSuggestGetter('_c', 'A');
     });
   }
 
@@ -91,29 +90,29 @@
   }
 
   test_method() {
-    addTestSource('class A {b(X x) {} _c(X x) {}} main() {A a; a.^}');
+    addTestSource('class S{} class A {b(X x) {} S _c(X x) {}} main() {A a; a.^}');
     return computeFull().then((_) {
-      assertSuggestMethod('b');
-      assertSuggestMethod('_c');
+      assertSuggestMethod('b', 'A', null);
+      assertSuggestMethod('_c', 'A', 'S');
     });
   }
 
   test_method_imported() {
-    addSource('/testB.dart', 'lib B; class X {y(X x) {} _z(X x) {}}');
+    addSource('/testB.dart', 'lib B; class X {T y(X x) {} _z(X x) {}} class T{}');
     addTestSource('import "/testB.dart"; main() {X x; x.^}');
     return computeFull().then((_) {
-      assertSuggestMethod('y');
+      assertSuggestMethod('y', 'X', 'T');
       assertNotSuggested('_z');
     });
   }
 
   test_method_imported_mixin() {
-    addSource('/testB.dart', 'lib B; class X {y(X x) {} _z(X x) {}}');
+    addSource('/testB.dart', 'lib B; class X {T y(X x) {} _z(X x) {}} class T{}');
     addTestSource('''import "/testB.dart";
       class A extends Object with X {}
       main() {A a; a.^}''');
     return computeFull().then((_) {
-      assertSuggestMethod('y');
+      assertSuggestMethod('y', 'X', 'T');
       assertNotSuggested('_z');
     });
   }
diff --git a/pkg/analysis_server/test/services/completion/local_computer_test.dart b/pkg/analysis_server/test/services/completion/local_computer_test.dart
index cdd776f..2134be7 100644
--- a/pkg/analysis_server/test/services/completion/local_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/local_computer_test.dart
@@ -27,30 +27,30 @@
   test_block() {
     addTestSource('class A {a() {var f; {var x;} ^ var g;}}');
     expect(computeFast(), isTrue);
-    assertSuggestLocalVariable('f');
+    assertSuggestLocalVariable('f', null);
     assertNotSuggested('g');
     assertNotSuggested('x');
   }
 
   test_catch() {
-    addTestSource('class A {a() {try{} catch (e) {^}}}');
+    addTestSource('class A {a() {try{} on E catch (e) {^}}}');
     expect(computeFast(), isTrue);
-    assertSuggestParameter('e');
+    assertSuggestParameter('e', 'E');
   }
 
   test_catch2() {
     addTestSource('class A {a() {try{} catch (e, s) {^}}}');
     expect(computeFast(), isTrue);
-    assertSuggestParameter('e');
-    assertSuggestParameter('s');
+    assertSuggestParameter('e', null);
+    assertSuggestParameter('s', null);
   }
 
   test_compilationUnit_declarations() {
-    addTestSource('class A {^} class B {} var T;');
+    addTestSource('class A {^} class B {} A T;');
     expect(computeFast(), isTrue);
     assertSuggestClass('A');
     assertSuggestClass('B');
-    assertSuggestTopLevelVar('T');
+    assertSuggestTopLevelVar('T', 'A');
   }
 
   test_compilationUnit_directives() {
@@ -74,32 +74,29 @@
   test_for() {
     addTestSource('main(args) {for (int i; i < 10; ++i) {^}}');
     expect(computeFast(), isTrue);
-    assertSuggestLocalVariable('i');
+    assertSuggestLocalVariable('i', 'int');
   }
 
   test_forEach() {
     addTestSource('main(args) {for (foo in bar) {^}}');
     expect(computeFast(), isTrue);
-    assertSuggestLocalVariable('foo');
+    assertSuggestLocalVariable('foo', null);
   }
 
   test_function() {
-    addTestSource('main(args) {x.then((b) {^});}');
+    addTestSource('String foo(List args) {x.then((R b) {^});}');
     expect(computeFast(), isTrue);
-    assertSuggestFunction('main');
-    assertSuggestParameter('args');
-    assertSuggestParameter('b');
+    assertSuggestFunction('foo', 'String');
+    assertSuggestParameter('args', 'List');
+    assertSuggestParameter('b', 'R');
   }
 
   test_local_name() {
     addTestSource('class A {a() {var f; A ^}}');
     expect(computeFast(), isTrue);
-    //TODO (danrubel) should not be suggested
-    // but A ^ in this test
-    // parses differently than var ^ in test below
-    assertSuggestClass('A');
-    assertSuggestMethodName('a');
-    assertSuggestLocalVariable('f');
+    assertNotSuggested('A');
+    assertNotSuggested('a');
+    assertNotSuggested('f');
   }
 
   test_local_name2() {
@@ -111,27 +108,27 @@
   }
 
   test_members() {
-    addTestSource('class A {var f; a() {^} var g;}');
+    addTestSource('class A {X f; Z a() {^} var g;}');
     expect(computeFast(), isTrue);
-    assertSuggestMethodName('a');
-    assertSuggestField('f');
-    assertSuggestField('g');
+    assertSuggestMethodName('a', 'A', 'Z');
+    assertSuggestField('f', 'A', 'X');
+    assertSuggestField('g', 'A', null);
   }
 
   test_methodParam_named() {
-    addTestSource('class A {a(x, {y: boo}) {^}}');
+    addTestSource('class A {Z a(X x, {y: boo}) {^}}');
     expect(computeFast(), isTrue);
-    assertSuggestMethodName('a');
-    assertSuggestParameter('x');
-    assertSuggestParameter('y');
+    assertSuggestMethodName('a', 'A', 'Z');
+    assertSuggestParameter('x', 'X');
+    assertSuggestParameter('y', 'boo');
   }
 
   test_methodParam_positional() {
-    addTestSource('class A {a(x, [y=1]) {^}}');
+    addTestSource('class A {Z a(X x, [int y=1]) {^}}');
     expect(computeFast(), isTrue);
-    assertSuggestMethodName('a');
-    assertSuggestParameter('x');
-    assertSuggestParameter('y');
+    assertSuggestMethodName('a', 'A', 'Z');
+    assertSuggestParameter('x', 'X');
+    assertSuggestParameter('y', 'int');
   }
 
   test_topLevelVar_name() {
@@ -149,7 +146,7 @@
   test_variableDeclaration() {
     addTestSource('main() {int a = 1, b = 2 + ^;}');
     expect(computeFast(), isTrue);
-    assertSuggestLocalVariable('a');
+    assertSuggestLocalVariable('a', 'int');
     assertNotSuggested('b');
   }
 }
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 3648e73..be91abd 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -911,6 +911,30 @@
     assertNoAssistAt('import ', AssistKind.IMPORT_ADD_SHOW);
   }
 
+  void test_importAddShow_BAD_unresolvedUri() {
+    _indexTestUnit('''
+import '/no/such/lib.dart';
+''');
+    assertNoAssistAt('import ', AssistKind.IMPORT_ADD_SHOW);
+  }
+
+  void test_importAddShow_OK_hasUnresolvedIdentifier() {
+    _indexTestUnit('''
+import 'dart:math';
+main(x) {
+  PI;
+  return x.foo();
+}
+''');
+    assertHasAssistAt('import ', AssistKind.IMPORT_ADD_SHOW, '''
+import 'dart:math' show PI;
+main(x) {
+  PI;
+  return x.foo();
+}
+''');
+  }
+
   void test_importAddShow_OK_onDirective() {
     _indexTestUnit('''
 import 'dart:math';
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index fa6530d..32d0509 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -31,6 +31,8 @@
   Index index;
   SearchEngineImpl searchEngine;
 
+  bool checkHasSingleError = true;
+
   Fix fix;
   SourceChange change;
   String resultCode;
@@ -497,6 +499,37 @@
 ''');
   }
 
+  void test_createMissingOverrides_mergeToField_getterSetter() {
+    _indexTestUnit('''
+class A {
+  int ma;
+  void mb() {}
+  double mc;
+}
+
+class B implements A {
+}
+''');
+    assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
+class A {
+  int ma;
+  void mb() {}
+  double mc;
+}
+
+class B implements A {
+  int ma;
+
+  double mc;
+
+  @override
+  void mb() {
+    // TODO: implement mb
+  }
+}
+''');
+  }
+
   void test_createMissingOverrides_method() {
     _indexTestUnit('''
 abstract class A {
@@ -694,6 +727,24 @@
 ''');
   }
 
+  void test_creationFunction_forFunctionType_coreFunction() {
+    _indexTestUnit('''
+main() {
+  useFunction(g: test);
+}
+useFunction({Function g}) {}
+''');
+    assertHasFix(FixKind.CREATE_FUNCTION, '''
+main() {
+  useFunction(g: test);
+}
+useFunction({Function g}) {}
+
+test() {
+}
+''');
+  }
+
   void test_creationFunction_forFunctionType_dynamicArgument() {
     _indexTestUnit('''
 main() {
@@ -730,6 +781,24 @@
 ''');
   }
 
+  void test_creationFunction_forFunctionType_function_namedArgument() {
+    _indexTestUnit('''
+main() {
+  useFunction(g: test);
+}
+useFunction({int g(double a, String b)}) {}
+''');
+    assertHasFix(FixKind.CREATE_FUNCTION, '''
+main() {
+  useFunction(g: test);
+}
+useFunction({int g(double a, String b)}) {}
+
+int test(double a, String b) {
+}
+''');
+  }
+
   void test_creationFunction_forFunctionType_method_enclosingClass_static() {
     _indexTestUnit('''
 class A {
@@ -856,20 +925,10 @@
   }
 
   void test_importLibraryPackage_withType() {
-    provider.newFile('/packages/my_pkg/lib/my_lib.dart', '''
+    _configureMyPkg('''
 library my_lib;
 class Test {}
 ''');
-    {
-      Folder myPkgFolder = provider.getResource('/packages/my_pkg/lib');
-      UriResolver pkgResolver = new PackageMapUriResolver(provider, {
-        'my_pkg': [myPkgFolder]
-      });
-      context.sourceFactory = new SourceFactory(
-          [AbstractContextTest.SDK_RESOLVER, resourceResolver, pkgResolver]);
-    }
-    // force 'my_pkg' resolution
-    addSource('/tmp/other.dart', "import 'package:my_pkg/my_lib.dart';");
     // try to find a fix
     _indexTestUnit('''
 main() {
@@ -960,6 +1019,28 @@
 ''');
   }
 
+  void test_importLibraryProject_withType_annotation() {
+    addSource('/lib.dart', '''
+library lib;
+class Test {
+  const Test(int p);
+}
+''');
+    _indexTestUnit('''
+@Test(0)
+main() {
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
+import 'lib.dart';
+
+@Test(0)
+main() {
+}
+''');
+  }
+
   void test_importLibraryProject_withType_inParentFolder() {
     testFile = '/project/bin/test.dart';
     addSource('/project/lib.dart', '''
@@ -1039,6 +1120,22 @@
 ''');
   }
 
+  void test_importLibrarySdk_withTopLevelVariable_annotation() {
+    _indexTestUnit('''
+@PI
+main() {
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
+import 'dart:math';
+
+@PI
+main() {
+}
+''');
+  }
+
   void test_importLibrarySdk_withType_invocationTarget() {
     _indexTestUnit('''
 main() {
@@ -1084,6 +1181,21 @@
 ''');
   }
 
+  void test_importLibrarySdk_withType_typeArgument() {
+    _indexTestUnit('''
+main() {
+  List<Future> futures = [];
+}
+''');
+    assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
+import 'dart:async';
+
+main() {
+  List<Future> futures = [];
+}
+''');
+  }
+
   void test_importLibraryShow() {
     _indexTestUnit('''
 import 'dart:async' show Stream;
@@ -1248,6 +1360,43 @@
 ''');
   }
 
+  void test_replaceImportUri_inProject() {
+    testFile = '/project/bin/test.dart';
+    addSource('/project/foo/bar/lib.dart', '');
+    _indexTestUnit('''
+import 'no/matter/lib.dart';
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.REPLACE_IMPORT_URI, '''
+import '../foo/bar/lib.dart';
+''');
+  }
+
+  void test_replaceImportUri_package() {
+    _configureMyPkg('');
+    _indexTestUnit('''
+import 'no/matter/my_lib.dart';
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.REPLACE_IMPORT_URI, '''
+import 'package:my_pkg/my_lib.dart';
+''');
+  }
+
+  void test_replaceVarWithDynamic() {
+    checkHasSingleError = false;
+    _indexTestUnit('''
+class A {
+  Map<String, var> m;
+}
+''');
+    assertHasFix(FixKind.REPLACE_VAR_WITH_DYNAMIC, '''
+class A {
+  Map<String, dynamic> m;
+}
+''');
+  }
+
   void test_replaceWithConstInstanceCreation() {
     _indexTestUnit('''
 class A {
@@ -1809,13 +1958,28 @@
     }
   }
 
+  /**
+   * Configures the [SourceFactory] to have the `my_pkg` package in
+   * `/packages/my_pkg/lib` folder.
+   */
+  void _configureMyPkg(String myLibCode) {
+    provider.newFile('/packages/my_pkg/lib/my_lib.dart', myLibCode);
+    // configure SourceFactory
+    Folder myPkgFolder = provider.getResource('/packages/my_pkg/lib');
+    UriResolver pkgResolver = new PackageMapUriResolver(provider, {
+      'my_pkg': [myPkgFolder]
+    });
+    context.sourceFactory = new SourceFactory(
+        [AbstractContextTest.SDK_RESOLVER, resourceResolver, pkgResolver]);
+    // force 'my_pkg' resolution
+    addSource('/tmp/other.dart', "import 'package:my_pkg/my_lib.dart';");
+  }
+
   AnalysisError _findErrorToFix() {
     List<AnalysisError> errors = context.computeErrors(testSource);
-    expect(
-        errors,
-        hasLength(1),
-        reason: 'Exactly 1 error expected, but ${errors.length} found:\n' +
-            errors.join('\n'));
+    if (checkHasSingleError) {
+      expect(errors, hasLength(1));
+    }
     return errors[0];
   }
 
diff --git a/pkg/analysis_server/test/services/correction/strings_test.dart b/pkg/analysis_server/test/services/correction/strings_test.dart
index b3531c8..ea26934 100644
--- a/pkg/analysis_server/test/services/correction/strings_test.dart
+++ b/pkg/analysis_server/test/services/correction/strings_test.dart
@@ -5,9 +5,10 @@
 library test.services.correction.strings;
 
 import 'package:analysis_server/src/services/correction/strings.dart';
-import '../../reflective_tests.dart';
 import 'package:unittest/unittest.dart' hide isEmpty;
 
+import '../../reflective_tests.dart';
+
 
 
 main() {
@@ -130,6 +131,14 @@
     expect(remove('abc abbc abbbc', 'bc'), 'a ab abb');
   }
 
+  void test_removeEnd() {
+    expect(removeEnd(null, 'x'), null);
+    expect(removeEnd('abc', null), 'abc');
+    expect(removeEnd('www.domain.com', '.com.'), 'www.domain.com');
+    expect(removeEnd('www.domain.com', 'domain'), 'www.domain.com');
+    expect(removeEnd('www.domain.com', '.com'), 'www.domain');
+  }
+
   void test_removeStart() {
     expect(removeStart(null, 'x'), null);
     expect(removeStart('abc', null), 'abc');
@@ -142,4 +151,11 @@
     expect(repeat('x', 5), 'xxxxx');
     expect(repeat('abc', 3), 'abcabcabc');
   }
+
+  void test_substringAfterLast() {
+    expect(substringAfterLast('', '/'), '');
+    expect(substringAfterLast('abc', ''), '');
+    expect(substringAfterLast('abc', 'd'), 'abc');
+    expect(substringAfterLast('abcbde', 'b'), 'de');
+  }
 }
diff --git a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
index 845681f..1804b1d 100644
--- a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
+++ b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
@@ -5,16 +5,17 @@
 library test.services.src.index.dart_index_contributor;
 
 import 'package:analysis_server/src/services/index/index.dart';
-import 'package:analysis_server/src/services/index/index_store.dart';
 import 'package:analysis_server/src/services/index/index_contributor.dart';
-import '../../abstract_single_unit.dart';
-import '../../reflective_tests.dart';
+import 'package:analysis_server/src/services/index/index_store.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../abstract_single_unit.dart';
+import '../../reflective_tests.dart';
+
 
 main() {
   groupSep = ' | ';
diff --git a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
index baaeba55..6f65758 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -9,9 +9,9 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/refactoring/extract_local.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
-import '../../reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../reflective_tests.dart';
 import 'abstract_refactoring.dart';
 
 
@@ -718,6 +718,24 @@
 ''');
   }
 
+  test_singleExpression_inExpressionBody() {
+    indexTestUnit('''
+main() {
+  print((x) => x.y * x.y + 1);
+}
+''');
+    _createRefactoringForString('x.y');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  print((x) {
+    var res = x.y;
+    return res * res + 1;
+  });
+}
+''');
+  }
+
   test_singleExpression_inMethod() {
     indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
index 336bd66..7af2395 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
@@ -164,6 +164,40 @@
 ''');
   }
 
+  test_OK_parenthesis_instanceCreation_intoList() {
+    indexTestUnit('''
+class A {}
+main() {
+  var test = new A();
+  var list = [test];
+}
+''');
+    _createRefactoring('test =');
+    // validate change
+    return assertSuccessfulRefactoring('''
+class A {}
+main() {
+  var list = [new A()];
+}
+''');
+  }
+
+  test_OK_parenthesis_plus_intoMultiply() {
+    indexTestUnit('''
+main() {
+  var test = 1 + 2;
+  print(test * 3);
+}
+''');
+    _createRefactoring('test =');
+    // validate change
+    return assertSuccessfulRefactoring('''
+main() {
+  print((1 + 2) * 3);
+}
+''');
+  }
+
   test_OK_twoUsages() {
     indexTestUnit('''
 main() {
diff --git a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
index c41a545..d665de6 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
@@ -9,10 +9,10 @@
 import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analysis_server/src/services/refactoring/inline_method.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
-import '../../reflective_tests.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../reflective_tests.dart';
 import 'abstract_refactoring.dart';
 
 
@@ -92,6 +92,17 @@
     });
   }
 
+  test_bad_constructor() {
+    indexTestUnit(r'''
+class A {
+  A.named() {}
+}
+''');
+    _createRefactoring('named() {}');
+    // error
+    return _assertInvalidSelection();
+  }
+
   test_bad_deleteSource_inlineOne() {
     indexTestUnit(r'''
 test(a, b) {
@@ -124,8 +135,7 @@
 ''');
     _createRefactoring(') {');
     // error
-    return _assertConditionsFatal(
-        'Method declaration or reference must be selected to activate this refactoring.');
+    return _assertInvalidSelection();
   }
 
   test_bad_notSimpleIdentifier() {
@@ -137,8 +147,7 @@
 ''');
     _createRefactoring('test;');
     // error
-    return _assertConditionsFatal(
-        'Method declaration or reference must be selected to activate this refactoring.');
+    return _assertInvalidSelection();
   }
 
   test_bad_operator() {
@@ -694,6 +703,64 @@
 ''');
   }
 
+  test_getter_classMember_instance() {
+    indexTestUnit(r'''
+class A {
+  int f;
+  int get result => f + 1;
+}
+main(A a) {
+  print(a.result);
+}
+''');
+    _createRefactoring('result =>');
+    // validate change
+    return _assertSuccessfulRefactoring(r'''
+class A {
+  int f;
+}
+main(A a) {
+  print(a.f + 1);
+}
+''');
+  }
+
+  test_getter_classMember_static() {
+    indexTestUnit(r'''
+class A {
+  static int get result => 1 + 2;
+}
+main() {
+  print(A.result);
+}
+''');
+    _createRefactoring('result =>');
+    // validate change
+    return _assertSuccessfulRefactoring(r'''
+class A {
+}
+main() {
+  print(1 + 2);
+}
+''');
+  }
+
+  test_getter_topLevel() {
+    indexTestUnit(r'''
+String get message => 'Hello, World!';
+main() {
+  print(message);
+}
+''');
+    _createRefactoring('message =>');
+    // validate change
+    return _assertSuccessfulRefactoring(r'''
+main() {
+  print('Hello, World!');
+}
+''');
+  }
+
   test_initialMode_all() {
     indexTestUnit(r'''
 test(a, b) {
@@ -931,6 +998,22 @@
 ''');
   }
 
+  test_reference_expressionBody() {
+    indexTestUnit(r'''
+String message() => 'Hello, World!';
+main() {
+  print(message);
+}
+''');
+    _createRefactoring('message()');
+    // validate change
+    return _assertSuccessfulRefactoring(r'''
+main() {
+  print(() => 'Hello, World!');
+}
+''');
+  }
+
   test_reference_noStatement() {
     indexTestUnit(r'''
 test(a, b) {
@@ -999,6 +1082,48 @@
 ''');
   }
 
+  test_setter_classMember_instance() {
+    indexTestUnit(r'''
+class A {
+  int f;
+  void set result(x) {
+    f = x + 1;
+  }
+}
+main(A a) {
+  a.result = 5;
+}
+''');
+    _createRefactoring('result(x)');
+    // validate change
+    return _assertSuccessfulRefactoring(r'''
+class A {
+  int f;
+}
+main(A a) {
+  a.f = 5 + 1;
+}
+''');
+  }
+
+  test_setter_topLevel() {
+    indexTestUnit(r'''
+void set result(x) {
+  print(x + 1);
+}
+main() {
+  result = 5;
+}
+''');
+    _createRefactoring('result(x)');
+    // validate change
+    return _assertSuccessfulRefactoring(r'''
+main() {
+  print(5 + 1);
+}
+''');
+  }
+
   test_singleExpression_oneUsage() {
     indexTestUnit(r'''
 test(a, b) {
@@ -1158,6 +1283,11 @@
     });
   }
 
+  Future _assertInvalidSelection() {
+    return _assertConditionsFatal(
+        'Method declaration or reference must be selected to activate this refactoring.');
+  }
+
   Future _assertSuccessfulRefactoring(String expectedCode) {
     return refactoring.checkInitialConditions().then((status) {
       assertRefactoringStatusOK(status);
diff --git a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
index e4e2f7b..2cb4674 100644
--- a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -8,9 +8,9 @@
     RefactoringProblemSeverity;
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
-import '../../reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../reflective_tests.dart';
 import 'abstract_refactoring.dart';
 
 
@@ -463,6 +463,72 @@
         expectedMessage: "Import prefix name must not start or end with a blank.");
   }
 
+  void test_validateLabelName_OK() {
+    assertRefactoringStatusOK(validateLabelName("newName"));
+  }
+
+  void test_validateLabelName_OK_leadingDollar() {
+    assertRefactoringStatusOK(validateLabelName("\$newName"));
+  }
+
+  void test_validateLabelName_OK_leadingUnderscore() {
+    assertRefactoringStatusOK(validateLabelName("_newName"));
+  }
+
+  void test_validateLabelName_OK_middleUnderscore() {
+    assertRefactoringStatusOK(validateLabelName("new_name"));
+  }
+
+  void test_validateLabelName_doesNotStartWithLowerCase() {
+    assertRefactoringStatus(
+        validateLabelName("NewName"),
+        RefactoringProblemSeverity.WARNING,
+        expectedMessage: "Label name should start with a lowercase letter.");
+  }
+
+  void test_validateLabelName_empty() {
+    assertRefactoringStatus(
+        validateLabelName(""),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Label name must not be empty.");
+  }
+
+  void test_validateLabelName_leadingBlanks() {
+    assertRefactoringStatus(
+        validateLabelName(" newName"),
+        RefactoringProblemSeverity.ERROR,
+        expectedMessage: "Label name must not start or end with a blank.");
+  }
+
+  void test_validateLabelName_notIdentifierMiddle() {
+    assertRefactoringStatus(
+        validateLabelName("new-Name"),
+        RefactoringProblemSeverity.ERROR,
+        expectedMessage: "Label name must not contain '-'.");
+  }
+
+  void test_validateLabelName_notIdentifierStart() {
+    assertRefactoringStatus(
+        validateLabelName("2newName"),
+        RefactoringProblemSeverity.ERROR,
+        expectedMessage:
+            "Label name must begin with a lowercase letter or underscore.");
+  }
+
+  void test_validateLabelName_null() {
+    assertRefactoringStatus(
+        validateLabelName(null),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Label name must not be null.");
+  }
+
+  void test_validateLabelName_trailingBlanks() {
+    assertRefactoringStatus(
+        validateLabelName("newName "),
+        RefactoringProblemSeverity.ERROR,
+        expectedMessage: "Label name must not start or end with a blank.");
+  }
+
   void test_validateLibraryName_OK_oneIdentifier() {
     assertRefactoringStatusOK(validateLibraryName("name"));
   }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_label_test.dart b/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
new file mode 100644
index 0000000..cc8268d
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.refactoring.rename_label;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'abstract_rename.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(RenameLabelTest);
+}
+
+
+@ReflectiveTestCase()
+class RenameLabelTest extends RenameRefactoringTest {
+  test_checkNewName_LocalVariableElement() {
+    indexTestUnit('''
+main() {
+test:
+  while (true) {
+    break test;
+  }
+}
+''');
+    createRenameRefactoringAtString('test:');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Label name must not be null.");
+    // empty
+    refactoring.newName = '';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Label name must not be empty.");
+    // OK
+    refactoring.newName = 'newName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_createChange() {
+    indexTestUnit('''
+main() {
+test:
+  while (true) {
+    break test;
+  }
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test:');
+    expect(refactoring.refactoringName, 'Rename Label');
+    expect(refactoring.elementKindName, 'label');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+main() {
+newName:
+  while (true) {
+    break newName;
+  }
+}
+''');
+  }
+
+  test_oldName() {
+    indexTestUnit('''
+main() {
+test:
+  while (true) {
+    break test;
+  }
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test:');
+    // old name
+    expect(refactoring.oldName, 'test');
+  }
+}
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 50724d1..059b81d 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -5,9 +5,9 @@
 library test.services.refactoring.rename_local;
 
 import 'package:analysis_server/src/protocol.dart';
-import '../../reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../reflective_tests.dart';
 import 'abstract_rename.dart';
 
 
@@ -126,6 +126,20 @@
     return assertRefactoringConditionsOK();
   }
 
+  test_checkFinalConditions_shadows_OK_namedParameterReference() {
+    indexTestUnit('''
+void f({newName}) {}
+main() {
+  var test = 0;
+  f(newName: test);
+}
+''');
+    createRenameRefactoringAtString('test = 0');
+    // check status
+    refactoring.newName = 'newName';
+    return assertRefactoringFinalConditionsOK();
+  }
+
   test_checkFinalConditions_shadows_classMember() {
     indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/services/refactoring/test_all.dart b/pkg/analysis_server/test/services/refactoring/test_all.dart
index ab761a5..8ea3a50 100644
--- a/pkg/analysis_server/test/services/refactoring/test_all.dart
+++ b/pkg/analysis_server/test/services/refactoring/test_all.dart
@@ -14,6 +14,7 @@
 import 'rename_class_member_test.dart' as rename_class_member_test;
 import 'rename_constructor_test.dart' as rename_constructor_test;
 import 'rename_import_test.dart' as rename_import_test;
+import 'rename_label_test.dart' as rename_label_test;
 import 'rename_library_test.dart' as rename_library_test;
 import 'rename_local_test.dart' as rename_local_test;
 import 'rename_unit_member_test.dart' as rename_unit_member_test;
@@ -30,6 +31,7 @@
     rename_class_member_test.main();
     rename_constructor_test.main();
     rename_import_test.main();
+    rename_label_test.main();
     rename_library_test.main();
     rename_local_test.main();
     rename_unit_member_test.main();
diff --git a/pkg/analysis_server/test/services/search/hierarchy_test.dart b/pkg/analysis_server/test/services/search/hierarchy_test.dart
index 65820bf..879d035 100644
--- a/pkg/analysis_server/test/services/search/hierarchy_test.dart
+++ b/pkg/analysis_server/test/services/search/hierarchy_test.dart
@@ -10,11 +10,12 @@
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
-import '../../abstract_single_unit.dart';
-import '../../reflective_tests.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../abstract_single_unit.dart';
+import '../../reflective_tests.dart';
+
 
 main() {
   groupSep = ' | ';
@@ -72,10 +73,12 @@
     ClassElement classB = findElement("B");
     ClassMemberElement memberA = classA.constructors[0];
     ClassMemberElement memberB = classB.constructors[0];
-    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
+    var futureA =
+        getHierarchyMembers(searchEngine, memberA, false).then((members) {
       expect(members, unorderedEquals([memberA]));
     });
-    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
+    var futureB =
+        getHierarchyMembers(searchEngine, memberB, false).then((members) {
       expect(members, unorderedEquals([memberB]));
     });
     return Future.wait([futureA, futureB]);
@@ -105,16 +108,20 @@
     ClassMemberElement memberB = classB.fields[0];
     ClassMemberElement memberC = classC.fields[0];
     ClassMemberElement memberD = classD.fields[0];
-    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
+    var futureA =
+        getHierarchyMembers(searchEngine, memberA, false).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
+    var futureB =
+        getHierarchyMembers(searchEngine, memberB, false).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureC = getHierarchyMembers(searchEngine, memberC).then((members) {
+    var futureC =
+        getHierarchyMembers(searchEngine, memberC, false).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureD = getHierarchyMembers(searchEngine, memberD).then((members) {
+    var futureD =
+        getHierarchyMembers(searchEngine, memberD, false).then((members) {
       expect(members, unorderedEquals([memberD]));
     });
     return Future.wait([futureA, futureB, futureC, futureD]);
@@ -148,24 +155,62 @@
     ClassMemberElement memberC = classC.methods[0];
     ClassMemberElement memberD = classD.methods[0];
     ClassMemberElement memberE = classE.methods[0];
-    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
+    var futureA =
+        getHierarchyMembers(searchEngine, memberA, false).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
+    var futureB =
+        getHierarchyMembers(searchEngine, memberB, false).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureC = getHierarchyMembers(searchEngine, memberC).then((members) {
+    var futureC =
+        getHierarchyMembers(searchEngine, memberC, false).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureD = getHierarchyMembers(searchEngine, memberD).then((members) {
+    var futureD =
+        getHierarchyMembers(searchEngine, memberD, false).then((members) {
       expect(members, unorderedEquals([memberD, memberE]));
     });
-    var futureE = getHierarchyMembers(searchEngine, memberE).then((members) {
+    var futureE =
+        getHierarchyMembers(searchEngine, memberE, false).then((members) {
       expect(members, unorderedEquals([memberD, memberE]));
     });
     return Future.wait([futureA, futureB, futureC, futureD, futureE]);
   }
 
+  Future test_getHierarchyMembers_methods_onlySuper() {
+    _indexTestUnit('''
+class A {
+  foo() {}
+}
+class B extends A {
+  foo() {}
+}
+class C extends B {
+  foo() {}
+}
+''');
+    ClassElement classA = findElement("A");
+    ClassElement classB = findElement("B");
+    ClassElement classC = findElement("C");
+    ClassMemberElement memberA = classA.methods[0];
+    ClassMemberElement memberB = classB.methods[0];
+    ClassMemberElement memberC = classC.methods[0];
+    var futureA =
+        getHierarchyMembers(searchEngine, memberA, true).then((members) {
+      expect(members, unorderedEquals([memberA]));
+    });
+    var futureB =
+        getHierarchyMembers(searchEngine, memberB, true).then((members) {
+      expect(members, unorderedEquals([memberA, memberB]));
+    });
+    var futureC =
+        getHierarchyMembers(searchEngine, memberC, true).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberC]));
+    });
+    return Future.wait([futureA, futureB, futureC]);
+  }
+
   Future test_getHierarchyMembers_withInterfaces() {
     _indexTestUnit('''
 class A {
@@ -191,13 +236,16 @@
     ClassMemberElement memberA = classA.methods[0];
     ClassMemberElement memberB = classB.methods[0];
     ClassMemberElement memberD = classD.methods[0];
-    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
+    var futureA =
+        getHierarchyMembers(searchEngine, memberA, false).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberD]));
     });
-    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
+    var futureB =
+        getHierarchyMembers(searchEngine, memberB, false).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberD]));
     });
-    var futureD = getHierarchyMembers(searchEngine, memberD).then((members) {
+    var futureD =
+        getHierarchyMembers(searchEngine, memberD, false).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberD]));
     });
     return Future.wait([futureA, futureB, futureD]);
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index bfc91c6..b559f24 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -10,14 +10,15 @@
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
-import '../../abstract_single_unit.dart';
-import '../../mocks.dart';
-import '../../reflective_tests.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../abstract_single_unit.dart';
+import '../../mocks.dart';
+import '../../reflective_tests.dart';
+
 
 main() {
   groupSep = ' | ';
@@ -418,6 +419,26 @@
     return _verifyReferences(element, expected);
   }
 
+  Future test_searchReferences_LabelElement() {
+    _indexTestUnit('''
+main() {
+label:
+  while (true) {
+    if (true) {
+      break label; // 1
+    }
+    break label; // 2
+  }
+}
+''');
+    LabelElement element = findElement('label');
+    Element mainElement = findElement('main');
+    var expected = [
+        _expectId(mainElement, MatchKind.REFERENCE, 'label; // 1'),
+        _expectId(mainElement, MatchKind.REFERENCE, 'label; // 2')];
+    return _verifyReferences(element, expected);
+  }
+
   Future test_searchReferences_MethodElement() {
     _indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 5fcd0e6..081d527 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -20,6 +20,9 @@
         SocketServerTest.createAnalysisServer_successful);
     test('createAnalysisServer_alreadyStarted',
         SocketServerTest.createAnalysisServer_alreadyStarted);
+    test('requestHandler_exception', SocketServerTest.requestHandler_exception);
+    test('requestHandler_futureException',
+        SocketServerTest.requestHandler_futureException);
   });
 }
 
@@ -61,4 +64,58 @@
       channel2.expectMsgCount(responseCount: 2);
     });
   }
+
+  static Future requestHandler_exception() {
+    SocketServer server = new SocketServer(DirectoryBasedDartSdk.defaultSdk);
+    MockServerChannel channel = new MockServerChannel();
+    server.createAnalysisServer(channel);
+    channel.expectMsgCount(notificationCount: 1);
+    expect(channel.notificationsReceived[0].event, SERVER_CONNECTED);
+    _MockRequestHandler handler = new _MockRequestHandler(false);
+    server.analysisServer.handlers = [handler];
+    var request = new ServerGetVersionParams().toRequest('0');
+    return channel.sendRequest(request).then((Response response) {
+      expect(response.id, equals('0'));
+      expect(response.error, isNotNull);
+      expect(response.error.code, equals(RequestErrorCode.SERVER_ERROR));
+      expect(response.error.message, equals('mock request exception'));
+      expect(response.error.stackTrace, isNotNull);
+      expect(response.error.stackTrace, isNot(isEmpty));
+      channel.expectMsgCount(responseCount: 1, notificationCount: 1);
+    });
+  }
+
+  static Future requestHandler_futureException() {
+    SocketServer server = new SocketServer(DirectoryBasedDartSdk.defaultSdk);
+    MockServerChannel channel = new MockServerChannel();
+    server.createAnalysisServer(channel);
+    _MockRequestHandler handler = new _MockRequestHandler(true);
+    server.analysisServer.handlers = [handler];
+    var request = new ServerGetVersionParams().toRequest('0');
+    return channel.sendRequest(request).then((Response response) {
+      expect(response.id, equals('0'));
+      expect(response.error, isNull);
+      channel.expectMsgCount(responseCount: 1, notificationCount: 2);
+      expect(channel.notificationsReceived[1].event, SERVER_ERROR);
+    });
+  }
+}
+
+class _MockRequestHandler implements RequestHandler {
+  final bool futureException;
+
+  _MockRequestHandler(this.futureException);
+
+  @override
+  Response handleRequest(Request request) {
+    if (futureException) {
+      new Future(throwException);
+      return new Response(request.id);
+    }
+    throw 'mock request exception';
+  }
+
+  void throwException() {
+    throw 'mock future exception';
+  }
 }
diff --git a/pkg/analysis_server/tool/spec/codegen_tools.dart b/pkg/analysis_server/tool/spec/codegen_tools.dart
index 4c1210c..f97c8bb 100644
--- a/pkg/analysis_server/tool/spec/codegen_tools.dart
+++ b/pkg/analysis_server/tool/spec/codegen_tools.dart
@@ -146,7 +146,7 @@
  * the License.
  * 
  * This file has been automatically generated.  Please do not edit it manually.
- * To regenerate the file, use the script "pkg/analysis_server/spec/generate_files".
+ * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
  */''';
     } else {
       header = '''
@@ -156,7 +156,7 @@
 //
 // This file has been automatically generated.  Please do not edit it manually.
 // To regenerate the file, use the script
-// "pkg/analysis_server/spec/generate_files".
+// "pkg/analysis_server/tool/spec/generate_files".
 ''';
     }
     writeln(header.trim());
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 08cfae0..54c0a58 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1527,8 +1527,10 @@
           An enumeration of the possible types of analysis errors.
         </p>
         <enum>
+          <value><code>ANGULAR</code></value>
           <value><code>COMPILE_TIME_ERROR</code></value>
           <value><code>HINT</code></value>
+          <value><code>POLYMER</code></value>
           <value><code>STATIC_TYPE_WARNING</code></value>
           <value><code>STATIC_WARNING</code></value>
           <value><code>SYNTACTIC_ERROR</code></value>
@@ -1813,6 +1815,7 @@
           <value><code>GETTER</code></value>
           <value><code>IMPORT</code></value>
           <value><code>KEYWORD</code></value>
+          <value><code>LABEL</code></value>
           <value><code>LIBRARY_PREFIX</code></value>
           <value><code>LOCAL_VARIABLE</code></value>
           <value><code>METHOD</code></value>
@@ -1898,6 +1901,7 @@
           <value><code>FUNCTION</code></value>
           <value><code>FUNCTION_TYPE_ALIAS</code></value>
           <value><code>GETTER</code></value>
+          <value><code>LABEL</code></value>
           <value><code>LIBRARY</code></value>
           <value><code>LOCAL_VARIABLE</code></value>
           <value><code>METHOD</code></value>
@@ -2047,6 +2051,7 @@
           <value><code>IDENTIFIER_DEFAULT</code></value>
           <value><code>IMPORT_PREFIX</code></value>
           <value><code>KEYWORD</code></value>
+          <value><code>LABEL</code></value>
           <value><code>LITERAL_BOOLEAN</code></value>
           <value><code>LITERAL_DOUBLE</code></value>
           <value><code>LITERAL_INTEGER</code></value>
@@ -2585,11 +2590,11 @@
               A short description of the error.
             </p>
           </field>
-          <field name="data" optional="true">
-            <ref>object</ref>
+          <field name="stackTrace" optional="true">
+            <ref>String</ref>
             <p>
-              Additional data related to the error. This field is
-              omitted if there is no additional data available.
+              The stack trace associated with processing the request,
+              used for debugging the server.
             </p>
           </field>
         </object>
@@ -2642,6 +2647,13 @@
             </p>
           </value>
           <value>
+            <code>SERVER_ERROR</code>
+            <p>
+              An internal error occurred in the analysis server.
+              Also see the server.error notification.
+            </p>
+          </value>
+          <value>
             <code>UNANALYZED_PRIORITY_FILES</code>
             <p>
               An "analysis.setPriorityFiles" request includes one or
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index 114fb0f..e66c5e1 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -250,7 +250,7 @@
         PubPackageMapProvider pubPackageMapProvider =
             new PubPackageMapProvider(PhysicalResourceProvider.INSTANCE, sdk);
         PackageMapInfo packageMapInfo = pubPackageMapProvider.computePackageMap(
-            PhysicalResourceProvider.INSTANCE.getResource(''));
+            PhysicalResourceProvider.INSTANCE.getResource('.'));
         resolvers.add(
             new PackageMapUriResolver(
                 PhysicalResourceProvider.INSTANCE,
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 1a7a21d..11a096b 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -6021,25 +6021,6 @@
         return annotation.element;
       }
     }
-    // Type name in InstanceCreationExpression
-    {
-      AstNode typeNameCandidate = parent;
-      // new prefix.node[.constructorName]()
-      if (typeNameCandidate is PrefixedIdentifier) {
-        PrefixedIdentifier prefixedIdentifier = typeNameCandidate as PrefixedIdentifier;
-        if (identical(prefixedIdentifier.identifier, node)) {
-          typeNameCandidate = prefixedIdentifier.parent;
-        }
-      }
-      // new typeName[.constructorName]()
-      if (typeNameCandidate is TypeName) {
-        TypeName typeName = typeNameCandidate as TypeName;
-        if (typeName.parent is ConstructorName) {
-          ConstructorName constructorName = typeName.parent as ConstructorName;
-          return constructorName.staticElement;
-        }
-      }
-    }
     // Extra work to map Constructor Declarations to their associated Constructor Elements
     if (parent is ConstructorDeclaration) {
       ConstructorDeclaration decl = parent;
@@ -10193,7 +10174,7 @@
   EvaluationResultImpl get evaluationResult => _result;
 
   @override
-  int get precedence => 15;
+  int get precedence => 16;
 
   /**
    * Return `true` if this creation expression is used to invoke a constant constructor.
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 2cb282a..f5025e8 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -5285,7 +5285,7 @@
    *
    * @param element the element representing the declaration of the function type
    */
-  FunctionTypeImpl.con1(ExecutableElement element) : super(element, element == null ? null : element.name);
+  FunctionTypeImpl.con1(ExecutableElement element) : super(element, null);
 
   /**
    * Initialize a newly created function type to be declared by the given element and to have the
@@ -9103,12 +9103,11 @@
  */
 abstract class ParameterElement implements LocalElement, VariableElement {
   /**
-   * Return a source range that covers the portion of the source in which the default value for this
-   * parameter is specified, or `null` if there is no default value.
+   * Return the Dart code of the default value, or `null` if no default value.
    *
-   * @return the range of characters in which the default value of this parameter is specified
+   * @return the Dart code of the default value
    */
-  SourceRange get defaultValueRange;
+  String get defaultValueCode;
 
   /**
    * Return the kind of this parameter.
@@ -9149,15 +9148,9 @@
   ParameterKind parameterKind;
 
   /**
-   * The offset to the beginning of the default value range for this element.
+   * The Dart code of the default value.
    */
-  int _defaultValueRangeOffset = 0;
-
-  /**
-   * The length of the default value range for this element, or `-1` if this element does not
-   * have a default value.
-   */
-  int _defaultValueRangeLength = -1;
+  String _defaultValueCode;
 
   /**
    * The offset to the beginning of the visible range for this element.
@@ -9205,12 +9198,7 @@
   }
 
   @override
-  SourceRange get defaultValueRange {
-    if (_defaultValueRangeLength < 0) {
-      return null;
-    }
-    return new SourceRange(_defaultValueRangeOffset, _defaultValueRangeLength);
-  }
+  String get defaultValueCode => _defaultValueCode;
 
   @override
   ElementKind get kind => ElementKind.PARAMETER;
@@ -9250,16 +9238,10 @@
   }
 
   /**
-   * Set the range of the default value for this parameter to the range starting at the given offset
-   * with the given length.
-   *
-   * @param offset the offset to the beginning of the default value range for this element
-   * @param length the length of the default value range for this element, or `-1` if this
-   *          element does not have a default value
+   * Set Dart code of the default value.
    */
-  void setDefaultValueRange(int offset, int length) {
-    _defaultValueRangeOffset = offset;
-    _defaultValueRangeLength = length;
+  void set defaultValueCode(String defaultValueCode) {
+    this._defaultValueCode = StringUtilities.intern(defaultValueCode);
   }
 
   /**
@@ -9322,6 +9304,15 @@
     builder.append(type);
     builder.append(" ");
     builder.append(displayName);
+    if (_defaultValueCode != null) {
+      if (parameterKind == ParameterKind.NAMED) {
+        builder.append(": ");
+      }
+      if (parameterKind == ParameterKind.POSITIONAL) {
+        builder.append(" = ");
+      }
+      builder.append(_defaultValueCode);
+    }
   }
 }
 
@@ -9397,7 +9388,7 @@
   ParameterElement get baseElement => super.baseElement as ParameterElement;
 
   @override
-  SourceRange get defaultValueRange => baseElement.defaultValueRange;
+  String get defaultValueCode => baseElement.defaultValueCode;
 
   @override
   Element get enclosingElement => baseElement.enclosingElement;
@@ -11117,7 +11108,8 @@
 class UnionTypeImpl extends TypeImpl implements UnionType {
   /**
    * Any unions in the `types` will be flattened in the returned union. If there is only one
-   * type after flattening then it will be returned directly, instead of a singleton union.
+   * type after flattening then it will be returned directly, instead of a singleton union. Nulls
+   * are discarded, unless all types are null, in which case an exception is raised.
    *
    * @param types the `Type`s to union
    * @return a `Type` comprising the `Type`s in `types`
@@ -11128,10 +11120,17 @@
       if (t is UnionType) {
         set.addAll(t.elements);
       } else {
-        set.add(t);
+        if (t != null) {
+          set.add(t);
+        }
       }
     }
     if (set.length == 0) {
+      // TODO(collinsn): better to return [null] here? The use case is e.g.
+      //
+      //   union(null, null) ==> null;
+      //
+      // instead of raising an exception.
       throw new IllegalArgumentException("No known use case for empty unions.");
     } else if (set.length == 1) {
       return new JavaIterator(set).next();
diff --git a/pkg/analyzer/lib/src/generated/element_handle.dart b/pkg/analyzer/lib/src/generated/element_handle.dart
index 6addb24..328a37b 100644
--- a/pkg/analyzer/lib/src/generated/element_handle.dart
+++ b/pkg/analyzer/lib/src/generated/element_handle.dart
@@ -813,7 +813,7 @@
   ParameterElementHandle(ParameterElement element) : super(element);
 
   @override
-  SourceRange get defaultValueRange => actualElement.defaultValueRange;
+  String get defaultValueCode => actualElement.defaultValueCode;
 
   @override
   ElementKind get kind => ElementKind.PARAMETER;
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 79ccb0c..ae155e2 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -78,6 +78,11 @@
         return _partitions[i].get(source);
       }
     }
+    //
+    // We should never get to this point because the last partition should always be a universal
+    // partition, except in the case of the SDK context, in which case the source should always be
+    // part of the SDK.
+    //
     return null;
   }
 
@@ -89,6 +94,28 @@
   int get astSize => _partitions[_partitions.length - 1].astSize;
 
   /**
+   * Return context that owns the given source.
+   *
+   * @param source the source whose context is to be returned
+   * @return the context that owns the partition that contains the source
+   */
+  InternalAnalysisContext getContextFor(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        return _partitions[i].context;
+      }
+    }
+    //
+    // We should never get to this point because the last partition should always be a universal
+    // partition, except in the case of the SDK context, in which case the source should always be
+    // part of the SDK.
+    //
+    AnalysisEngine.instance.logger.logInformation2("Could not find context for ${source.fullName}", new JavaException());
+    return null;
+  }
+
+  /**
    * Return information about each of the partitions in this cache.
    *
    * @return information about each of the partitions in this cache
@@ -923,7 +950,13 @@
    * A set containing information about the tasks that have been performed since the last change
    * notification. Used to detect infinite loops in [performAnalysisTask].
    */
-  HashSet<String> _recentTasks = new HashSet<String>();
+  LinkedHashSet<String> _recentTasks = new LinkedHashSet<String>();
+
+  /**
+   * A flag indicating whether we have already reported an infinite loop in
+   * [performAnalysisTask].
+   */
+  bool _reportedLoop = false;
 
   /**
    * The object used to synchronize access to all of the caches. The rules related to the use of
@@ -967,7 +1000,7 @@
    */
   AnalysisContextImpl() : super() {
     _resultRecorder = new AnalysisContextImpl_AnalysisTaskResultRecorder(this);
-    _privatePartition = new UniversalCachePartition(AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, new AnalysisContextImpl_ContextRetentionPolicy(this));
+    _privatePartition = new UniversalCachePartition(this, AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, new AnalysisContextImpl_ContextRetentionPolicy(this));
     _cache = createCacheFromSourceFactory(null);
   }
 
@@ -1005,6 +1038,7 @@
       return;
     }
     _recentTasks.clear();
+    _reportedLoop = false;
     //
     // First, compute the list of sources that have been removed.
     //
@@ -1303,6 +1337,12 @@
   }
 
   @override
+  InternalAnalysisContext getContextFor(Source source) {
+    InternalAnalysisContext context = _cache.getContextFor(source);
+    return context == null ? this : context;
+  }
+
+  @override
   DeclaredVariables get declaredVariables => _declaredVariables;
 
   @override
@@ -1731,14 +1771,16 @@
       return new AnalysisResult(_getChangeNotices(true), getEnd - getStart, null, -1);
     }
     String taskDescription = task.toString();
-    //    if (recentTasks.add(taskDescription)) {
-    //      logInformation("Performing task: " + taskDescription);
-    //    } else {
-    //      if (TRACE_PERFORM_TASK) {
-    //        System.out.print("* ");
-    //      }
-    //      logInformation("*** Performing repeated task: " + taskDescription);
-    //    }
+    if (!_reportedLoop && !_recentTasks.add(taskDescription)) {
+      PrintStringWriter writer = new PrintStringWriter();
+      writer.print("Performing repeated task: ");
+      writer.println(taskDescription);
+      for (String description in _recentTasks) {
+        writer.print("  ");
+        writer.println(description);
+      }
+      _logInformation(writer.toString());
+    }
     _notifyAboutToPerformTask(taskDescription);
     if (_TRACE_PERFORM_TASK) {
       print(taskDescription);
@@ -1785,13 +1827,24 @@
       if (dartEntry != null) {
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         _recordElementData(dartCopy, library, library.source, htmlSource);
-        dartCopy.setValue(DartEntry.SCAN_ERRORS, AnalysisError.NO_ERRORS);
+        dartCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
+        dartCopy.setValue(SourceEntry.LINE_INFO, new LineInfo(<int> [0]));
+        dartCopy.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS);
+        // DartEntry.ELEMENT - set in recordElementData
+        dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+        dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+        dartCopy.setValue(DartEntry.INCLUDED_PARTS, Source.EMPTY_ARRAY);
+        // DartEntry.IS_CLIENT - set in recordElementData
+        // DartEntry.IS_LAUNCHABLE - set in recordElementData
         dartCopy.setValue(DartEntry.PARSE_ERRORS, AnalysisError.NO_ERRORS);
         dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+        dartCopy.setState(DartEntry.PUBLIC_NAMESPACE, CacheState.FLUSHED);
+        dartCopy.setValue(DartEntry.SCAN_ERRORS, AnalysisError.NO_ERRORS);
+        dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+        dartCopy.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED);
         dartCopy.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource, AnalysisError.NO_ERRORS);
         dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.FLUSHED);
         dartCopy.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, AnalysisError.NO_ERRORS);
-        dartCopy.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS);
         dartCopy.setValueInLibrary(DartEntry.HINTS, librarySource, AnalysisError.NO_ERRORS);
         _cache.put(librarySource, dartCopy);
       }
@@ -1882,6 +1935,7 @@
   @override
   void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) {
     _recentTasks.clear();
+    _reportedLoop = false;
     String originalContents = _contentCache.setContents(source, contents);
     if (contents != null) {
       if (contents != originalContents) {
@@ -1906,6 +1960,7 @@
   @override
   void setContents(Source source, String contents) {
     _recentTasks.clear();
+    _reportedLoop = false;
     String originalContents = _contentCache.setContents(source, contents);
     if (contents != null) {
       if (contents != originalContents) {
@@ -3731,6 +3786,8 @@
       }
     }
     _removeFromPartsUsingMap(oldPartMap);
+    _recentTasks.clear();
+    _reportedLoop = false;
   }
 
   /**
@@ -6761,7 +6818,7 @@
     } on AnalysisException catch (exception) {
       throw exception;
     } catch (exception, stackTrace) {
-      throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
+      throw new AnalysisException(exception.toString(), new CaughtException(exception, stackTrace));
     }
   }
 }
@@ -7468,7 +7525,7 @@
     _unitElement = new CompilationUnitElementImpl(unitName);
     _unitElement.source = _source;
     // create LibraryElementImpl
-    _libraryElement = new LibraryElementImpl.forNode(_context, null);
+    _libraryElement = new LibraryElementImpl.forNode(_context.getContextFor(_source), null);
     _libraryElement.definingCompilationUnit = _unitElement;
     _libraryElement.angularHtml = true;
     _injectedLibraries.add(_libraryElement);
@@ -7832,9 +7889,10 @@
  */
 abstract class CachePartition {
   /**
-   * A table mapping the sources known to the context to the information known about the source.
+   * The context that owns this partition. Multiple contexts can reference a partition, but only one
+   * context can own it.
    */
-  HashMap<Source, SourceEntry> _sourceMap = new HashMap<Source, SourceEntry>();
+  final InternalAnalysisContext context;
 
   /**
    * The maximum number of sources for which AST structures should be kept in the cache.
@@ -7847,6 +7905,12 @@
   final CacheRetentionPolicy _retentionPolicy;
 
   /**
+   * A table mapping the sources belonging to this partition to the information known about those
+   * sources.
+   */
+  HashMap<Source, SourceEntry> _sourceMap = new HashMap<Source, SourceEntry>();
+
+  /**
    * A list containing the most recently accessed sources with the most recently used at the end of
    * the list. When more sources are added than the maximum allowed then the least recently used
    * source will be removed and will have it's cached AST structure flushed.
@@ -7857,12 +7921,13 @@
    * Initialize a newly created cache to maintain at most the given number of AST structures in the
    * cache.
    *
+   * @param context the context that owns this partition
    * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
    *          the cache
    * @param retentionPolicy the policy used to determine which pieces of data to remove from the
    *          cache
    */
-  CachePartition(int maxCacheSize, this._retentionPolicy) {
+  CachePartition(this.context, int maxCacheSize, this._retentionPolicy) {
     this._maxCacheSize = maxCacheSize;
     _recentlyUsed = new List<Source>();
   }
@@ -11793,6 +11858,18 @@
   TimestampedData<String> getContents(Source source) => _basis.getContents(source);
 
   @override
+  InternalAnalysisContext getContextFor(Source source) {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getContextFor");
+    _checkThread(instrumentation);
+    try {
+      instrumentation.metric3("contextId", _contextId);
+      return _basis.getContextFor(source);
+    } finally {
+      instrumentation.log();
+    }
+  }
+
+  @override
   DeclaredVariables get declaredVariables => _basis.declaredVariables;
 
   @override
@@ -12360,6 +12437,14 @@
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext);
 
   /**
+   * Return context that owns the given source.
+   *
+   * @param source the source whose context is to be returned
+   * @return the context that owns the partition that contains the source
+   */
+  InternalAnalysisContext getContextFor(Source source);
+
+  /**
    * Return an array containing all of the sources that have been marked as priority sources.
    * Clients must not modify the returned array.
    *
@@ -13142,7 +13227,7 @@
   SdkCachePartition forSdk(DartSdk sdk) {
     SdkCachePartition partition = _sdkPartitions[sdk];
     if (partition == null) {
-      partition = new SdkCachePartition(_DEFAULT_SDK_CACHE_SIZE);
+      partition = new SdkCachePartition(sdk.context as InternalAnalysisContext, _DEFAULT_SDK_CACHE_SIZE);
       _sdkPartitions[sdk] = partition;
     }
     return partition;
@@ -14724,10 +14809,11 @@
   /**
    * Initialize a newly created partition.
    *
+   * @param context the context that owns this partition
    * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
    *          the cache
    */
-  SdkCachePartition(int maxCacheSize) : super(maxCacheSize, DefaultRetentionPolicy.POLICY);
+  SdkCachePartition(InternalAnalysisContext context, int maxCacheSize) : super(context, maxCacheSize, DefaultRetentionPolicy.POLICY);
 
   @override
   bool contains(Source source) => source.isInSystemLibrary;
@@ -15278,12 +15364,13 @@
   /**
    * Initialize a newly created partition.
    *
+   * @param context the context that owns this partition
    * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
    *          the cache
    * @param retentionPolicy the policy used to determine which pieces of data to remove from the
    *          cache
    */
-  UniversalCachePartition(int maxCacheSize, CacheRetentionPolicy retentionPolicy) : super(maxCacheSize, retentionPolicy);
+  UniversalCachePartition(InternalAnalysisContext context, int maxCacheSize, CacheRetentionPolicy retentionPolicy) : super(context, maxCacheSize, retentionPolicy);
 
   @override
   bool contains(Source source) => true;
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index e1b4218..b37168a 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -1760,7 +1760,8 @@
         argument = parseArgument();
         arguments.add(argument);
         if (foundNamedArgument) {
-          if (!generatedError && argument is! NamedExpression) {
+          bool blankArgument = argument is SimpleIdentifier && (argument as SimpleIdentifier).name.isEmpty;
+          if (!generatedError && !(argument is NamedExpression && !blankArgument)) {
             // Report the error, once, but allow the arguments to be in any order in the AST.
             _reportErrorForCurrentToken(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
             generatedError = true;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 380a35d..3b64b51 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -3605,7 +3605,7 @@
       initializer.parameters = holder.parameters;
       initializer.synthetic = true;
       parameter.initializer = initializer;
-      parameter.setDefaultValueRange(defaultValue.offset, defaultValue.length);
+      parameter.defaultValueCode = defaultValue.toSource();
     }
     // visible range
     _setParameterVisibleRange(node, parameter);
@@ -4669,6 +4669,77 @@
   }
 
   /**
+   * Return a method representing the merge of the given elements. The type of the merged element is
+   * the component-wise union of the types of the given elements. If not all input elements have the
+   * same shape then [null] is returned.
+   *
+   * @param elements the `ExecutableElement`s to merge
+   * @return an `ExecutableElement` representing the merge of `elements`
+   */
+  static ExecutableElement _computeMergedExecutableElement(Set<ExecutableElement> elements) {
+    List<ExecutableElement> elementArrayToMerge = new List.from(elements);
+    if (elementArrayToMerge.length == 0) {
+      return null;
+    } else {
+      // Flatten methods structurally. Based on
+      // [InheritanceManager.computeMergedExecutableElement] and
+      // [InheritanceManager.createSyntheticExecutableElement].
+      //
+      // However, the approach we take here is much simpler, but expected to work
+      // well in the common case. It degrades gracefully in the uncommon case,
+      // by computing the type [dynamic] for the method, preventing any
+      // hints from being generated (TODO: not done yet).
+      //
+      // The approach is: we require that each [ExecutableElement] has the
+      // same shape: the same number of required, optional positional, and optional named
+      // parameters, in the same positions, and with the named parameters in the
+      // same order. We compute a type by unioning pointwise.
+      ExecutableElement e_0 = elementArrayToMerge[0];
+      List<ParameterElement> ps_0 = e_0.parameters;
+      List<ParameterElementImpl> ps_out = new List<ParameterElementImpl>(ps_0.length);
+      for (int j = 0; j < ps_out.length; j++) {
+        ps_out[j] = new ParameterElementImpl(ps_0[j].name, 0);
+        ps_out[j].synthetic = true;
+        ps_out[j].type = ps_0[j].type;
+        ps_out[j].parameterKind = ps_0[j].parameterKind;
+      }
+      DartType r_out = e_0.returnType;
+      for (int i = 1; i < elementArrayToMerge.length; i++) {
+        ExecutableElement e_i = elementArrayToMerge[i];
+        r_out = UnionTypeImpl.union([r_out, e_i.returnType]);
+        List<ParameterElement> ps_i = e_i.parameters;
+        // Each function must have the same number of params.
+        if (ps_0.length != ps_i.length) {
+          return null;
+        } else {
+          // Each function must have the same kind of params, with the same names,
+          // in the same order.
+          for (int j = 0; j < ps_i.length; j++) {
+            if (ps_0[j].parameterKind != ps_i[j].parameterKind || !identical(ps_0[j].name, ps_i[j].name)) {
+              return null;
+            } else {
+              // The output parameter type is the union of the input parameter types.
+              ps_out[j].type = UnionTypeImpl.union([ps_out[j].type, ps_i[j].type]);
+            }
+          }
+        }
+      }
+      // TODO (collinsn): this code should work for functions and methods,
+      // so we may want [FunctionElementImpl]
+      // instead here in some cases? And then there are constructors and property accessors.
+      // Maybe the answer is to create a new subclass of [ExecutableElementImpl] which
+      // is used for merged executable elements, in analogy with [MultiplyInheritedMethodElementImpl]
+      // and [MultiplyInheritedPropertyAcessorElementImpl].
+      ExecutableElementImpl e_out = new MethodElementImpl(e_0.name, 0);
+      e_out.synthetic = true;
+      e_out.returnType = r_out;
+      e_out.parameters = ps_out;
+      e_out.type = new FunctionTypeImpl.con1(e_out);
+      return e_out;
+    }
+  }
+
+  /**
    * Return `true` if the given identifier is the return type of a constructor declaration.
    *
    * @return `true` if the given identifier is the return type of a constructor declaration.
@@ -6237,6 +6308,19 @@
       }
       return _lookUpMethodInInterfaces(interfaceType, false, methodName, new HashSet<ClassElement>());
     }
+    if (type is UnionType) {
+      Set<ExecutableElement> methods = new HashSet<ExecutableElement>();
+      for (DartType t in type.elements) {
+        MethodElement m = _lookUpMethod(target, t, methodName);
+        if (m != null) {
+          methods.add(m);
+        }
+      }
+      // TODO (collinsn): I want [computeMergedExecutableElement] to be general
+      // and work with functions, methods, constructors, and property accessors. However,
+      // I won't be able to assume it returns [MethodElement] here then.
+      return _computeMergedExecutableElement(methods) as MethodElement;
+    }
     return null;
   }
 
@@ -6609,6 +6693,7 @@
     List<ParameterElement> resolvedParameters = new List<ParameterElement>(argumentCount);
     int positionalArgumentCount = 0;
     HashSet<String> usedNames = new HashSet<String>();
+    bool noBlankArguments = true;
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
@@ -6626,16 +6711,19 @@
           _resolver.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name]);
         }
       } else {
+        if (argument is SimpleIdentifier && argument.name.isEmpty) {
+          noBlankArguments = false;
+        }
         positionalArgumentCount++;
         if (unnamedIndex < unnamedParameterCount) {
           resolvedParameters[i] = unnamedParameters[unnamedIndex++];
         }
       }
     }
-    if (positionalArgumentCount < requiredParameters.length) {
+    if (positionalArgumentCount < requiredParameters.length && noBlankArguments) {
       ErrorCode errorCode = (reportError ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS);
       _resolver.reportErrorForNode(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
-    } else if (positionalArgumentCount > unnamedParameterCount) {
+    } else if (positionalArgumentCount > unnamedParameterCount && noBlankArguments) {
       ErrorCode errorCode = (reportError ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS);
       _resolver.reportErrorForNode(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
     }
@@ -6751,14 +6839,14 @@
    * @return the element being invoked
    */
   Element _resolveInvokedElementWithTarget(Expression target, DartType targetType, SimpleIdentifier methodName) {
-    if (targetType is InterfaceType) {
-      InterfaceType classType = targetType;
-      Element element = _lookUpMethod(target, classType, methodName.name);
+    if (targetType is InterfaceType || targetType is UnionType) {
+      Element element = _lookUpMethod(target, targetType, methodName.name);
       if (element == null) {
         //
         // If there's no method, then it's possible that 'm' is a getter that returns a function.
         //
-        element = _lookUpGetter(target, classType, methodName.name);
+        // TODO (collinsn): need to add union type support here too, in the style of [lookUpMethod].
+        element = _lookUpGetter(target, targetType, methodName.name);
       }
       return element;
     } else if (target is SimpleIdentifier) {
@@ -14028,8 +14116,6 @@
    * <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
-   * bounds instead of dynamic
    */
   static ExecutableElement _computeMergedExecutableElement(List<ExecutableElement> elementArrayToMerge) {
     int h = _getNumOfPositionalParameters(elementArrayToMerge[0]);
@@ -15412,7 +15498,7 @@
     //
     // Create and populate the library element.
     //
-    LibraryElementImpl libraryElement = new LibraryElementImpl.forNode(_analysisContext, libraryNameNode);
+    LibraryElementImpl libraryElement = new LibraryElementImpl.forNode(_analysisContext.getContextFor(librarySource), libraryNameNode);
     libraryElement.definingCompilationUnit = definingCompilationUnitElement;
     if (entryPoint != null) {
       libraryElement.entryPoint = entryPoint;
@@ -15496,7 +15582,7 @@
     //
     // Create and populate the library element.
     //
-    LibraryElementImpl libraryElement = new LibraryElementImpl.forNode(_analysisContext, libraryNameNode);
+    LibraryElementImpl libraryElement = new LibraryElementImpl.forNode(_analysisContext.getContextFor(librarySource), libraryNameNode);
     libraryElement.definingCompilationUnit = definingCompilationUnitElement;
     if (entryPoint != null) {
       libraryElement.entryPoint = entryPoint;
@@ -18507,7 +18593,10 @@
   @override
   Object visitAsExpression(AsExpression node) {
     super.visitAsExpression(node);
-    overrideExpression(node.expression, node.type.type);
+    // Since an as-statement doesn't actually change the type, we don't
+    // let it affect the propagated type when it would result in a loss
+    // of precision.
+    overrideExpression(node.expression, node.type.type, false);
     return null;
   }
 
@@ -18820,7 +18909,7 @@
     try {
       super.visitFieldDeclaration(node);
     } finally {
-      HashMap<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
+      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
@@ -18912,7 +19001,7 @@
   Object visitIfStatement(IfStatement node) {
     Expression condition = node.condition;
     safelyVisit(condition);
-    HashMap<Element, DartType> thenOverrides = null;
+    Map<Element, DartType> thenOverrides = null;
     Statement thenStatement = node.thenStatement;
     if (thenStatement != null) {
       _overrideManager.enterScope();
@@ -18934,7 +19023,7 @@
         _overrideManager.exitScope();
       }
     }
-    HashMap<Element, DartType> elseOverrides = null;
+    Map<Element, DartType> elseOverrides = null;
     Statement elseStatement = node.elseStatement;
     if (elseStatement != null) {
       _overrideManager.enterScope();
@@ -18960,10 +19049,16 @@
       if (elseOverrides != null) {
         _overrideManager.applyOverrides(elseOverrides);
       }
+    } else if (!thenIsAbrupt && !elseIsAbrupt) {
+      // It would be more precise to ignore the existing override for any variable that
+      // is overridden in both branches.
+      if (thenOverrides != null) {
+        _overrideManager.mergeOverrides(thenOverrides);
+      }
+      if (elseOverrides != null) {
+        _overrideManager.mergeOverrides(elseOverrides);
+      }
     }
-    // TODO(collinsn): union the [thenOverrides] and [elseOverrides] if both branches
-    // are not abrupt. If both branches are abrupt, then we can mark the
-    // remaining code as dead.
     return null;
   }
 
@@ -19086,7 +19181,7 @@
     try {
       super.visitTopLevelVariableDeclaration(node);
     } finally {
-      HashMap<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
+      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
@@ -19214,32 +19309,36 @@
    * @param expression the expression used to access the static and propagated elements whose types
    *          might be overridden
    * @param potentialType the potential type of the elements
+   * @param allowPrecisionLoss see @{code overrideVariable} docs
    */
-  void overrideExpression(Expression expression, DartType potentialType) {
+  void overrideExpression(Expression expression, DartType potentialType, bool allowPrecisionLoss) {
     VariableElement element = getOverridableStaticElement(expression);
     if (element != null) {
-      overrideVariable(element, potentialType);
+      overrideVariable(element, potentialType, allowPrecisionLoss);
     }
     element = getOverridablePropagatedElement(expression);
     if (element != null) {
-      overrideVariable(element, potentialType);
+      overrideVariable(element, potentialType, allowPrecisionLoss);
     }
   }
 
   /**
    * If it is appropriate to do so, override the current type of the given element with the given
-   * type. Generally speaking, it is appropriate if the given type is more specific than the current
    * type.
    *
    * @param element the element whose type might be overridden
    * @param potentialType the potential type of the element
+   * @param allowPrecisionLoss true if `potentialType` is allowed to be less precise than the
+   *          current best type
    */
-  void overrideVariable(VariableElement element, DartType potentialType) {
+  void overrideVariable(VariableElement element, DartType potentialType, bool allowPrecisionLoss) {
     if (potentialType == null || potentialType.isBottom) {
       return;
     }
     DartType currentType = _getBestType(element);
-    if (currentType == null || !currentType.isMoreSpecificThan(potentialType)) {
+    // If we aren't allowing precision loss then the third condition checks that we
+    // aren't losing precision.
+    if (currentType == null || allowPrecisionLoss || !currentType.isMoreSpecificThan(potentialType)) {
       if (element is PropertyInducingElement) {
         PropertyInducingElement variable = element;
         if (!variable.isConst && !variable.isFinal) {
@@ -19271,14 +19370,14 @@
           LocalVariableElement loopElement = loopVariable.element;
           if (loopElement != null) {
             DartType iteratorElementType = _getIteratorElementType(iterator);
-            overrideVariable(loopElement, iteratorElementType);
+            overrideVariable(loopElement, iteratorElementType, true);
             _recordPropagatedType(loopVariable.identifier, iteratorElementType);
           }
         } else if (identifier != null && iterator != null) {
           Element identifierElement = identifier.staticElement;
           if (identifierElement is VariableElement) {
             DartType iteratorElementType = _getIteratorElementType(iterator);
-            overrideVariable(identifierElement, iteratorElementType);
+            overrideVariable(identifierElement, iteratorElementType, true);
             _recordPropagatedType(identifier, iteratorElementType);
           }
         }
@@ -19475,7 +19574,7 @@
     //
     // In the presence of exceptions things become much more complicated, but while
     // we only use this to propagate at [if]-statement join points, checking for [return]
-    // is probably sound.
+    // may work well enough in the common case.
     if (statement is ReturnStatement) {
       return true;
     } else if (statement is ExpressionStatement) {
@@ -19486,6 +19585,21 @@
       if (size == 0) {
         return false;
       }
+      // This last-statement-is-return heuristic is unsound for adversarial code,
+      // but probably works well in the common case:
+      //
+      //   var x = 123;
+      //   var c = true;
+      //   L: if (c) {
+      //     x = "hello";
+      //     c = false;
+      //     break L;
+      //     return;
+      //   }
+      //   print(x);
+      //
+      // Unsound to assume that [x = "hello";] never executed after the if-statement.
+      // Of course, a dead-code analysis could point out that [return] here is dead.
       return _isAbruptTerminationStatement(statements[size - 1]);
     }
     return false;
@@ -19597,7 +19711,10 @@
     } else if (condition is IsExpression) {
       IsExpression is2 = condition;
       if (is2.notOperator != null) {
-        overrideExpression(is2.expression, is2.type.type);
+        // Since an is-statement doesn't actually change the type, we don't
+        // let it affect the propagated type when it would result in a loss
+        // of precision.
+        overrideExpression(is2.expression, is2.type.type, false);
       }
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition;
@@ -19634,7 +19751,10 @@
     } else if (condition is IsExpression) {
       IsExpression is2 = condition;
       if (is2.notOperator == null) {
-        overrideExpression(is2.expression, is2.type.type);
+        // Since an is-statement doesn't actually change the type, we don't
+        // let it affect the propagated type when it would result in a loss
+        // of precision.
+        overrideExpression(is2.expression, is2.type.type, false);
       }
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition;
@@ -20831,7 +20951,7 @@
         }
         overrideType = propagatedType;
       }
-      _resolver.overrideExpression(node.leftHandSide, overrideType);
+      _resolver.overrideExpression(node.leftHandSide, overrideType, true);
     } else {
       ExecutableElement staticMethodElement = node.staticElement;
       DartType staticType = _computeStaticReturnType(staticMethodElement);
@@ -21832,7 +21952,7 @@
       _recordPropagatedType(name, rightType);
       VariableElement element = name.staticElement as VariableElement;
       if (element != null) {
-        _resolver.overrideVariable(element, rightType);
+        _resolver.overrideVariable(element, rightType, true);
       }
     }
     return null;
@@ -22516,7 +22636,7 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(HashMap<Element, DartType> overrides) {
+  void applyOverrides(Map<Element, DartType> overrides) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot apply overrides without a scope");
     }
@@ -22529,7 +22649,7 @@
    *
    * @return the overrides in the current scope
    */
-  HashMap<Element, DartType> captureLocalOverrides() {
+  Map<Element, DartType> captureLocalOverrides() {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture local overrides without a scope");
     }
@@ -22543,7 +22663,7 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  HashMap<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
+  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture overrides without a scope");
     }
@@ -22582,6 +22702,15 @@
   }
 
   /**
+   * Merge new overrides with existing overrides using union types.
+   *
+   * @param overrides the new overrides to merge in.
+   */
+  void mergeOverrides(Map<Element, DartType> overrides) {
+    _currentScope.mergeOverrides(overrides);
+  }
+
+  /**
    * Set the overridden type of the given element to the given type
    *
    * @param element the element whose type might have been overridden
@@ -22608,7 +22737,7 @@
   /**
    * A table mapping elements to the overridden type of that element.
    */
-  HashMap<Element, DartType> _overridenTypes = new HashMap<Element, DartType>();
+  Map<Element, DartType> _overridenTypes = new HashMap<Element, DartType>();
 
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
@@ -22622,7 +22751,7 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(HashMap<Element, DartType> overrides) {
+  void applyOverrides(Map<Element, DartType> overrides) {
     for (MapEntry<Element, DartType> entry in getMapEntrySet(overrides)) {
       _overridenTypes[entry.getKey()] = entry.getValue();
     }
@@ -22634,7 +22763,7 @@
    *
    * @return the overrides in the current scope
    */
-  HashMap<Element, DartType> captureLocalOverrides() => _overridenTypes;
+  Map<Element, DartType> captureLocalOverrides() => _overridenTypes;
 
   /**
    * Return a map from the elements for the variables in the given list that have their types
@@ -22643,8 +22772,8 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  HashMap<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
-    HashMap<Element, DartType> overrides = new HashMap<Element, DartType>();
+  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
+    Map<Element, DartType> overrides = new HashMap<Element, DartType>();
     if (variableList.isConst || variableList.isFinal) {
       for (VariableDeclaration variable in variableList.variables) {
         Element element = variable.element;
@@ -22680,6 +22809,18 @@
   }
 
   /**
+   * Merge new overrides with existing overrides using union types.
+   *
+   * @param overrides the new overrides to merge in.
+   */
+  void mergeOverrides(Map<Element, DartType> overrides) {
+    for (MapEntry<Element, DartType> entry in getMapEntrySet(overrides)) {
+      Element key = entry.getKey();
+      _overridenTypes[key] = UnionTypeImpl.union([_overridenTypes[key], entry.getValue()]);
+    }
+  }
+
+  /**
    * Set the overridden type of the given element to the given type
    *
    * @param element the element whose type might have been overridden
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 246ed83..046ac5e 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -276,7 +276,7 @@
   String get path;
 
   /**
-   * Return the short name of the library. This is the name used after `dart:` in a URI.
+   * Return the short name of the library. This is the URI of the library, including `dart:`.
    *
    * @return the short name of the library
    */
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 24b9997..1bbc2c2 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.23.0-dev.1
+version: 0.23.0-dev.4
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/all_the_rest.dart b/pkg/analyzer/test/generated/all_the_rest.dart
index 27c303e..32069d1 100644
--- a/pkg/analyzer/test/generated/all_the_rest.dart
+++ b/pkg/analyzer/test/generated/all_the_rest.dart
@@ -8631,7 +8631,7 @@
 //     ElementHolder holder = new ElementHolder();
 //     ElementBuilder builder = new ElementBuilder(holder);
 //     String parameterName = "p";
-//     DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3(parameterName), AstFactory.identifier3("b"));
+//     DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3(parameterName), AstFactory.identifier3("42"));
 //     _useParameterInMethod(formalParameter, 100, 110);
 //     formalParameter.accept(builder);
 //     List<ParameterElement> parameters = holder.parameters;
@@ -8644,6 +8644,7 @@
 //     JUnitTestCase.assertFalse(parameter.isSynthetic);
 //     JUnitTestCase.assertEquals(ParameterKind.NAMED, parameter.parameterKind);
 //     JUnitTestCase.assertEquals(SourceRangeFactory.rangeStartEnd(100, 110), parameter.visibleRange);
+//     JUnitTestCase.assertEquals("42", parameter.defaultValueCode);
 //     FunctionElement initializer = parameter.initializer;
 //     JUnitTestCase.assertNotNull(initializer);
 //     JUnitTestCase.assertTrue(initializer.isSynthetic);
@@ -9128,25 +9129,29 @@
 //     SimpleIdentifier identifier = AstFactory.identifier3("A");
 //     PrefixedIdentifier prefixedIdentifier = AstFactory.identifier4("pref", identifier);
 //     InstanceCreationExpression creation = AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName3(prefixedIdentifier, []), []);
-//     // set ConstructorElement
+//     // set ClassElement
 //     ClassElement classElement = ElementFactory.classElement2("A", []);
+//     identifier.staticElement = classElement;
+//     // set ConstructorElement
 //     ConstructorElement constructorElement = ElementFactory.constructorElement2(classElement, null, []);
 //     creation.constructorName.staticElement = constructorElement;
 //     // verify that "A" is resolved to ConstructorElement
 //     Element element = ElementLocator.locate(identifier);
-//     JUnitTestCase.assertSame(constructorElement, element);
+//     JUnitTestCase.assertSame(classElement, element);
 //   }
 //   void test_locate_InstanceCreationExpression_type_simpleIdentifier() {
 //     // prepare: new A()
 //     SimpleIdentifier identifier = AstFactory.identifier3("A");
 //     InstanceCreationExpression creation = AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName3(identifier, []), []);
-//     // set ConstructorElement
+//     // set ClassElement
 //     ClassElement classElement = ElementFactory.classElement2("A", []);
+//     identifier.staticElement = classElement;
+//     // set ConstructorElement
 //     ConstructorElement constructorElement = ElementFactory.constructorElement2(classElement, null, []);
 //     creation.constructorName.staticElement = constructorElement;
 //     // verify that "A" is resolved to ConstructorElement
 //     Element element = ElementLocator.locate(identifier);
-//     JUnitTestCase.assertSame(constructorElement, element);
+//     JUnitTestCase.assertSame(classElement, element);
 //   }
 //   void test_locate_LibraryDirective() {
 //     AstNode id = _findNodeIn("library", ["library foo;"]);
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index 3fc3472..0c2e29c 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -33,7 +33,7 @@
 //     JUnitTestCase.assertNull(cache.get(source));
 //   }
 //   void test_iterator() {
-//     CachePartition partition = new UniversalCachePartition(8, new DefaultRetentionPolicy());
+//     CachePartition partition = new UniversalCachePartition(null, 8, new DefaultRetentionPolicy());
 //     AnalysisCache cache = new AnalysisCache(<CachePartition> [partition]);
 //     TestSource source = new TestSource();
 //     DartEntryImpl entry = new DartEntryImpl();
@@ -45,7 +45,7 @@
 //     JUnitTestCase.assertFalse(iterator.moveNext());
 //   }
 //   void test_put_noFlush() {
-//     CachePartition partition = new UniversalCachePartition(8, new DefaultRetentionPolicy());
+//     CachePartition partition = new UniversalCachePartition(null, 8, new DefaultRetentionPolicy());
 //     AnalysisCache cache = new AnalysisCache(<CachePartition> [partition]);
 //     TestSource source = new TestSource();
 //     DartEntryImpl entry = new DartEntryImpl();
@@ -53,7 +53,7 @@
 //     JUnitTestCase.assertSame(entry, cache.get(source));
 //   }
 //   void test_setMaxCacheSize() {
-//     CachePartition partition = new UniversalCachePartition(8, new CacheRetentionPolicy_AnalysisCacheTest_test_setMaxCacheSize());
+//     CachePartition partition = new UniversalCachePartition(null, 8, new CacheRetentionPolicy_AnalysisCacheTest_test_setMaxCacheSize());
 //     AnalysisCache cache = new AnalysisCache(<CachePartition> [partition]);
 //     int size = 6;
 //     for (int i = 0; i < size; i++) {
@@ -69,7 +69,7 @@
 //     _assertNonFlushedCount(newSize, cache);
 //   }
 //   void test_size() {
-//     CachePartition partition = new UniversalCachePartition(8, new DefaultRetentionPolicy());
+//     CachePartition partition = new UniversalCachePartition(null, 8, new DefaultRetentionPolicy());
 //     AnalysisCache cache = new AnalysisCache(<CachePartition> [partition]);
 //     int size = 4;
 //     for (int i = 0; i < size; i++) {
@@ -5251,18 +5251,18 @@
 // }
 // class SdkCachePartitionTest extends EngineTestCase {
 //   void test_contains_false() {
-//     SdkCachePartition partition = new SdkCachePartition(8);
+//     SdkCachePartition partition = new SdkCachePartition(null, 8);
 //     Source source = new TestSource();
 //     JUnitTestCase.assertFalse(partition.contains(source));
 //   }
 //   void test_contains_true() {
-//     SdkCachePartition partition = new SdkCachePartition(8);
+//     SdkCachePartition partition = new SdkCachePartition(null, 8);
 //     SourceFactory factory = new SourceFactory([new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
 //     Source source = factory.forUri("dart:core");
 //     JUnitTestCase.assertTrue(partition.contains(source));
 //   }
 //   void test_creation() {
-//     JUnitTestCase.assertNotNull(new SdkCachePartition(8));
+//     JUnitTestCase.assertNotNull(new SdkCachePartition(null, 8));
 //   }
 //   static dartSuite() {
 //     _ut.group('SdkCachePartitionTest', () {
@@ -5397,6 +5397,11 @@
 //     JUnitTestCase.fail("Unexpected invocation of getContentsToReceiver");
 //   }
 //   @override
+//   InternalAnalysisContext getContextFor(Source source) {
+//     JUnitTestCase.fail("Unexpected invocation of getContextFor");
+//     return null;
+//   }
+//   @override
 //   DeclaredVariables get declaredVariables {
 //     JUnitTestCase.fail("Unexpected invocation of getDeclaredVariables");
 //     return null;
@@ -6541,15 +6546,15 @@
 // }
 // class UniversalCachePartitionTest extends EngineTestCase {
 //   void test_contains() {
-//     UniversalCachePartition partition = new UniversalCachePartition(8, null);
+//     UniversalCachePartition partition = new UniversalCachePartition(null, 8, null);
 //     TestSource source = new TestSource();
 //     JUnitTestCase.assertTrue(partition.contains(source));
 //   }
 //   void test_creation() {
-//     JUnitTestCase.assertNotNull(new UniversalCachePartition(8, null));
+//     JUnitTestCase.assertNotNull(new UniversalCachePartition(null, 8, null));
 //   }
 //   void test_entrySet() {
-//     UniversalCachePartition partition = new UniversalCachePartition(8, null);
+//     UniversalCachePartition partition = new UniversalCachePartition(null, 8, null);
 //     TestSource source = new TestSource();
 //     DartEntryImpl entry = new DartEntryImpl();
 //     partition.put(source, entry);
@@ -6561,19 +6566,19 @@
 //     JUnitTestCase.assertFalse(entries.hasNext);
 //   }
 //   void test_get() {
-//     UniversalCachePartition partition = new UniversalCachePartition(8, null);
+//     UniversalCachePartition partition = new UniversalCachePartition(null, 8, null);
 //     TestSource source = new TestSource();
 //     JUnitTestCase.assertNull(partition.get(source));
 //   }
 //   void test_put_noFlush() {
-//     UniversalCachePartition partition = new UniversalCachePartition(8, null);
+//     UniversalCachePartition partition = new UniversalCachePartition(null, 8, null);
 //     TestSource source = new TestSource();
 //     DartEntryImpl entry = new DartEntryImpl();
 //     partition.put(source, entry);
 //     JUnitTestCase.assertSame(entry, partition.get(source));
 //   }
 //   void test_remove() {
-//     UniversalCachePartition partition = new UniversalCachePartition(8, null);
+//     UniversalCachePartition partition = new UniversalCachePartition(null, 8, null);
 //     TestSource source = new TestSource();
 //     DartEntryImpl entry = new DartEntryImpl();
 //     partition.put(source, entry);
@@ -6582,7 +6587,7 @@
 //     JUnitTestCase.assertNull(partition.get(source));
 //   }
 //   void test_setMaxCacheSize() {
-//     UniversalCachePartition partition = new UniversalCachePartition(8, new CacheRetentionPolicy_UniversalCachePartitionTest_test_setMaxCacheSize());
+//     UniversalCachePartition partition = new UniversalCachePartition(null, 8, new CacheRetentionPolicy_UniversalCachePartitionTest_test_setMaxCacheSize());
 //     int size = 6;
 //     for (int i = 0; i < size; i++) {
 //       Source source = new TestSource.con1(FileUtilities2.createFile("/test${i}.dart"), "");
@@ -6597,7 +6602,7 @@
 //     _assertNonFlushedCount(newSize, partition);
 //   }
 //   void test_size() {
-//     UniversalCachePartition partition = new UniversalCachePartition(8, null);
+//     UniversalCachePartition partition = new UniversalCachePartition(null, 8, null);
 //     int size = 4;
 //     for (int i = 0; i < size; i++) {
 //       Source source = new TestSource.con1(FileUtilities2.createFile("/test${i}.dart"), "");
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 9d5693f..89ad0bb 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -63,17 +63,17 @@
    * @return the analysis context that was created
    */
   static AnalysisContextImpl initContextWithCore(AnalysisContextImpl context) {
-    SourceFactory sourceFactory = new SourceFactory([
-        new DartUriResolver(DirectoryBasedDartSdk.defaultSdk),
-        new FileUriResolver()]);
+    DirectoryBasedDartSdk sdk = DirectoryBasedDartSdk.defaultSdk;
+    SourceFactory sourceFactory = new SourceFactory([new DartUriResolver(sdk), new FileUriResolver()]);
     context.sourceFactory = sourceFactory;
+    AnalysisContext coreContext = sdk.context;
     //
     // dart:core
     //
     TestTypeProvider provider = new TestTypeProvider();
     CompilationUnitElementImpl coreUnit = new CompilationUnitElementImpl("core.dart");
     Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
-    context.setContents(coreSource, "");
+    coreContext.setContents(coreSource, "");
     coreUnit.source = coreSource;
     ClassElementImpl proxyClassElement = ElementFactory.classElement2("_Proxy", []);
     coreUnit.types = <ClassElement> [
@@ -101,14 +101,14 @@
         deprecatedTopLevelVariableElt.getter,
         deprecatedTopLevelVariableElt.setter];
     coreUnit.topLevelVariables = <TopLevelVariableElement> [proxyTopLevelVariableElt, deprecatedTopLevelVariableElt];
-    LibraryElementImpl coreLibrary = new LibraryElementImpl.forNode(context, AstFactory.libraryIdentifier2(["dart", "core"]));
+    LibraryElementImpl coreLibrary = new LibraryElementImpl.forNode(coreContext, AstFactory.libraryIdentifier2(["dart", "core"]));
     coreLibrary.definingCompilationUnit = coreUnit;
     //
     // dart:async
     //
     CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl("async.dart");
     Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
-    context.setContents(asyncSource, "");
+    coreContext.setContents(asyncSource, "");
     asyncUnit.source = asyncSource;
     // Future
     ClassElementImpl futureElement = ElementFactory.classElement2("Future", ["T"]);
@@ -141,14 +141,14 @@
         completerElement,
         futureElement,
         ElementFactory.classElement2("Stream", ["T"])];
-    LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(context, AstFactory.libraryIdentifier2(["dart", "async"]));
+    LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(coreContext, AstFactory.libraryIdentifier2(["dart", "async"]));
     asyncLibrary.definingCompilationUnit = asyncUnit;
     //
     // dart:html
     //
     CompilationUnitElementImpl htmlUnit = new CompilationUnitElementImpl("html_dartium.dart");
     Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
-    context.setContents(htmlSource, "");
+    coreContext.setContents(htmlSource, "");
     htmlUnit.source = htmlSource;
     ClassElementImpl elementElement = ElementFactory.classElement2("Element", []);
     InterfaceType elementType = elementElement.type;
@@ -178,7 +178,7 @@
     TopLevelVariableElementImpl document = ElementFactory.topLevelVariableElement3("document", false, true, htmlDocumentElement.type);
     htmlUnit.topLevelVariables = <TopLevelVariableElement> [document];
     htmlUnit.accessors = <PropertyAccessorElement> [document.getter];
-    LibraryElementImpl htmlLibrary = new LibraryElementImpl.forNode(context, AstFactory.libraryIdentifier2(["dart", "dom", "html"]));
+    LibraryElementImpl htmlLibrary = new LibraryElementImpl.forNode(coreContext, AstFactory.libraryIdentifier2(["dart", "dom", "html"]));
     htmlLibrary.definingCompilationUnit = htmlUnit;
     HashMap<Source, LibraryElement> elementMap = new HashMap<Source, LibraryElement>();
     elementMap[coreSource] = coreLibrary;
@@ -16331,6 +16331,20 @@
 }
 
 class NonHintCodeTest extends ResolverTestCase {
+  void fail_issue20904BuggyTypePromotionAtIfJoin_2() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    Source source = addSource(EngineTestCase.createSource([
+        "f(var message) {",
+        "  if (message is Function) {",
+        "    message = '';",
+        "  }",
+        "  int s = message;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_deadCode_deadBlock_conditionalElse_debugConst() {
     Source source = addSource(EngineTestCase.createSource([
         "const bool DEBUG = true;",
@@ -16542,6 +16556,53 @@
         "main() { lib1.f(); }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
   }
 
+  void test_issue20904BuggyTypePromotionAtIfJoin_1() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    Source source = addSource(EngineTestCase.createSource([
+        "f(var message, var dynamic_) {",
+        "  if (message is Function) {",
+        "    message = dynamic_;",
+        "  }",
+        "  int s = message;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_issue20904BuggyTypePromotionAtIfJoin_3() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    Source source = addSource(EngineTestCase.createSource([
+        "f(var message) {",
+        "  var dynamic_;",
+        "  if (message is Function) {",
+        "    message = dynamic_;",
+        "  } else {",
+        "    return;",
+        "  }",
+        "  int s = message;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_issue20904BuggyTypePromotionAtIfJoin_4() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    Source source = addSource(EngineTestCase.createSource([
+        "f(var message) {",
+        "  if (message is Function) {",
+        "    message = '';",
+        "  } else {",
+        "    return;",
+        "  }",
+        "  String s = message;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_missingReturn_emptyFunctionBody() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int m();", "}"]));
     resolve(source);
@@ -17133,6 +17194,18 @@
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
       });
+      _ut.test('test_issue20904BuggyTypePromotionAtIfJoin_1', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_issue20904BuggyTypePromotionAtIfJoin_1);
+      });
+      _ut.test('test_issue20904BuggyTypePromotionAtIfJoin_3', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_issue20904BuggyTypePromotionAtIfJoin_3);
+      });
+      _ut.test('test_issue20904BuggyTypePromotionAtIfJoin_4', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_issue20904BuggyTypePromotionAtIfJoin_4);
+      });
       _ut.test('test_missingReturn_emptyFunctionBody', () {
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_missingReturn_emptyFunctionBody);
@@ -18501,7 +18574,6 @@
     }
     // get parameter
     Expression rhs = assignment.rightHandSide;
-    JUnitTestCase.assertNull(rhs.propagatedParameterElement);
     ParameterElement parameter = rhs.staticParameterElement;
     JUnitTestCase.assertNotNull(parameter);
     JUnitTestCase.assertEquals("x", parameter.displayName);
@@ -18536,7 +18608,6 @@
     }
     // get parameter
     Expression rhs = assignment.rightHandSide;
-    JUnitTestCase.assertNull(rhs.propagatedParameterElement);
     ParameterElement parameter = rhs.staticParameterElement;
     JUnitTestCase.assertNotNull(parameter);
     JUnitTestCase.assertEquals("x", parameter.displayName);
@@ -27358,6 +27429,20 @@
 }
 
 class TypePropagationTest extends ResolverTestCase {
+  void fail_issue20904BuggyTypePromotionAtIfJoin_2() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    String code = EngineTestCase.createSource([
+        "f(var message) {",
+        "  if (message is Function) {",
+        "    message = '';",
+        "  }",
+        "  message; // marker",
+        "}"]);
+    DartType t = _findMarkedIdentifier(code, "; // marker").propagatedType;
+    JUnitTestCase.assertFalse(typeProvider.stringType == t);
+    JUnitTestCase.assertFalse(typeProvider.functionType == t);
+  }
+
   void fail_mergePropagatedTypesAtJoinPoint_1() {
     // https://code.google.com/p/dart/issues/detail?id=19929
     _assertTypeOfMarkedExpression(EngineTestCase.createSource([
@@ -27421,32 +27506,6 @@
         "}"]), null, typeProvider.dynamicType);
   }
 
-  void fail_mergePropagatedTypesAtJoinPoint_6() {
-    // https://code.google.com/p/dart/issues/detail?id=19929
-    //
-    // Labeled [break]s are unsafe for the purposes of [isAbruptTerminationStatement].
-    //
-    // This is tricky: the [break] jumps back above the [if], making
-    // it into a loop of sorts. The [if] type-propagation code assumes
-    // that [break] does not introduce a loop.
-    String code = EngineTestCase.createSource([
-        "f() {",
-        "  var x = 0;",
-        "  var c = false;",
-        "  L: ",
-        "  if (c) {",
-        "  } else {",
-        "    x = '';",
-        "    c = true;",
-        "    break L;",
-        "  }",
-        "  x; // marker",
-        "}"]);
-    DartType t = _findMarkedIdentifier(code, "; // marker").propagatedType;
-    JUnitTestCase.assertTrue(typeProvider.intType.isSubtypeOf(t));
-    JUnitTestCase.assertTrue(typeProvider.stringType.isSubtypeOf(t));
-  }
-
   void fail_mergePropagatedTypesAtJoinPoint_7() {
     // https://code.google.com/p/dart/issues/detail?id=19929
     //
@@ -28249,6 +28308,59 @@
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
 
+  void test_issue20904BuggyTypePromotionAtIfJoin_5() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    //
+    // This is not an example of the 20904 bug, but rather,
+    // an example of something that one obvious fix changes inadvertently: we
+    // want to avoid using type information from is-checks when it
+    // loses precision. I can't see how to get a bad hint this way, since
+    // it seems the propagated type is not used to generate hints when a
+    // more precise type would cause no hint. For example, for code like the
+    // following, when the propagated type of [x] is [A] -- as happens for the
+    // fix these tests aim to warn against -- there is no warning for
+    // calling a method defined on [B] but not [A] (there aren't any, but pretend),
+    // but there is for calling a method not defined on either.
+    // By not overriding the propagated type via an is-check that loses
+    // precision, we get more precise completion under an is-check. However,
+    // I can only imagine strange code would make use of this feature.
+    //
+    // Here the is-check improves precision, so we use it.
+    String code = EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {}",
+        "f() {",
+        "  var a = new A();",
+        "  var b = new B();",
+        "  b; // B",
+        "  if (a is B) {",
+        "    return a; // marker",
+        "  }",
+        "}"]);
+    DartType tB = _findMarkedIdentifier(code, "; // B").propagatedType;
+    _assertTypeOfMarkedExpression(code, null, tB);
+  }
+
+  void test_issue20904BuggyTypePromotionAtIfJoin_6() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    //
+    // The other half of the *_5() test.
+    //
+    // Here the is-check loses precision, so we don't use it.
+    String code = EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {}",
+        "f() {",
+        "  var b = new B();",
+        "  b; // B",
+        "  if (b is A) {",
+        "    return b; // marker",
+        "  }",
+        "}"]);
+    DartType tB = _findMarkedIdentifier(code, "; // B").propagatedType;
+    _assertTypeOfMarkedExpression(code, null, tB);
+  }
+
   void test_listLiteral_different() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, '1', 2];", "  return v[2];", "}"]));
     LibraryElement library = resolve(source);
@@ -28340,6 +28452,32 @@
         "}"]), null, typeProvider.intType);
   }
 
+  void test_mergePropagatedTypesAtJoinPoint_6() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    //
+    // Labeled [break]s are unsafe for the purposes of [isAbruptTerminationStatement].
+    //
+    // This is tricky: the [break] jumps back above the [if], making
+    // it into a loop of sorts. The [if] type-propagation code assumes
+    // that [break] does not introduce a loop.
+    String code = EngineTestCase.createSource([
+        "f() {",
+        "  var x = 0;",
+        "  var c = false;",
+        "  L: ",
+        "  if (c) {",
+        "  } else {",
+        "    x = '';",
+        "    c = true;",
+        "    break L;",
+        "  }",
+        "  x; // marker",
+        "}"]);
+    DartType t = _findMarkedIdentifier(code, "; // marker").propagatedType;
+    JUnitTestCase.assertTrue(typeProvider.intType.isSubtypeOf(t));
+    JUnitTestCase.assertTrue(typeProvider.stringType.isSubtypeOf(t));
+  }
+
   void test_objectMethodOnDynamicExpression_doubleEquals() {
     // https://code.google.com/p/dart/issues/detail?id=20342
     //
@@ -28496,10 +28634,10 @@
   void _assertTypeOfMarkedExpression(String code, DartType expectedStaticType, DartType expectedPropagatedType) {
     SimpleIdentifier identifier = _findMarkedIdentifier(code, "; // marker");
     if (expectedStaticType != null) {
-      JUnitTestCase.assertSame(expectedStaticType, identifier.staticType);
+      JUnitTestCase.assertEquals(expectedStaticType, identifier.staticType);
     }
     if (expectedPropagatedType != null) {
-      JUnitTestCase.assertSame(expectedPropagatedType, identifier.propagatedType);
+      JUnitTestCase.assertEquals(expectedPropagatedType, identifier.propagatedType);
     }
   }
 
@@ -28676,6 +28814,14 @@
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_is_while);
       });
+      _ut.test('test_issue20904BuggyTypePromotionAtIfJoin_5', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_issue20904BuggyTypePromotionAtIfJoin_5);
+      });
+      _ut.test('test_issue20904BuggyTypePromotionAtIfJoin_6', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_issue20904BuggyTypePromotionAtIfJoin_6);
+      });
       _ut.test('test_listLiteral_different', () {
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_listLiteral_different);
@@ -28696,6 +28842,10 @@
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_mergePropagatedTypesAtJoinPoint_4);
       });
+      _ut.test('test_mergePropagatedTypesAtJoinPoint_6', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_mergePropagatedTypesAtJoinPoint_6);
+      });
       _ut.test('test_objectMethodOnDynamicExpression_doubleEquals', () {
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_objectMethodOnDynamicExpression_doubleEquals);
diff --git a/pkg/analyzer2dart/lib/src/cps_generator.dart b/pkg/analyzer2dart/lib/src/cps_generator.dart
index 966229a..db15b8f 100644
--- a/pkg/analyzer2dart/lib/src/cps_generator.dart
+++ b/pkg/analyzer2dart/lib/src/cps_generator.dart
@@ -17,36 +17,88 @@
 

 

 class CpsGeneratingVisitor extends RecursiveAstVisitor<ir.Node> {

-  final ElementConverter elementConverter;

+  final ElementConverter converter;

   final IrBuilder irBuilder = new IrBuilder();

 

-  CpsGeneratingVisitor(this.elementConverter);

+  CpsGeneratingVisitor(this.converter);

+

+  giveUp(String reason) {

+    throw new UnsupportedError(reason);

+  }

 

   @override

   ir.FunctionDefinition visitFunctionDeclaration(FunctionDeclaration node) {

     analyzer.FunctionElement function = node.element;

-    super.visitFunctionDeclaration(node);

+    function.parameters.forEach((analyzer.ParameterElement parameter) {

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

+      // accessed from an inner function.

+      irBuilder.createParameter(converter.convertElement(parameter),

+                                isClosureVariable: false);

+    });

+    // Visit the body directly to avoid processing the signature as expressions.

+    node.functionExpression.body.accept(this);

     return irBuilder.buildFunctionDefinition(

-        elementConverter.convertElement(function),

-            const [], const [], const []);

+        converter.convertElement(function), const [], const []);

   }

 

   @override

   visitMethodInvocation(MethodInvocation node) {

     analyzer.Element staticElement = node.methodName.staticElement;

     if (staticElement != null) {

-      dart2js.Element element = elementConverter.convertElement(staticElement);

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

+      List<ir.Definition> arguments = <ir.Definition>[];

+      for (Expression argument in node.argumentList.arguments) {

+        ir.Definition value = argument.accept(this);

+        if (value == null) {

+          giveUp('Unsupported argument: $argument (${argument.runtimeType}).');

+        }

+        arguments.add(value);

+      }

       return irBuilder.buildStaticInvocation(

-          element, createSelectorFromMethodInvocation(node), []);

+          element, createSelectorFromMethodInvocation(node), arguments);

     }

   }

 

   @override

-  visitIntegerLiteral(IntegerLiteral node) {

+  ir.Constant visitNullLiteral(NullLiteral node) {

+    return irBuilder.buildNullLiteral();

+  }

+

+  @override

+  ir.Constant visitBooleanLiteral(BooleanLiteral node) {

+    return irBuilder.buildBooleanLiteral(node.value);

+  }

+

+  @override

+  ir.Constant visitDoubleLiteral(DoubleLiteral node) {

+    return irBuilder.buildDoubleLiteral(node.value);

+  }

+

+  @override

+  ir.Constant visitIntegerLiteral(IntegerLiteral node) {

     return irBuilder.buildIntegerLiteral(node.value);

   }

 

   @override

+  visitAdjacentStrings(AdjacentStrings node) {

+    String value = node.stringValue;

+    if (value != null) {

+      return irBuilder.buildStringLiteral(value);

+    }

+    giveUp("Non constant adjacent strings.");

+  }

+

+  @override

+  ir.Constant visitSimpleStringLiteral(SimpleStringLiteral node) {

+    return irBuilder.buildStringLiteral(node.value);

+  }

+

+  @override

+  visitStringInterpolation(StringInterpolation node) {

+    giveUp("String interpolation.");

+  }

+

+  @override

   visitReturnStatement(ReturnStatement node) {

     if (node.expression != null) {

       irBuilder.buildReturn(node.expression.accept(this));

@@ -54,4 +106,18 @@
       irBuilder.buildReturn();

     }

   }

+

+  @override

+  visitSimpleIdentifier(SimpleIdentifier node) {

+    analyzer.Element element = node.staticElement;

+    if (element != null) {

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

+      if (dart2js.Elements.isLocal(target)) {

+        return irBuilder.buildGetLocal(target);

+      }

+      giveUp('Unhandled static reference: '

+             '$node -> $target (${target.runtimeType})');

+    }

+    giveUp('Unresolved identifier: $node.');

+  }

 }

diff --git a/pkg/analyzer2dart/lib/src/element_converter.dart b/pkg/analyzer2dart/lib/src/element_converter.dart
index 1fb29de..cfee653 100644
--- a/pkg/analyzer2dart/lib/src/element_converter.dart
+++ b/pkg/analyzer2dart/lib/src/element_converter.dart
@@ -10,9 +10,11 @@
 import 'package:compiler/implementation/elements/elements.dart' as dart2js;
 import 'package:compiler/implementation/elements/modelx.dart' as modelx;
 import 'package:compiler/implementation/util/util.dart' as util;
-import 'package:compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/dart_types.dart' as dart2js;
 import 'package:analyzer/src/generated/element.dart' as analyzer;
 
+part 'modely.dart';
+
 class ElementConverter {
   /// Map from analyzer elements to their equivalent dart2js elements.
   Map<analyzer.Element, dart2js.Element> conversionMap =
@@ -36,6 +38,55 @@
     });
   }
 
+  dart2js.FunctionType convertFunctionType(analyzer.FunctionType input) {
+    dart2js.DartType returnType = convertType(input.returnType);
+    List<dart2js.DartType> requiredParameterTypes =
+        input.normalParameterTypes.map(convertType).toList();
+    List<dart2js.DartType> positionalParameterTypes =
+            input.optionalParameterTypes.map(convertType).toList();
+    List<String> namedParameters =
+        input.namedParameterTypes.keys.toList()..sort();
+    List<dart2js.DartType> namedParameterTypes =
+        namedParameters.map((String name) {
+      return convertType(input.namedParameterTypes[name]);
+    }).toList();
+    return new dart2js.FunctionType.synthesized(
+        returnType,
+        requiredParameterTypes,
+        positionalParameterTypes,
+        namedParameters,
+        namedParameterTypes);
+  }
+
+  dart2js.DartType convertType(analyzer.DartType input) {
+    if (input.isVoid) {
+      return const dart2js.VoidType();
+    } else if (input.isDynamic) {
+      return const dart2js.DynamicType();
+    } else if (input is analyzer.TypeParameterType) {
+      return new dart2js.TypeVariableType(convertElement(input.element));
+    } else if (input is analyzer.InterfaceType) {
+      List<dart2js.DartType> typeArguments =
+          input.typeArguments.map(convertType).toList();
+      return new dart2js.InterfaceType(
+          convertElement(input.element), typeArguments);
+    } else if (input is analyzer.FunctionType) {
+      if (input.element is analyzer.FunctionTypeAliasElement) {
+        List<dart2js.DartType> typeArguments =
+            input.typeArguments.map(convertType).toList();
+        return new dart2js.ResolvedTypedefType(
+            convertElement(input.element),
+            typeArguments,
+            convertFunctionType(input));
+      } else {
+        assert(input.typeArguments.isEmpty);
+        return convertFunctionType(input);
+      }
+    }
+    throw new UnsupportedError(
+        "Conversion of $input (${input.runtimeType}) is not supported.");
+  }
+
   analyzer.Element invertElement(dart2js.Element input) {
     return inversionMap[input];
   }
@@ -64,369 +115,22 @@
   dart2js.FunctionElement visitFunctionElement(analyzer.FunctionElement input) {
     return new TopLevelFunctionElementY(converter, input);
   }
-}
-
-/// Base [dart2js.Element] implementation for converted analyzer elements.
-class ElementY extends dart2js.Element {
-  final ElementConverter converter;
-  final analyzer.Element element;
 
   @override
-  String get name => element.name;
-
-  ElementY(this.converter, this.element);
-
-  @override
-  dart2js.LibraryElement get implementationLibrary => library;
-
-  @override
-  dart2js.Element get origin => this;
-
-  @override
-  dart2js.Element get patch => null;
-
-  @override
-  dart2js.Element get declaration => this;
-
-  @override
-  dart2js.Element get implementation => this;
-
-  @override
-  bool get isPatch => false;
-
-  @override
-  bool get isPatched => false;
-
-  @override
-  dart2js.LibraryElement get library {
-    return converter.convertElement(element.library);
-  }
-
-  unsupported(String method) {
-    throw new UnsupportedError(
-        "'$method' is unsupported on $this ($runtimeType)");
-  }
-
-
-  @override
-  bool get isFinal => unsupported('isFinal');
-
-  @override
-  bool get isStatic => unsupported('isStatic');
-
-  @override
-  bool isForeign(_) => unsupported('isForeign');
-
-  @override
-  bool get impliesType => unsupported('impliesType');
-
-  @override
-  bool get isOperator => unsupported('impliesType');
-
-  @override
-  get position => unsupported('position');
-
-  @override
-  computeType(_) => unsupported('computeType');
-
-  @override
-  get enclosingElement => unsupported('enclosingElement');
-
-  @override
-  accept(_) => unsupported('accept');
-
-  @override
-  void addMetadata(_) => unsupported('addMetadata');
-
-  @override
-  get analyzableElement => unsupported('analyzableElement');
-
-  @override
-  asFunctionElement() => unsupported('asFunctionElement');
-
-  @override
-  buildScope() => unsupported('buildScope');
-
-  @override
-  get compilationUnit => unsupported('compilationUnit');
-
-  @override
-  get contextClass => unsupported('contextClass');
-
-  @override
-  void diagnose(context, listener) => unsupported('diagnose');
-
-  @override
-  get enclosingClass => unsupported('enclosingClass');
-
-  @override
-  get enclosingClassOrCompilationUnit {
-    return unsupported('enclosingClassOrCompilationUnit');
+  dart2js.ParameterElement visitParameterElement(
+      analyzer.ParameterElement input) {
+    return new ParameterElementY(converter, input);
   }
 
   @override
-  String get fixedBackendName => unsupported('fixedBackendName');
-
-  @override
-  bool get hasFixedBackendName => unsupported('hasFixedBackendName');
-
-  @override
-  bool get isAbstract => unsupported('isAbstract');
-
-  @override
-  bool get isAssignable => unsupported('isAssignable');
-
-  @override
-  bool get isClassMember => unsupported('isClassMember');
-
-  @override
-  bool get isClosure => unsupported('isClosure');
-
-  @override
-  bool get isConst => unsupported('isConst');
-
-  @override
-  bool get isDeclaration => unsupported('isDeclaration');
-
-  @override
-  bool get isDeferredLoaderGetter => unsupported('isDeferredLoaderGetter');
-
-  @override
-  bool get isFactoryConstructor => unsupported('isFactoryConstructor');
-
-  @override
-  bool get isForwardingConstructor => unsupported('isForwardingConstructor');
-
-  @override
-  bool get isImplementation => unsupported('isImplementation');
-
-  @override
-  bool get isInjected => unsupported('isInjected');
-
-  @override
-  bool get isInstanceMember => unsupported('isInstanceMember');
-
-  @override
-  bool get isMixinApplication => unsupported('isMixinApplication');
-
-  @override
-  bool get isNative => unsupported('isNative');
-
-  @override
-  bool get isSynthesized => unsupported('isSynthesized');
-
-  @override
-  bool get isTopLevel => unsupported('isTopLevel');
-
-  @override
-  get kind => unsupported('kind');
-
-  @override
-  get metadata => unsupported('metadata');
-
-  @override
-  get outermostEnclosingMemberOrTopLevel {
-    return unsupported('outermostEnclosingMemberOrTopLevel');
+  dart2js.ClassElement visitClassElement(analyzer.ClassElement input) {
+    return new ClassElementY(converter, input);
   }
 
   @override
-  void setFixedBackendName(String name) => unsupported('setFixedBackendName');
-
-  @override
-  void setNative(String name) => unsupported('setNative');
-}
-
-class LibraryElementY extends ElementY implements dart2js.LibraryElement {
-  analyzer.LibraryElement get element => super.element;
-
-  @override
-  dart2js.ElementKind get kind => dart2js.ElementKind.LIBRARY;
-
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isInternalLibrary => isPlatformLibrary && element.isPrivate;
-
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isPlatformLibrary => element.isInSdk;
-
-  @override
-  bool get isDartCore => element.isDartCore;
-
-  LibraryElementY(ElementConverter converter, analyzer.LibraryElement element)
-      : super(converter, element);
-
-  @override
-  void addCompilationUnit(_) => unsupported('addCompilationUnit');
-
-  @override
-  void addImport(element, import, listener) => unsupported('addImport');
-
-  @override
-  void addMember(element, listener) => unsupported('addMember');
-
-  @override
-  void addTag(tag, listener) => unsupported('addTag');
-
-  @override
-  void addToScope(element, listener) => unsupported('addToScope');
-
-  @override
-  void set canUseNative(bool value) => unsupported('canUseNative');
-
-  @override
-  bool get canUseNative => unsupported('canUseNative');
-
-  @override
-  Uri get canonicalUri => unsupported('canonicalUri');
-
-  @override
-  int compareTo(other) => unsupported('compareTo');
-
-  @override
-  get compilationUnits => unsupported('compilationUnits');
-
-  @override
-  get entryCompilationUnit => unsupported('entryCompilationUnit');
-
-  @override
-  get exports => unsupported('exports');
-
-  @override
-  bool get exportsHandled => unsupported('exportsHandled');
-
-  @override
-  find(String elementName) => unsupported('find');
-
-  @override
-  findExported(String elementName) => unsupported('findExported');
-
-  @override
-  findLocal(String elementName) => unsupported('findLocal');
-
-  @override
-  void forEachExport(_) => unsupported('forEachExport');
-
-  @override
-  void forEachLocalMember(_) => unsupported('forEachLocalMember');
-
-  @override
-  getImportsFor(element) => unsupported('getImportsFor');
-
-  @override
-  getLibraryFromTag(tag) => unsupported('getLibraryFromTag');
-
-  @override
-  String getLibraryName() => unsupported('getLibraryName');
-
-  @override
-  String getLibraryOrScriptName() => unsupported('getLibraryOrScriptName');
-
-  @override
-  getNonPrivateElementsInScope() => unsupported('getNonPrivateElementsInScope');
-
-  @override
-  bool hasLibraryName() => unsupported('hasLibraryName');
-
-  @override
-  bool get hasTreeElements => unsupported('hasTreeElements');
-
-  @override
-  bool get isPackageLibrary => unsupported('isPackageLibrary');
-
-  @override
-  get libraryTag => unsupported('libraryTag');
-
-  @override
-  void set libraryTag(value) => unsupported('libraryTag');
-
-  @override
-  localLookup(elementName) => unsupported('localLookup');
-
-  @override
-  void recordResolvedTag(tag, library) => unsupported('recordResolvedTag');
-
-  @override
-  void setExports(exportedElements) => unsupported('setExports');
-
-  @override
-  get tags => unsupported('tags');
-
-  @override
-  get treeElements => unsupported('treeElements');
-}
-
-class TopLevelFunctionElementY extends ElementY
-    implements dart2js.FunctionElement {
-  analyzer.FunctionElement get element => super.element;
-
-  final dart2js.FunctionSignature functionSignature =
-      new modelx.FunctionSignatureX(
-          const util.Link<dart2js.Element>(),
-          const util.Link<dart2js.Element>(),
-          0, 0, false, const <dart2js.Element>[],
-          new FunctionType.synthesized());
-
-
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isFactoryConstructor => false;
-
-  @override
-  bool get isStatic {
-    // Semantic difference: Analyzer considers top-level and static class
-    // members to be static, dart2js only considers static class members to be
-    // static.
-    return false;
+  dart2js.TypedefElement visitFunctionTypeAliasElement(
+      analyzer.FunctionTypeAliasElement input) {
+    return new TypedefElementY(converter, input);
   }
 
-  // TODO(johnniwinther): Ensure the correct semantics of this.
-  @override
-  bool get isAbstract => false;
-
-  @override
-  dart2js.ElementKind get kind => dart2js.ElementKind.FUNCTION;
-
-  @override
-  bool get isClassMember => false;
-
-  @override
-  bool get isInstanceMember => false;
-
-  @override
-  bool get isTopLevel => true;
-
-  TopLevelFunctionElementY(ElementConverter converter,
-                           analyzer.FunctionElement element)
-      : super(converter, element);
-
-  @override
-  get abstractField => unsupported('abstractField');
-
-  @override
-  computeSignature(_) => unsupported('computeSignature');
-
-  @override
-  bool get hasNode => unsupported('hasNode');
-
-  @override
-  bool get hasResolvedAst => unsupported('hasResolvedAst');
-
-  @override
-  bool get hasTreeElements => unsupported('hasTreeElements');
-
-  @override
-  get memberContext => unsupported('memberContext');
-
-  @override
-  get node => unsupported('node');
-
-  @override
-  get resolvedAst => unsupported('resolvedAst');
-
-  @override
-  get treeElements => unsupported('treeElements');
-
-  @override
-  FunctionType get type => functionSignature.type;
 }
diff --git a/pkg/analyzer2dart/lib/src/modely.dart b/pkg/analyzer2dart/lib/src/modely.dart
new file mode 100644
index 0000000..33e8df1
--- /dev/null
+++ b/pkg/analyzer2dart/lib/src/modely.dart
@@ -0,0 +1,658 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file

+// for 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 analyzer2dart.element_converter;

+

+

+/// Base [dart2js.Element] implementation for converted analyzer elements.

+class ElementY extends dart2js.Element {

+  final ElementConverter converter;

+  final analyzer.Element element;

+

+  @override

+  String get name => element.name;

+

+  ElementY(this.converter, this.element);

+

+  @override

+  dart2js.LibraryElement get implementationLibrary => library;

+

+  @override

+  dart2js.Element get origin => this;

+

+  @override

+  dart2js.Element get patch => null;

+

+  @override

+  dart2js.Element get declaration => this;

+

+  @override

+  dart2js.Element get implementation => this;

+

+  @override

+  bool get isPatch => false;

+

+  @override

+  bool get isPatched => false;

+

+  @override

+  bool get isDeclaration => true;

+

+  @override

+  bool get isImplementation => false;

+

+  @override

+  dart2js.LibraryElement get library {

+    return converter.convertElement(element.library);

+  }

+

+  @override

+  bool get isLocal => false;

+

+  unsupported(String method) {

+    throw new UnsupportedError(

+        "'$method' is unsupported on $this ($runtimeType)");

+  }

+

+

+  @override

+  bool get isFinal => unsupported('isFinal');

+

+  @override

+  bool get isStatic => unsupported('isStatic');

+

+  @override

+  bool isForeign(_) => unsupported('isForeign');

+

+  @override

+  bool get impliesType => unsupported('impliesType');

+

+  @override

+  bool get isOperator => unsupported('impliesType');

+

+  @override

+  get position => unsupported('position');

+

+  @override

+  computeType(_) => unsupported('computeType');

+

+  @override

+  get enclosingElement => unsupported('enclosingElement');

+

+  @override

+  accept(_) => unsupported('accept');

+

+  @override

+  void addMetadata(_) => unsupported('addMetadata');

+

+  @override

+  get analyzableElement => unsupported('analyzableElement');

+

+  @override

+  asFunctionElement() => unsupported('asFunctionElement');

+

+  @override

+  buildScope() => unsupported('buildScope');

+

+  @override

+  get compilationUnit => unsupported('compilationUnit');

+

+  @override

+  get contextClass => unsupported('contextClass');

+

+  @override

+  void diagnose(context, listener) => unsupported('diagnose');

+

+  @override

+  get enclosingClass => unsupported('enclosingClass');

+

+  @override

+  get enclosingClassOrCompilationUnit {

+    return unsupported('enclosingClassOrCompilationUnit');

+  }

+

+  @override

+  String get fixedBackendName => unsupported('fixedBackendName');

+

+  @override

+  bool get hasFixedBackendName => unsupported('hasFixedBackendName');

+

+  @override

+  bool get isAbstract => unsupported('isAbstract');

+

+  @override

+  bool get isAssignable => unsupported('isAssignable');

+

+  @override

+  bool get isClassMember => unsupported('isClassMember');

+

+  @override

+  bool get isClosure => unsupported('isClosure');

+

+  @override

+  bool get isConst => unsupported('isConst');

+

+  @override

+  bool get isDeferredLoaderGetter => unsupported('isDeferredLoaderGetter');

+

+  @override

+  bool get isFactoryConstructor => unsupported('isFactoryConstructor');

+

+  @override

+  bool get isForwardingConstructor => unsupported('isForwardingConstructor');

+

+  @override

+  bool get isInjected => unsupported('isInjected');

+

+  @override

+  bool get isInstanceMember => unsupported('isInstanceMember');

+

+  @override

+  bool get isMixinApplication => unsupported('isMixinApplication');

+

+  @override

+  bool get isNative => unsupported('isNative');

+

+  @override

+  bool get isSynthesized => unsupported('isSynthesized');

+

+  @override

+  bool get isTopLevel => unsupported('isTopLevel');

+

+  @override

+  get kind => unsupported('kind');

+

+  @override

+  get metadata => unsupported('metadata');

+

+  @override

+  get outermostEnclosingMemberOrTopLevel {

+    return unsupported('outermostEnclosingMemberOrTopLevel');

+  }

+

+  @override

+  void setFixedBackendName(String name) => unsupported('setFixedBackendName');

+

+  @override

+  void setNative(String name) => unsupported('setNative');

+

+  String toString() => '$kind($name)';

+}

+

+abstract class AnalyzableElementY

+    implements ElementY, dart2js.AnalyzableElement {

+  @override

+  bool get hasTreeElements => unsupported('hasTreeElements');

+

+  @override

+  get treeElements => unsupported('treeElements');

+}

+

+abstract class AstElementY implements ElementY, dart2js.AstElement {

+  @override

+  bool get hasNode => unsupported('hasNode');

+

+  @override

+  get node => unsupported('node');

+

+  @override

+  bool get hasResolvedAst => unsupported('hasResolvedAst');

+

+  @override

+  get resolvedAst => unsupported('resolvedAst');

+}

+

+class LibraryElementY extends ElementY with AnalyzableElementY

+    implements dart2js.LibraryElement {

+  analyzer.LibraryElement get element => super.element;

+

+  @override

+  dart2js.ElementKind get kind => dart2js.ElementKind.LIBRARY;

+

+  // TODO(johnniwinther): Ensure the correct semantics of this.

+  @override

+  bool get isInternalLibrary => isPlatformLibrary && element.isPrivate;

+

+  // TODO(johnniwinther): Ensure the correct semantics of this.

+  @override

+  bool get isPlatformLibrary => element.isInSdk;

+

+  @override

+  bool get isDartCore => element.isDartCore;

+

+  LibraryElementY(ElementConverter converter, analyzer.LibraryElement element)

+      : super(converter, element);

+

+  @override

+  void addCompilationUnit(_) => unsupported('addCompilationUnit');

+

+  @override

+  void addImport(element, import, listener) => unsupported('addImport');

+

+  @override

+  void addMember(element, listener) => unsupported('addMember');

+

+  @override

+  void addTag(tag, listener) => unsupported('addTag');

+

+  @override

+  void addToScope(element, listener) => unsupported('addToScope');

+

+  @override

+  void set canUseNative(bool value) => unsupported('canUseNative');

+

+  @override

+  bool get canUseNative => unsupported('canUseNative');

+

+  @override

+  Uri get canonicalUri => unsupported('canonicalUri');

+

+  @override

+  int compareTo(other) => unsupported('compareTo');

+

+  @override

+  get compilationUnits => unsupported('compilationUnits');

+

+  @override

+  get entryCompilationUnit => unsupported('entryCompilationUnit');

+

+  @override

+  get exports => unsupported('exports');

+

+  @override

+  bool get exportsHandled => unsupported('exportsHandled');

+

+  @override

+  find(String elementName) => unsupported('find');

+

+  @override

+  findExported(String elementName) => unsupported('findExported');

+

+  @override

+  findLocal(String elementName) => unsupported('findLocal');

+

+  @override

+  void forEachExport(_) => unsupported('forEachExport');

+

+  @override

+  void forEachLocalMember(_) => unsupported('forEachLocalMember');

+

+  @override

+  getImportsFor(element) => unsupported('getImportsFor');

+

+  @override

+  getLibraryFromTag(tag) => unsupported('getLibraryFromTag');

+

+  @override

+  String getLibraryName() => unsupported('getLibraryName');

+

+  @override

+  String getLibraryOrScriptName() => unsupported('getLibraryOrScriptName');

+

+  @override

+  getNonPrivateElementsInScope() => unsupported('getNonPrivateElementsInScope');

+

+  @override

+  bool hasLibraryName() => unsupported('hasLibraryName');

+

+  @override

+  bool get isPackageLibrary => unsupported('isPackageLibrary');

+

+  @override

+  get libraryTag => unsupported('libraryTag');

+

+  @override

+  void set libraryTag(value) => unsupported('libraryTag');

+

+  @override

+  localLookup(elementName) => unsupported('localLookup');

+

+  @override

+  void recordResolvedTag(tag, library) => unsupported('recordResolvedTag');

+

+  @override

+  void setExports(exportedElements) => unsupported('setExports');

+

+  @override

+  get tags => unsupported('tags');

+}

+

+class TopLevelFunctionElementY extends ElementY

+    with AnalyzableElementY, AstElementY

+    implements dart2js.FunctionElement {

+  analyzer.FunctionElement get element => super.element;

+

+  dart2js.FunctionSignature _functionSignature;

+

+  // TODO(johnniwinther): Avoid the need for this.

+  dart2js.FunctionSignature get functionSignature {

+    if (_functionSignature == null) {

+      util.LinkBuilder<dart2js.Element> parameterBuilder =

+          new util.LinkBuilder<dart2js.Element>();

+      List<dart2js.DartType> parameterTypes = <dart2js.DartType>[];

+      element.parameters.forEach((analyzer.ParameterElement parameter) {

+        if (parameter.parameterKind.isOptional) {

+          unsupported('Optional parameter.');

+        } else {

+          dart2js.ParameterElement convertedParameter =

+              converter.convertElement(parameter);

+          parameterBuilder.addLast(convertedParameter);

+          parameterTypes.add(convertedParameter.type);

+        }

+      });

+      // TODO(johnniwinther): Convert parameter and return types.

+      util.Link<dart2js.Element> parameters = parameterBuilder.toLink();

+      _functionSignature = new modelx.FunctionSignatureX(

+            parameters,

+            const util.Link<dart2js.Element>(),

+            parameterBuilder.length, 0, false,

+            parameters.toList(),

+            new dart2js.FunctionType.synthesized(

+                converter.convertType(element.returnType),

+                parameterTypes));

+    }

+    return _functionSignature;

+  }

+

+

+  // TODO(johnniwinther): Ensure the correct semantics of this.

+  @override

+  bool get isFactoryConstructor => false;

+

+  @override

+  bool get isStatic {

+    // Semantic difference: Analyzer considers top-level and static class

+    // members to be static, dart2js only considers static class members to be

+    // static.

+    return false;

+  }

+

+  // TODO(johnniwinther): Ensure the correct semantics of this.

+  @override

+  bool get isAbstract => false;

+

+  @override

+  dart2js.ElementKind get kind => dart2js.ElementKind.FUNCTION;

+

+  @override

+  bool get isClassMember => false;

+

+  @override

+  bool get isInstanceMember => false;

+

+  @override

+  bool get isTopLevel => true;

+

+  TopLevelFunctionElementY(ElementConverter converter,

+                           analyzer.FunctionElement element)

+      : super(converter, element);

+

+  @override

+  get abstractField => unsupported('abstractField');

+

+  @override

+  computeSignature(_) => unsupported('computeSignature');

+

+  @override

+  get memberContext => unsupported('memberContext');

+

+  @override

+  dart2js.FunctionType get type => functionSignature.type;

+}

+

+class ParameterElementY extends ElementY

+    with AnalyzableElementY, AstElementY

+    implements dart2js.ParameterElement {

+

+  analyzer.ParameterElement get element => super.element;

+

+  @override

+  dart2js.ElementKind get kind => dart2js.ElementKind.PARAMETER;

+

+  @override

+  dart2js.DartType get type => converter.convertType(element.type);

+

+  // TODO(johnniwinther): Avoid the need for this.

+  @override

+  dart2js.FunctionSignature get functionSignature => null;

+

+  @override

+  bool get isLocal => true;

+

+  @override

+  bool get isStatic => false;

+

+  @override

+  bool get isConst => false;

+

+  ParameterElementY(ElementConverter converter,

+                    analyzer.ParameterElement element)

+      : super(converter, element) {

+    assert(!element.isInitializingFormal);

+  }

+

+  @override

+  get executableContext => unsupported('executableContext');

+

+  @override

+  get functionDeclaration => unsupported('functionDeclaration');

+

+  @override

+  get initializer => unsupported('initializer');

+

+  @override

+  get memberContext => unsupported('memberContext');

+}

+

+class TypeDeclarationElementY extends ElementY

+    with AnalyzableElementY, AstElementY

+    implements dart2js.TypeDeclarationElement {

+

+  TypeDeclarationElementY(ElementConverter converter,

+                          analyzer.Element element)

+      : super(converter, element);

+

+  @override

+  void ensureResolved(compiler) => unsupported('ensureResolved');

+

+  @override

+  bool get isResolved => unsupported('isResolved');

+

+  @override

+  get rawType => null;//unsupported('rawType');

+

+  @override

+  int get resolutionState => unsupported('resolutionState');

+

+  @override

+  get thisType => unsupported('thisType');

+

+  @override

+  get typeVariables => unsupported('typeVariables');

+

+}

+

+class ClassElementY extends TypeDeclarationElementY

+    implements dart2js.ClassElement {

+

+  analyzer.ClassElement get element => super.element;

+

+  dart2js.ElementKind get kind => dart2js.ElementKind.CLASS;

+

+  ClassElementY(ElementConverter converter, analyzer.ClassElement element)

+      : super(converter, element);

+

+  @override

+  void addBackendMember(element) => unsupported('addBackendMember');

+

+  @override

+  void addMember(element, listener) => unsupported('addMember');

+

+  @override

+  void addToScope(element, listener) => unsupported('addToScope');

+

+  @override

+  get allSupertypes => unsupported('allSupertypes');

+

+  @override

+  get allSupertypesAndSelf => unsupported('allSupertypesAndSelf');

+

+  @override

+  asInstanceOf(cls) => unsupported('asInstanceOf');

+

+  @override

+  get callType => unsupported('callType');

+

+  @override

+  computeTypeParameters(compiler) => unsupported('computeTypeParameters');

+

+  @override

+  get constructors => unsupported('constructors');

+

+  @override

+  void forEachBackendMember(f) => unsupported('forEachBackendMember');

+

+  @override

+  void forEachClassMember(f) => unsupported('forEachClassMember');

+

+  @override

+  void forEachInstanceField(f, {includeSuperAndInjectedMembers}) {

+    unsupported('forEachInstanceField');

+  }

+

+  @override

+  void forEachInterfaceMember(f) => unsupported('forEachInterfaceMember');

+

+  @override

+  void forEachLocalMember(f) => unsupported('forEachLocalMember');

+

+  @override

+  void forEachMember(f,

+                     {includeBackendMembers, includeSuperAndInjectedMembers}) {

+    unsupported('forEachMember');

+  }

+

+  @override

+  void forEachStaticField(f) => unsupported('forEachStaticField');

+

+  @override

+  bool get hasBackendMembers => unsupported('hasBackendMembers');

+

+  @override

+  bool get hasConstructor => unsupported('hasConstructor');

+

+  @override

+  bool hasFieldShadowedBy(fieldMember) => unsupported('hasFieldShadowedBy');

+

+  @override

+  bool get hasIncompleteHierarchy => unsupported('hasIncompleteHierarchy');

+

+  @override

+  bool get hasLocalScopeMembers => unsupported('hasLocalScopeMembers');

+

+  @override

+  int get hierarchyDepth => unsupported('hierarchyDepth');

+

+  @override

+  int get id => unsupported('id');

+

+  @override

+  bool implementsInterface(intrface) => unsupported('implementsInterface');

+

+  @override

+  get interfaces => unsupported('interfaces');

+

+  @override

+  bool isObject(compiler) => unsupported('isObject');

+

+  @override

+  bool get isProxy => unsupported('isProxy');

+

+  @override

+  bool isSubclassOf(cls) => unsupported('isSubclassOf');

+

+  @override

+  get isUnnamedMixinApplication => unsupported('isUnnamedMixinApplication');

+

+  @override

+  localLookup(String elementName) => unsupported('localLookup');

+

+  @override

+  lookupBackendMember(String memberName) => unsupported('lookupBackendMember');

+

+  @override

+  lookupClassMember(name) => unsupported('lookupClassMember');

+

+  @override

+  lookupConstructor(selector, [noMatch]) => unsupported('lookupConstructor');

+

+  @override

+  lookupInterfaceMember(name) => unsupported('lookupInterfaceMember');

+

+  @override

+  lookupLocalMember(String memberName) => unsupported('lookupLocalMember');

+

+  @override

+  lookupMember(String memberName) => unsupported('lookupMember');

+

+  @override

+  lookupSelector(selector) => unsupported('lookupSelector');

+

+  @override

+  lookupSuperMember(String memberName) => unsupported('lookupSuperMember');

+

+  @override

+  lookupSuperMemberInLibrary(memberName, library) {

+    unsupported('lookupSuperMemberInLibrary');

+  }

+

+  @override

+  lookupSuperSelector(selector) => unsupported('lookupSuperSelector');

+

+  @override

+  String get nativeTagInfo => unsupported('nativeTagInfo');

+

+  @override

+  void reverseBackendMembers() => unsupported('reverseBackendMembers');

+

+  @override

+  void setDefaultConstructor(constructor, compiler) {

+    unsupported('setDefaultConstructor');

+  }

+

+  @override

+  dart2js.ClassElement get superclass => unsupported('superclass');

+

+  @override

+  dart2js.DartType get supertype => unsupported('supertype');

+

+  @override

+  int get supertypeLoadState => unsupported('supertypeLoadState');

+

+  @override

+  validateConstructorLookupResults(selector,  result, noMatch) {

+    unsupported('validateConstructorLookupResults');

+  }

+}

+

+class TypedefElementY extends TypeDeclarationElementY

+    implements dart2js.TypedefElement {

+

+  analyzer.FunctionTypeAliasElement get element => super.element;

+

+  dart2js.ElementKind get kind => dart2js.ElementKind.TYPEDEF;

+

+  TypedefElementY(ElementConverter converter,

+                  analyzer.FunctionTypeAliasElement element)

+      : super(converter, element);

+

+  @override

+  dart2js.DartType get alias => unsupported('alias');

+

+  @override

+  void checkCyclicReference(compiler) => unsupported('checkCyclicReference');

+

+  @override

+  get functionSignature => unsupported('functionSignature');

+}
\ No newline at end of file
diff --git a/pkg/analyzer2dart/lib/src/tree_shaker.dart b/pkg/analyzer2dart/lib/src/tree_shaker.dart
index 1b50580..9cd8423 100644
--- a/pkg/analyzer2dart/lib/src/tree_shaker.dart
+++ b/pkg/analyzer2dart/lib/src/tree_shaker.dart
@@ -12,40 +12,92 @@
 
 import 'closed_world.dart';
 
-class TreeShaker {
-  List<Element> _queue = <Element>[];
-  Set<Element> _alreadyEnqueued = new HashSet<Element>();
-  ClosedWorld _world;
-  Set<Selector> _selectors = new HashSet<Selector>();
+/**
+ * The result of performing local reachability analysis on a method.
+ */
+class MethodAnalysis {
+  /**
+   * The AST for the method.
+   */
+  final Declaration declaration;
 
-  TreeShaker(FunctionElement mainFunction)
-      : _world = new ClosedWorld(mainFunction) {
-    addElement(mainFunction);
+  /**
+   * The functions statically called by the method.
+   */
+  final List<LocalElement> calls = <LocalElement>[];
+
+  /**
+   * The selectors used by the method to perform dynamic invocation.
+   */
+  final List<Selector> invokes = <Selector>[];
+
+  /**
+   * The classes that are instantiated by the method.
+   */
+  final List<ClassElement> instantiates = <ClassElement>[];
+
+  MethodAnalysis(this.declaration);
+}
+
+/**
+ * The result of performing local reachability analysis on a class.
+ *
+ * TODO(paulberry): Do we need to do any other analysis of classes?  (For
+ * example, detect annotations that are relevant to mirrors, detect that a
+ * class might be used for custom HTML elements, or collect inherited and
+ * mixed-in classes).
+ */
+class ClassAnalysis {
+  /**
+   * The AST for the class.
+   */
+  final ClassDeclaration declaration;
+
+  ClassAnalysis(this.declaration);
+}
+
+/**
+ * This class is responsible for performing local analysis of the source code
+ * to provide the information needed to do tree shaking.
+ */
+class LocalReachabilityComputer {
+  /**
+   * Perform local reachability analysis of [method].
+   */
+  MethodAnalysis analyzeMethod(ExecutableElement method) {
+    MethodAnalysis analysis = new MethodAnalysis(method.node);
+    analysis.declaration.accept(new TreeShakingVisitor(analysis));
+    return analysis;
   }
 
-  void addElement(Element element) {
-    if (_alreadyEnqueued.add(element)) {
-      _queue.add(element);
-    }
+  /**
+   * Perform local reachability analysis of [classElement].
+   */
+  ClassAnalysis analyzeClass(ClassElement classElement) {
+    return new ClassAnalysis(classElement.node);
   }
 
-  void addSelector(Selector selector) {
-    if (_selectors.add(selector)) {
-      // New selector, so match it against all class methods.
-      _world.instantiatedClasses.forEach((ClassElement element, AstNode node) {
-        matchClassToSelector(element, selector);
-      });
-    }
-  }
-
-  void matchClassToSelector(ClassElement classElement, Selector selector) {
-    // TODO(paulberry): walk through superclasses and mixins as well.  Consider
-    // using InheritanceManager to do this.
+  /**
+   * Determine which members of [classElement] are matched by the given
+   * [selector].
+   *
+   * [methods] is populated with all the class methods which are matched by the
+   * selector, [accessors] with all the getters and setters which are matched
+   * by the selector, and [fields] with all the fields which are matched by the
+   * selector.
+   */
+  void getMatchingClassMembers(ClassElement classElement, Selector selector,
+      List<MethodElement> methods, List<PropertyAccessorElement> accessors,
+      List<PropertyInducingElement> fields) {
+    // TODO(paulberry): should we walk through superclasses and mixins as well
+    // here?  Or would it be better to make [TreeShaker] responsible for those
+    // relationships (since they are non-local)?  Consider making use of
+    // InheritanceManager to do this.
     for (MethodElement method in classElement.methods) {
       // TODO(paulberry): account for arity and named arguments when matching
       // the selector against the method.
       if (selector.name == method.name) {
-        addElement(method);
+        methods.add(method);
       }
     }
     if (selector.kind == SelectorKind.GETTER) {
@@ -53,41 +105,79 @@
         if (accessor.isGetter && selector.name == accessor.name) {
           if (accessor.isSynthetic) {
             // This accessor is implied by the corresponding field declaration.
-            addElement(accessor.variable);
+            fields.add(accessor.variable);
           } else {
-            addElement(accessor);
+            accessors.add(accessor);
           }
         }
       }
     }
   }
+}
+
+/**
+ * This class is responsible for driving the tree shaking process, and
+ * and performing the global inferences necessary to determine which methods
+ * in the source program are reachable.  It makes use of
+ * [LocalReachabilityComputer] to do local analysis of individual classes and
+ * methods.
+ */
+class TreeShaker {
+  List<Element> _queue = <Element>[];
+  Set<Element> _alreadyEnqueued = new HashSet<Element>();
+  ClosedWorld _world;
+  Set<Selector> _selectors = new HashSet<Selector>();
+  final LocalReachabilityComputer _localComputer = new LocalReachabilityComputer();
+
+  TreeShaker(FunctionElement mainFunction)
+      : _world = new ClosedWorld(mainFunction);
+
+  void _addElement(Element element) {
+    if (_alreadyEnqueued.add(element)) {
+      _queue.add(element);
+    }
+  }
+
+  void _addSelector(Selector selector) {
+    if (_selectors.add(selector)) {
+      // New selector, so match it against all class methods.
+      _world.instantiatedClasses.forEach((ClassElement element, AstNode node) {
+        _matchClassToSelector(element, selector);
+      });
+    }
+  }
+
+  void _matchClassToSelector(ClassElement classElement, Selector selector) {
+    List<MethodElement> methods = <MethodElement>[];
+    List<PropertyAccessorElement> accessors = <PropertyAccessorElement>[];
+    List<PropertyInducingElement> fields = <PropertyInducingElement>[];
+    _localComputer.getMatchingClassMembers(
+        classElement,
+        selector,
+        methods,
+        accessors,
+        fields);
+    methods.forEach(_addElement);
+    accessors.forEach(_addElement);
+    fields.forEach(_addElement);
+  }
 
   ClosedWorld shake() {
+    _addElement(_world.mainFunction);
     while (_queue.isNotEmpty) {
       Element element = _queue.removeLast();
       print('Tree shaker handling $element');
-      if (element is FunctionElement) {
-        FunctionDeclaration declaration = element.node;
-        _world.executableElements[element] = declaration;
-        declaration.accept(new TreeShakingVisitor(this));
+      if (element is ExecutableElement) {
+        MethodAnalysis analysis = _localComputer.analyzeMethod(element);
+        _world.executableElements[element] = analysis.declaration;
+        analysis.calls.forEach(_addElement);
+        analysis.invokes.forEach(_addSelector);
+        analysis.instantiates.forEach(_addElement);
       } else if (element is ClassElement) {
-        ClassDeclaration declaration = element.node;
-        _world.instantiatedClasses[element] = declaration;
+        ClassAnalysis analysis = _localComputer.analyzeClass(element);
+        _world.instantiatedClasses[element] = analysis.declaration;
         for (Selector selector in _selectors) {
-          matchClassToSelector(element, selector);
-        }
-      } else if (element is MethodElement) {
-        MethodDeclaration declaration = element.node;
-        _world.executableElements[element] = declaration;
-        declaration.accept(new TreeShakingVisitor(this));
-      } else if (element is PropertyAccessorElement) {
-        if (element.isGetter) {
-          MethodDeclaration declaration = element.node;
-          _world.executableElements[element] = declaration;
-          declaration.accept(new TreeShakingVisitor(this));
-        } else {
-          // TODO(paulberry): handle setters.
-          throw new UnimplementedError();
+          _matchClassToSelector(element, selector);
         }
       } else if (element is FieldElement) {
         VariableDeclaration declaration = element.node;
@@ -115,16 +205,16 @@
 }
 
 class TreeShakingVisitor extends RecursiveAstVisitor {
-  final TreeShaker treeShaker;
+  final MethodAnalysis analysis;
 
-  TreeShakingVisitor(this.treeShaker);
+  TreeShakingVisitor(this.analysis);
 
   /**
    * Handle a true method call (a MethodInvocation that represents a call to
    * a non-static method).
    */
   void handleMethodCall(MethodInvocation node) {
-    treeShaker.addSelector(createSelectorFromMethodInvocation(node));
+    analysis.invokes.add(createSelectorFromMethodInvocation(node));
   }
 
   @override
@@ -139,7 +229,7 @@
       // TODO(paulberry): Really we should enqueue the constructor, and then
       // when we visit it add the class to the class bucket.
       ClassElement classElement = staticElement.enclosingElement;
-      treeShaker.addElement(classElement);
+      analysis.instantiates.add(classElement);
     } else {
       // TODO(paulberry): deal with this situation.  This can happen, for
       // example, in the case "main() => new Unresolved();" (which is a
@@ -232,7 +322,7 @@
       //   }
       // TODO(paulberry): for the moment we are assuming it's a toplevel
       // function.
-      treeShaker.addElement(staticElement);
+      analysis.calls.add(staticElement);
     } else if (staticElement is MultiplyDefinedElement) {
       // TODO(paulberry): do we have to deal with this case?
       throw new UnimplementedError();
@@ -254,6 +344,6 @@
     // TODO(paulberry): handle cases where the property access is represented
     // as a PrefixedIdentifier.
     super.visitPropertyAccess(node);
-    treeShaker.addSelector(new Selector.getter(node.propertyName.name, null));
+    analysis.invokes.add(new Selector.getter(node.propertyName.name, null));
   }
 }
diff --git a/pkg/analyzer2dart/test/end2end_test.dart b/pkg/analyzer2dart/test/end2end_test.dart
index aa51983..acdd838 100644
--- a/pkg/analyzer2dart/test/end2end_test.dart
+++ b/pkg/analyzer2dart/test/end2end_test.dart
@@ -118,6 +118,197 @@
   }
 
 ''');
+
+    checkResult('''
+main() {
+  return 1.5;
+}
+''', '''
+main() $NEW_BACKEND_COMMENT
+  {
+    return 1.5;
+  }
+
+''');
+
+    checkResult('''
+main() {
+  return true;
+}
+''', '''
+main() $NEW_BACKEND_COMMENT
+  {
+    return true;
+  }
+
+''');
+
+    checkResult('''
+main() {
+  return false;
+}
+''', '''
+main() $NEW_BACKEND_COMMENT
+  {
+    return false;
+  }
+
+''');
+
+    checkResult('''
+main() {
+  return "a";
+}
+''', '''
+main() $NEW_BACKEND_COMMENT
+  {
+    return "a";
+  }
+
+''');
+
+    checkResult('''
+main() {
+  return "a" "b";
+}
+''', '''
+main() $NEW_BACKEND_COMMENT
+  {
+    return "ab";
+  }
+
+''');
+  });
+
+  test('Parameters', () {
+    checkResult('''
+main(args) {
+}
+''', '''
+main(args) $NEW_BACKEND_COMMENT
+  {}
+
+''');
+
+    checkResult('''
+main(a, b) {
+}
+''', '''
+main(a, b) $NEW_BACKEND_COMMENT
+  {}
+
+''');
+  });
+
+  test('Typed parameters', () {
+    checkResult('''
+void main(args) {
+}
+''', '''
+void main(args) $NEW_BACKEND_COMMENT
+  {}
+
+''');
+
+    checkResult('''
+main(int a, String b) {
+}
+''', '''
+main(int a, String b) $NEW_BACKEND_COMMENT
+  {}
+
+''');
+
+    checkResult('''
+main(Comparator a, List b) {
+}
+''', '''
+main(Comparator a, List b) $NEW_BACKEND_COMMENT
+  {}
+
+''');
+
+    checkResult('''
+main(Comparator<dynamic> a, List<dynamic> b) {
+}
+''', '''
+main(Comparator a, List b) $NEW_BACKEND_COMMENT
+  {}
+
+''');
+
+    checkResult('''
+main(Map a, Map<dynamic, List<int>> b) {
+}
+''', '''
+main(Map a, Map<dynamic, List<int>> b) $NEW_BACKEND_COMMENT
+  {}
+
+''');
+  });
+
+  test('Pass arguments', () {
+    checkResult('''
+foo(a) {}
+main() {
+  foo(null);
+}
+''', '''
+foo(a) $NEW_BACKEND_COMMENT
+  {}
+
+main() $NEW_BACKEND_COMMENT
+  {
+    foo(null);
+  }
+
+''');
+
+    checkResult('''
+bar(b, c) {}
+foo(a) {}
+main() {
+  foo(null);
+  bar(0, "");
+}
+''', '''
+bar(b, c) $NEW_BACKEND_COMMENT
+  {}
+
+foo(a) $NEW_BACKEND_COMMENT
+  {}
+
+main() $NEW_BACKEND_COMMENT
+  {
+    foo(null);
+    bar(0, "");
+  }
+
+''');
+
+    checkResult('''
+bar(b) {}
+foo(a) {
+  bar(a);
+}
+main() {
+  foo(null);
+}
+''', '''
+bar(b) $NEW_BACKEND_COMMENT
+  {}
+
+foo(a) $NEW_BACKEND_COMMENT
+  {
+    bar(a);
+  }
+
+main() $NEW_BACKEND_COMMENT
+  {
+    foo(null);
+  }
+
+''');
   });
 }
 
@@ -141,7 +332,6 @@
   StringBufferSink output;
 
   EventSink<String> call(String name, String extension) {
-    print('outputProvider($name,$extension)');
     return output = new StringBufferSink();
   }
 }
diff --git a/pkg/analyzer2dart/test/mock_sdk.dart b/pkg/analyzer2dart/test/mock_sdk.dart
index 8525481..fd66b7b 100644
--- a/pkg/analyzer2dart/test/mock_sdk.dart
+++ b/pkg/analyzer2dart/test/mock_sdk.dart
@@ -68,6 +68,8 @@
 external bool identical(Object a, Object b);
 
 void print(Object object) {}
+
+typedef int Comparator<T>(T a, T b);
 ''');
 
   static const _MockSdkLibrary LIB_ASYNC =
@@ -105,6 +107,11 @@
   final resource.MemoryResourceProvider provider =
       new resource.MemoryResourceProvider();
 
+  /**
+   * The [AnalysisContext] which is used for all of the sources.
+   */
+  InternalAnalysisContext _analysisContext;
+
   MockSdk() {
     LIBRARIES.forEach((_MockSdkLibrary library) {
       provider.newFile(library.path, library.content);
@@ -112,7 +119,20 @@
   }
 
   @override
-  AnalysisContext get context => throw unimplemented;
+  AnalysisContext get context {
+    if (_analysisContext == null) {
+      _analysisContext = new SdkAnalysisContext();
+      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
+      _analysisContext.sourceFactory = factory;
+      ChangeSet changeSet = new ChangeSet();
+      for (String uri in uris) {
+        Source source = factory.forUri(uri);
+        changeSet.addedSource(source);
+      }
+      _analysisContext.applyChanges(changeSet);
+    }
+    return _analysisContext;
+  }
 
   @override
   List<SdkLibrary> get sdkLibraries => LIBRARIES;
@@ -123,7 +143,13 @@
   UnimplementedError get unimplemented => new UnimplementedError();
 
   @override
-  List<String> get uris => throw unimplemented;
+  List<String> get uris {
+    List<String> uris = <String>[];
+    for (SdkLibrary library in LIBRARIES) {
+      uris.add('dart:' + library.shortName);
+    }
+    return uris;
+  }
 
   @override
   Source fromFileUri(Uri uri) {
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index ddedbcc..101c319 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.15.2+1
+
+* Properly handle logs from a transformer that's been canceled.
+
+## 0.15.2
+
+* Add a `StaticPackageProvider` class to more efficiently handle immutable,
+  untransformed packages.
+
 ## 0.15.0+1
 
 * Widen the version constraint on the `collection` package.
diff --git a/pkg/barback/lib/src/graph/asset_cascade.dart b/pkg/barback/lib/src/graph/asset_cascade.dart
index aca3588..c35d7a2 100644
--- a/pkg/barback/lib/src/graph/asset_cascade.dart
+++ b/pkg/barback/lib/src/graph/asset_cascade.dart
@@ -82,8 +82,8 @@
   Stream<NodeStatus> get onStatusChange => _streams.onStatusChange;
 
   /// Returns all currently-available output assets from this cascade.
-  AssetSet get availableOutputs =>
-    new AssetSet.from(_phases.last.availableOutputs.map((node) => node.asset));
+  Future<AssetSet> get availableOutputs => new Future.value(new AssetSet.from(
+      _phases.last.availableOutputs.map((node) => node.asset)));
 
   /// Creates a new [AssetCascade].
   ///
diff --git a/pkg/barback/lib/src/graph/package_graph.dart b/pkg/barback/lib/src/graph/package_graph.dart
index 0f9cde9..e66dc44 100644
--- a/pkg/barback/lib/src/graph/package_graph.dart
+++ b/pkg/barback/lib/src/graph/package_graph.dart
@@ -17,6 +17,7 @@
 import '../utils.dart';
 import 'asset_cascade.dart';
 import 'node_status.dart';
+import 'static_asset_cascade.dart';
 
 /// The collection of [AssetCascade]s for an entire application.
 ///
@@ -95,9 +96,26 @@
         });
       }
 
+      if (provider is StaticPackageProvider) {
+        StaticPackageProvider staticProvider = provider;
+        for (var package in staticProvider.staticPackages) {
+          if (_cascades.containsKey(package)) {
+            throw new StateError('Package "$package" is in both '
+                'PackageProvider.packages and PackageProvider.staticPackages.');
+          }
+
+          var cascade = new StaticAssetCascade(this, package);
+          _cascades[package] = cascade;
+        }
+      }
+
       _errors = mergeStreams(_cascades.values.map((cascade) => cascade.errors),
           broadcast: true);
       _errors.listen(_accumulatedErrors.add);
+
+      // Make sure a result gets scheduled even if there are no cascades or all
+      // of them are static.
+      if (provider.packages.isEmpty) _tryScheduleResult();
     });
   }
 
@@ -147,10 +165,12 @@
     }
 
     // Otherwise, return all of the final output assets.
-    var assets = unionAll(_cascades.values.map(
-        (cascade) => cascade.availableOutputs.toSet()));
-
-    return new Future.value(new AssetSet.from(assets));
+    return Future.wait(_cascades.values.map(
+            (cascade) => cascade.availableOutputs))
+          .then((assetSets) {
+      var assets = unionAll(assetSets.map((assetSet) => assetSet.toSet()));
+      return new Future.value(new AssetSet.from(assets));
+    });
   }
 
   /// Adds [sources] to the graph's known set of source assets.
diff --git a/pkg/barback/lib/src/graph/static_asset_cascade.dart b/pkg/barback/lib/src/graph/static_asset_cascade.dart
new file mode 100644
index 0000000..f909c0f
--- /dev/null
+++ b/pkg/barback/lib/src/graph/static_asset_cascade.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.static_asset_cascade;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_set.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../package_provider.dart';
+import 'asset_cascade.dart';
+import 'node_status.dart';
+import 'package_graph.dart';
+
+/// An asset cascade for a static package.
+///
+/// A static package is known to have no transformers and no changes to its
+/// assets. This allows this class to lazily and efficiently provide assets to
+/// the rest of the package graph.
+class StaticAssetCascade implements AssetCascade {
+  final String package;
+
+  final PackageGraph graph;
+
+  /// All sources that have been requested from the provider.
+  final _sources = new Map<AssetId, Future<AssetNode>>();
+
+  StaticAssetCascade(this.graph, this.package);
+
+  Stream<BarbackException> get errors => _errorsController.stream;
+  final _errorsController =
+      new StreamController<BarbackException>.broadcast(sync: true);
+
+  final status = NodeStatus.IDLE;
+
+  final onLog = new StreamController<LogEntry>.broadcast().stream;
+  final onStatusChange = new StreamController<LogEntry>.broadcast().stream;
+
+  Future<AssetSet> get availableOutputs {
+    var provider = graph.provider as StaticPackageProvider;
+    return provider.getAllAssetIds(package).map(provider.getAsset).toList()
+        .then((assets) => new AssetSet.from(assets));
+  }
+
+  Future<AssetNode> getAssetNode(AssetId id) {
+    return _sources.putIfAbsent(id, () {
+      return graph.provider.getAsset(id).then((asset) {
+        return new AssetNodeController.available(asset).node;
+      }).catchError((error, stackTrace) {
+        if (error is! AssetNotFoundException) {
+          reportError(new AssetLoadException(id, error, stackTrace));
+        }
+
+        // TODO(nweiz): propagate error information through asset nodes.
+        return null;
+      });
+    });
+  }
+
+  void updateSources(Iterable<AssetId> sources) =>
+      throw new UnsupportedError("Static package $package can't be explicitly "
+          "provided sources.");
+
+  void removeSources(Iterable<AssetId> sources) =>
+      throw new UnsupportedError("Static package $package can't be explicitly "
+          "provided sources.");
+
+  void updateTransformers(Iterable<Iterable> transformersIterable) =>
+      throw new UnsupportedError("Static package $package can't have "
+          "transformers.");
+
+  void forceAllTransforms() {}
+
+  void reportError(BarbackException error) => _errorsController.add(error);
+
+  String toString() => "static cascade for $package";
+}
diff --git a/pkg/barback/lib/src/package_provider.dart b/pkg/barback/lib/src/package_provider.dart
index fe440f7..ce6ee23 100644
--- a/pkg/barback/lib/src/package_provider.dart
+++ b/pkg/barback/lib/src/package_provider.dart
@@ -24,5 +24,26 @@
   ///
   /// This should be re-entrant; it may be called multiple times with the same
   /// id before the previously returned future has completed.
+  ///
+  /// If no asset with [id] exists, the provider should throw an
+  /// [AssetNotFoundException].
   Future<Asset> getAsset(AssetId id);
 }
+
+/// A PackageProvider for which some packages are known to be static—that is,
+/// the package has no transformers and its assets won't ever change.
+///
+/// For static packages, rather than telling barback up-front which assets that
+/// package contains via [Barback.updateSources], barback will lazily query the
+/// provider for an asset when it's needed. This is much more efficient.
+abstract class StaticPackageProvider implements PackageProvider {
+  /// The names of all static packages provided by this provider.
+  ///
+  /// This must be disjoint from [packages].
+  Iterable<String> get staticPackages;
+
+  /// Returns all ids of assets in [package].
+  ///
+  /// This is used for [Barback.getAllAssets].
+  Stream<AssetId> getAllAssetIds(String package);
+}
diff --git a/pkg/barback/lib/src/transformer/base_transform.dart b/pkg/barback/lib/src/transformer/base_transform.dart
index f76a6a4..fe3ab3b 100644
--- a/pkg/barback/lib/src/transformer/base_transform.dart
+++ b/pkg/barback/lib/src/transformer/base_transform.dart
@@ -49,7 +49,10 @@
       // If the log isn't already associated with an asset, use the primary.
       if (asset == null) asset = _node.info.primaryId;
       var entry = new LogEntry(_node.info, asset, level, message, span);
-      _onLogController.add(entry);
+
+      // The log controller can be closed while log entries are still coming in
+      // if the transformer is removed during [apply].
+      if (!_onLogController.isClosed) _onLogController.add(entry);
     });
   }
 
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 368c033..58ce3c0 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -7,12 +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.
-#
-# Additional note: a stable version of pub was erroneously released with a
-# constraint on barback that includes 0.15.1 before version 0.15.1 was actually
-# released. As such, next time the patch version is bumped it should skip 0.15.1
-# and go directly to 0.15.2.
-version: 0.15.0+1
+version: 0.15.2+1
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
diff --git a/pkg/barback/test/static_provider_test.dart b/pkg/barback/test/static_provider_test.dart
new file mode 100644
index 0000000..08aad6f
--- /dev/null
+++ b/pkg/barback/test/static_provider_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.static_provider_test;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+  test("gets a static source asset", () {
+    initStaticGraph(["app|foo.txt"], staticPackages: ["app"]);
+    expectAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't get a nonexistent static source asset", () {
+    initStaticGraph(["app|foo.txt"], staticPackages: ["app"]);
+    expectNoAsset("app|bar.txt");
+  });
+
+  test("a transformer can see a static asset", () {
+    initStaticGraph({
+      "static|b.inc": "b",
+      "app|a.txt": "static|b.inc"
+    }, staticPackages: ["static"], transformers: {
+      "app": [[new ManyToOneTransformer("txt")]]
+    });
+    updateSources(["app|a.txt"]);
+    expectAsset("app|a.out", "b");
+  });
+}
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 2ab3abc..c24b58c 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -84,11 +84,18 @@
 /// [transformers] is a map from package names to the transformers for each
 /// package.
 void initGraph([assets,
-    Map<String, Iterable<Iterable<Transformer>>> transformers]) {
+      Map<String, Iterable<Iterable<Transformer>>> transformers]) =>
+    initStaticGraph(assets, transformers: transformers);
+
+void initStaticGraph(assets, {Iterable<String> staticPackages,
+    Map<String, Iterable<Iterable<Transformer>>> transformers}) {
   if (assets == null) assets = [];
+  if (staticPackages == null) staticPackages = [];
   if (transformers == null) transformers = {};
 
-  _provider = new MockProvider(assets, additionalPackages: transformers.keys);
+  _provider = new MockProvider(assets,
+      staticPackages: staticPackages,
+      additionalPackages: transformers.keys);
   _barback = new Barback(_provider);
   // Add a dummy listener to the log so it doesn't print to stdout.
   _barback.log.listen((_) {});
@@ -469,8 +476,11 @@
 }
 
 /// An [AssetProvider] that provides the given set of assets.
-class MockProvider implements PackageProvider {
-  Iterable<String> get packages => _assets.keys;
+class MockProvider implements StaticPackageProvider {
+  Iterable<String> get packages =>
+      _assets.keys.toSet().difference(staticPackages);
+
+  final Set<String> staticPackages;
 
   final Map<String, AssetSet> _assets;
 
@@ -500,8 +510,11 @@
     _pauseCompleter = null;
   }
 
-  MockProvider(assets, {Iterable<String> additionalPackages})
-      : _assets = _normalizeAssets(assets, additionalPackages);
+  MockProvider(assets, {Iterable<String> staticPackages,
+          Iterable<String> additionalPackages})
+      : staticPackages = staticPackages == null ? new Set() :
+            staticPackages.toSet(),
+        _assets = _normalizeAssets(assets, additionalPackages);
 
   static Map<String, AssetSet> _normalizeAssets(assets,
       Iterable<String> additionalPackages) {
@@ -547,13 +560,8 @@
     (async ? _errors : _syncErrors).add(new AssetId.parse(name));
   }
 
-  List<AssetId> listAssets(String package, {String within}) {
-    if (within != null) {
-      throw new UnimplementedError("Doesn't handle 'within' yet.");
-    }
-
-    return _assets[package].map((asset) => asset.id);
-  }
+  Stream<AssetId> getAllAssetIds(String package) =>
+      new Stream.fromIterable(_assets[package].map((asset) => asset.id));
 
   Future<Asset> getAsset(AssetId id) {
     // Eagerly load the asset so we can test an asset's value changing between
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
index 1258d20..4d54585 100644
--- a/pkg/docgen/lib/src/generator.dart
+++ b/pkg/docgen/lib/src/generator.dart
@@ -338,25 +338,34 @@
 
 /// Given a package name, explore the directory and pull out all top level
 /// library files in the "lib" directory to document.
-List<Uri> _findFilesToDocumentInPackage(String packageName) {
+List<Uri> _findFilesToDocumentInPackage(String packageDir) {
   var libraries = [];
   // To avoid anaylzing package files twice, only files with paths not
   // containing '/packages' will be added. The only exception is if the file
   // to analyze already has a '/package' in its path.
-  var files = listDir(packageName, recursive: true, listDir: _packageDirList)
+  var files = listDir(packageDir, recursive: true, listDir: _packageDirList)
       .where((f) => f.endsWith('.dart') &&
         (!f.contains('${path.separator}packages') ||
-            packageName.contains('${path.separator}packages')))
+            packageDir.contains('${path.separator}packages')))
       .toList();
 
+  var packageLibDir = path.join(packageDir, 'lib');
+  var packageLibSrcDir = path.join(packageLibDir, 'src');
+
   files.forEach((String lib) {
-    // Only include libraries at the top level of "lib"
-    if (path.basename(path.dirname(lib)) == 'lib') {
+    // Only include libraries within the lib dir that are not in lib/src
+    if (path.isWithin(packageLibDir, lib) &&
+        !path.isWithin(packageLibSrcDir, lib)) {
       // Only add the file if it does not contain 'part of'
       // TODO(janicejl): Remove when Issue(12406) is resolved.
       var contents = new File(lib).readAsStringSync();
-      if (!(contents.contains(new RegExp('\npart of ')) ||
-          contents.startsWith(new RegExp('part of ')))) {
+
+
+      if (contents.contains(new RegExp('\npart of ')) ||
+          contents.startsWith(new RegExp('part of '))) {
+        logger.warning('Skipping part "$lib". '
+            'Part files should be in "lib/src".');
+      } else {
         libraries.add(new Uri.file(path.normalize(path.absolute(lib))));
         logger.info('Added to libraries: $lib');
       }
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
index dc3eb59..e9f59be 100644
--- a/pkg/docgen/pubspec.yaml
+++ b/pkg/docgen/pubspec.yaml
@@ -10,4 +10,4 @@
   yaml: '>=0.9.0 <3.0.0'
 dev_dependencies:
   scheduled_test: '>=0.10.0 <0.12.0'
-  unittest: '>=0.9.0 <0.11.0'
+  unittest: '>=0.9.0 <0.12.0'
diff --git a/pkg/docgen/test/generate_json_test.dart b/pkg/docgen/test/generate_json_test.dart
index a6ac53d..c22ae13 100644
--- a/pkg/docgen/test/generate_json_test.dart
+++ b/pkg/docgen/test/generate_json_test.dart
@@ -32,6 +32,9 @@
         d.matcherFile('library_list.json', isJsonMap),
         d.matcherFile('library_list.json',
             startsWith(_LIBRARY_LIST_UNINDENT_START)),
+        d.matcherFile('sub_lib.json', isJsonMap),
+        d.matcherFile('sub_lib.SubLibClass.json', isJsonMap),
+        d.matcherFile('sub_lib.SubLibPart.json', isJsonMap),
         d.matcherFile('test_lib-bar.C.json', isJsonMap),
         d.matcherFile('test_lib-bar.json', isJsonMap),
         d.matcherFile('test_lib-foo.B.json', isJsonMap),
diff --git a/pkg/docgen/test/multi_library_code/lib/src/src_lib.dart b/pkg/docgen/test/multi_library_code/lib/src/src_lib.dart
new file mode 100644
index 0000000..9755378
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/src/src_lib.dart
@@ -0,0 +1,5 @@
+library internal_lib;
+
+part 'src_lib_part.dart';
+
+class InternalLibClass {}
diff --git a/pkg/docgen/test/multi_library_code/lib/src/src_lib_part.dart b/pkg/docgen/test/multi_library_code/lib/src/src_lib_part.dart
new file mode 100644
index 0000000..1f866ed
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/src/src_lib_part.dart
@@ -0,0 +1,3 @@
+part of internal_lib;
+
+class InternalLibPart {}
diff --git a/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib.dart b/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib.dart
new file mode 100644
index 0000000..b1726a9
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib.dart
@@ -0,0 +1,5 @@
+library sub_lib;
+
+part 'sub_lib_part.dart';
+
+class SubLibClass {}
diff --git a/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib_part.dart b/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib_part.dart
new file mode 100644
index 0000000..9698296
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib_part.dart
@@ -0,0 +1,3 @@
+part of sub_lib;
+
+class SubLibPart {}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 3d174c6..9b8dad1 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -20,15 +20,9 @@
 scheduled_test/test/scheduled_stream/stream_matcher_test: Pass, Slow
 polymer/test/build/script_compactor_test: Pass, Slow
 
-
-# Failures when running with --optimization-counter-threshold=5
-[ $runtime == vm && $mode == debug && $checked ]
-intl/test/number_format_test: Skip # Dart Issue 20875
-
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 third_party/angular_tests/browser_test/*: Skip # github perf_api.dart issue 5
 third_party/angular_tests/browser_test/core_dom/shadow_root_options: Fail # Issue 19329
-polymer/example/component/news/test/news_index_test: RuntimeError # Issue 18931
 intl/test/date_time_format_http_request_test: Skip # Times out flakily. Issue 19544
 intl/test/date_time_format_local_even_test: Skip # Times out flakily. Issue 19544
 intl/test/date_time_format_local_odd_test: Skip # Times out flakily. Issue 19544
@@ -50,6 +44,7 @@
 polymer/test/js_interop_test: Pass, RuntimeError # Issue 18931
 polymer/test/nested_binding_test: Pass, RuntimeError # Issue 18931
 polymer/test/noscript_test: Pass, RuntimeError # Issue 18931
+polymer/test/platform_less_test: Pass, RuntimeError # Issue 18931
 polymer/test/prop_attr_bind_reflection_test: Pass, RuntimeError # Issue 18931
 polymer/test/prop_attr_reflection_test: Pass, RuntimeError # Issue 18931
 polymer/test/property_change_test: Pass, Timeout # Issue 18931
@@ -57,6 +52,7 @@
 polymer/test/publish_inherited_properties_test: Pass, RuntimeError # Issue 18931
 polymer/test/register_test: Pass, RuntimeError # Issue 18931
 polymer/test/take_attributes_test: Pass, RuntimeError # Issue 18931
+polymer/test/template_attr_template_test: Pass, RuntimeError # Issue 18931
 polymer/test/template_distribute_dynamic_test: Pass, RuntimeError # Issue 18931
 polymer/test/two_way_bind_test: Pass, RuntimeError # Issue 18931
 web_components/test/interop_test: Pass, RuntimeError # Issue 18931
@@ -142,11 +138,6 @@
 [ $compiler == dart2js && $csp && $runtime == drt ]
 web_components/test/interop_test: Fail # Issue 19329
 
-[ $compiler == dart2js && $checked && $runtime == ie9 ]
-crypto/test/base64_test: Timeout # Issue 12486
-collection/test/priority_queue_test: Pass, Slow # Issue 16426
-serialization/test/serialization_test: Skip
-
 [ $runtime == d8 ]
 analysis_server/test/analysis_notification_overrides_test: Pass, Slow # Issue 19756
 analysis_server/test/analysis_notification_occurrences_test: Pass, Slow # Issue 19756
@@ -156,6 +147,7 @@
 analysis_server/index/store/codec_test: Pass, Slow # Issue 19756
 
 [ $runtime == jsshell ]
+analysis_server/test/edit/refactoring_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/analysis_notification_occurrences_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/analysis_notification_outline_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/analysis_notification_navigation_test: Pass, Slow # Issue 16473, 19756
@@ -198,9 +190,11 @@
 polymer/test/instance_attrs_test: Skip #uses dart:html
 polymer/test/js_custom_event_test: Skip #uses dart:html
 polymer/test/js_interop_test: Skip #uses dart:html
+polymer/test/layout_test: Skip #uses dart:html
 polymer/test/mirror_loader_test: Skip # uses dart:html
 polymer/test/nested_binding_test: Skip # uses dart:html
 polymer/test/noscript_test: Skip #uses dart:html
+polymer/test/platform_less_test: Skip #uses dart:html
 polymer/test/prop_attr_bind_reflection_test: Skip #uses dart:html
 polymer/test/prop_attr_reflection_test: Skip #uses dart:html
 polymer/test/property_change_test: Skip # uses dart:html
@@ -209,6 +203,7 @@
 polymer/test/publish_inherited_properties_test: Skip #uses dart:html
 polymer/test/register_test: Skip #uses dart:html
 polymer/test/take_attributes_test: Skip #uses dart:html
+polymer/test/template_attr_template_test: Skip #uses dart:html
 polymer/test/template_distribute_dynamic_test: Skip #uses dart:html
 polymer/test/two_way_bind_test: Skip #uses dart:html
 polymer/test/unbind_test: Skip # uses dart:html
@@ -227,21 +222,15 @@
 intl/test/find_default_locale_browser_test: Fail
 intl/test/date_time_format_http_request_test: Skip # Timeout.
 
-[ $runtime == ie9 ]
-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, 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
+[ $runtime == safarimobilesim ]
+polymer/test/bind_mdv_test: RuntimeError # Issue 20929
 
 [ $ie ]
 polymer/test/noscript_test: RuntimeError, Pass # Issue 13260
 intl/test/date_time_format_http_request_test: Fail # Issue 8983
 polymer_expressions/test/syntax_test: Fail, Timeout, Pass # Issue 19138
 observe/test/list_path_observer_test: RuntimeError, Pass # Issue 20849
+polymer/test/template_attr_template_test: RuntimeError # Issue 20897
 
 [ $runtime == ie10 ]
 typed_data/test/typed_buffers_test/none: Fail # Issue   17607 (I put this here explicitly, since this is not the same as on ie9)
@@ -284,6 +273,7 @@
 # This test uses third_party/pkg/perf_api/lib/perf_api.dart, which
 # contains illegal constant constructors.
 third_party/angular_tests/browser_test: CompileTimeError
+custom_element/test/analyzer_test: StaticWarning # Issue 20939
 
 [ $compiler == dart2js && $runtime == none]
 polymer/e2e_test/canonicalization: Skip
@@ -474,22 +464,6 @@
 [ $use_repository_packages ]
 analyzer/test/*: PubGetError
 
-[ $runtime == ie9 ]
-polymer: Pass, Fail, Timeout # Issue 16717
-web_components/test/interop_test: Fail, Timeout # Issue 16717
-
-# No typed_data on IE9.
-http/test/html/client_test: Fail
-http/test/html/streamed_request_test: Skip
-http/test/mock_client_test: Fail
-http/test/multipart_test: Fail
-http/test/request_test: Fail
-http/test/response_test: Fail
-oauth2/test/authorization_code_grant_test: Fail
-oauth2/test/client_test: Fail
-oauth2/test/credentials_test: Fail
-oauth2/test/handle_access_token_response_test: Fail
-
 [ $runtime == drt ]
 http/test/html/client_test: Skip # Issue 18566
 
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index 5468743..cf8f3c5 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -1,11 +1,19 @@
-This file contains highlights of what changes on each version of the polymer
-package. We will also note important changes to the polyfill packages (observe,
-web_components, and template_binding) if they impact polymer.
+#### 0.14.0+1
+  * Small style improvements on error/warnings page.
+
+#### 0.14.0
+  * Upgraded to polymer 0.4.0 ([polymer-dev#d66a86e][d66a86e]).
+  * The platform.js script is no longer required in Chrome or Dartium
+    (version 36). You can now remove this from your projects for development,
+    and it will be injected when running pub build or pub serve. If you would
+    like the option to not inject platform.js at all in the built output (if you
+    are deploying to chrome exclusively), please star this bug
+    http://dartbug.com/20865.
 
 #### 0.13.1
   * Upgraded error messages to have a unique and stable identifier. This
     requires a version of `code_transformers` newer than `0.2.3`.
-  * Upgraded minimum version constraint on 'args' to '0.11.0'.
+  * Upgraded minimum version constraint on `args` to `0.11.0`.
 
 #### 0.13.0+3
   * Added a warning about flashes of unstyled content if we can detect a
diff --git a/pkg/polymer/example/component/news/test/news_index_test.html b/pkg/polymer/example/component/news/test/news_index_test.html
index 1f5ded0..03eae4f 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.html
+++ b/pkg/polymer/example/component/news/test/news_index_test.html
@@ -7,6 +7,8 @@
 <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <title>Simple Web Components Example</title>
+  <link rel="import" href="packages/web_components/platform.js">
+  <link rel="import" href="packages/web_components/dart_support.js">
   <link rel="import" href="packages/polymer/polymer.html">
   <link rel="import" href="../web/news-component.html">
   <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/lib/auto_binding.dart b/pkg/polymer/lib/auto_binding.dart
index 1e1d0b6..522152d 100644
--- a/pkg/polymer/lib/auto_binding.dart
+++ b/pkg/polymer/lib/auto_binding.dart
@@ -18,9 +18,15 @@
  * a model. It stamps its content in the dom adjacent to itself. When the
  * content is stamped, the `template-bound` event is fired.
  *
+ * **NOTE**: It is a good idea to use an id to select these elements. During
+ * code transformation it is likely that other template elements will be
+ * inserted at the top of the body above yours, so something like
+ * querySelector('template') is likely to break when built.
+ * See http://dartbug.com/20911.
+ *
  * Example:
  *
- *     <template is="auto-binding-dart">
+ *     <template id="my-template" is="auto-binding-dart">
  *       <div>Say something: <input value="{{value}}"></div>
  *       <div>You said: {{value}}</div>
  *       <button on-tap="{{buttonTap}}">Tap me!</button>
@@ -30,7 +36,7 @@
  *       import 'package:polymer/polymer.dart';
  *
  *       main() {
- *         var template = document.querySelector('template');
+ *         var template = document.querySelector('#my-template');
  *         template.model = new MyModel();
  *       }
  *
diff --git a/pkg/polymer/lib/builder.dart b/pkg/polymer/lib/builder.dart
index a2eb80f..3176ed7 100644
--- a/pkg/polymer/lib/builder.dart
+++ b/pkg/polymer/lib/builder.dart
@@ -83,6 +83,8 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
+import 'package:path/path.dart' as path;
+import 'package:yaml/yaml.dart';
 
 import 'src/build/linter.dart';
 import 'src/build/runner.dart';
@@ -116,6 +118,8 @@
         ' options to build(). Running as if no options were passed.');
     options = parseOptions([]);
   }
+  if (entryPoints == null) entryPoints = _parseEntryPointsFromPubspec();
+
   return options.forceDeploy
       ? deploy(entryPoints: entryPoints, options: options,
             currentPackage: currentPackage, packageDirs: packageDirs)
@@ -145,8 +149,10 @@
     options = parseOptions([]);
   }
   if (currentPackage == null) currentPackage = readCurrentPackageFromPubspec();
+  if (entryPoints == null) entryPoints = _parseEntryPointsFromPubspec();
   var linterOptions = new TransformOptions(entryPoints: entryPoints);
   var linter = new Linter(linterOptions);
+
   return runBarback(new BarbackOptions([[linter]], null,
       currentPackage: currentPackage, packageDirs: packageDirs,
       machineFormat: options.machineFormat));
@@ -177,6 +183,7 @@
     options = parseOptions([]);
   }
   if (currentPackage == null) currentPackage = readCurrentPackageFromPubspec();
+  if (entryPoints == null) entryPoints = _parseEntryPointsFromPubspec();
 
   var transformOptions = new TransformOptions(
       entryPoints: entryPoints,
@@ -318,3 +325,31 @@
       res['full'], res['machine'], res['deploy'], res['out'], res['js'],
       res['csp'], !res['debug']);
 }
+
+List<String> _parseEntryPointsFromPubspec() {
+  var entryPoints = [];
+  var pubspec = new File(path.join(
+      path.dirname(Platform.script.path), 'pubspec.yaml'));
+  if (!pubspec.existsSync()) {
+    print('error: pubspec.yaml file not found.');
+    return null;
+  }
+  var transformers = loadYaml(pubspec.readAsStringSync())['transformers'];
+  if (transformers == null) return null;
+  if (transformers is! List) {
+    print('Unexpected value for transformers, expected a List.');
+    return null;
+  }
+
+  transformers.forEach((t) {
+    if (t is! Map) return;
+    var polymer = t['polymer'];
+    if (polymer == null || polymer is! Map) return;
+
+    var parsedEntryPoints = readEntrypoints(polymer['entry_points']);
+    if (parsedEntryPoints == null) return;
+
+    entryPoints.addAll(parsedEntryPoints);
+  });
+  return entryPoints.isEmpty ? null : entryPoints;
+}
diff --git a/pkg/polymer/lib/default_build.dart b/pkg/polymer/lib/default_build.dart
new file mode 100644
index 0000000..01cac44
--- /dev/null
+++ b/pkg/polymer/lib/default_build.dart
@@ -0,0 +1,12 @@
+// 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 that defines a main which calls build() from builder.dart. For
+/// polymer projects the build.dart file can simply export this to make the
+/// linter run on all of the entry points defined in your pubspec.yaml.
+library polymer.default_build;
+
+import 'builder.dart';
+
+main(args) { lint(options: parseOptions(args)); }
diff --git a/pkg/polymer/lib/src/build/generated/messages.html b/pkg/polymer/lib/src/build/generated/messages.html
index 61089c9..4d5624c 100644
--- a/pkg/polymer/lib/src/build/generated/messages.html
+++ b/pkg/polymer/lib/src/build/generated/messages.html
@@ -33,6 +33,7 @@
   width: 80vw;
   margin: 20px;
   font-family: Roboto, sans-serif;
+  background-color: #f0f0f0;
 }
 
 h2 {
@@ -45,6 +46,16 @@
   font-weight: normal;
 }
 
+div:target {
+  background-color: #fff;
+  border: 1px solid #888;
+  border-radius: 5px;
+  padding: 0px 10px 2px 10px;
+  box-shadow: 7px 7px 5px #888888;
+  margin-bottom: 15px;
+}
+
+
 h3 {
   font-family: Montserrat, sans-serif;
   box-sizing: border-box;
@@ -55,6 +66,10 @@
   font-weight: normal;
 }
 
+div:target > h3 {
+  font-weight: bold;
+}
+
 pre {
   display: block;
   padding: 9.5px;
@@ -101,12 +116,12 @@
 <h2>Messages from package <code>code_transformers</code></h2>
 <hr />
 
-<h3 id="code_transformers_1">Absolute paths not allowed <a href="#code_transformers_1">#1</a></h3>
+<div id="code_transformers_1"><h3>Absolute paths not allowed <a href="#code_transformers_1">#1</a></h3>
 <p>The transformers processing your code were trying to resolve a URL and identify
 a file that they correspond to. Currently only relative paths can be resolved.</p>
-<hr />
+</div><hr />
 
-<h3 id="code_transformers_2">Invalid URL to reach another package <a href="#code_transformers_2">#2</a></h3>
+<div id="code_transformers_2"><h3>Invalid URL to reach another package <a href="#code_transformers_2">#2</a></h3>
 <p>To reach an asset that belongs to another package, use <code>package:</code> URLs in
 Dart code, but in any other language (like HTML or CSS) use relative URLs.</p>
 <p>These are the rules you must follow to write URLs that refer to files in other
@@ -216,9 +231,9 @@
 make sure that code works also in Dartium with a simple HTTP Server,
 existing transformers do not fix URLs, they just detect inconsistencies and
 produce an error message like this one, instead.</p></li></ul>
-<hr />
+</div><hr />
 
-<h3 id="code_transformers_3">Incomplete URL to asset in another package <a href="#code_transformers_3">#3</a></h3>
+<div id="code_transformers_3"><h3>Incomplete URL to asset in another package <a href="#code_transformers_3">#3</a></h3>
 <p>URLs that refer to assets in other packages need to explicitly mention the
 <code>packages/</code> directory. In the future this requirement might be removed, but for
 now you must use a canonical URL form for it.</p>
@@ -226,86 +241,86 @@
 you might expect a.html to import <code>../b/b.html</code>. Instead, it must import
 <code>../../packages/b/b.html</code>.
 See <a href="http://dartbug.com/15797">issue 15797</a>.</p>
-<hr /><h2>Messages from package <code>observe</code></h2>
+</div><hr /><h2>Messages from package <code>observe</code></h2>
 <hr />
 
-<h3 id="observe_1"><code>@observable</code> not supported on libraries <a href="#observe_1">#1</a></h3>
+<div id="observe_1"><h3><code>@observable</code> not supported on libraries <a href="#observe_1">#1</a></h3>
 <p>Only instance fields on <code>Observable</code> classes can be observable,
 and you must explicitly annotate each observable field as <code>@observable</code>.</p>
 <p>Support for using the <code>@observable</code> annotation in libraries, classes, and
 elsewhere is deprecated.</p>
-<hr />
+</div><hr />
 
-<h3 id="observe_2"><code>@observable</code> not supported on top-level fields <a href="#observe_2">#2</a></h3>
+<div id="observe_2"><h3><code>@observable</code> not supported on top-level fields <a href="#observe_2">#2</a></h3>
 <p>Only instance fields on <code>Observable</code> classes can be observable,
 and you must explicitly annotate each observable field as <code>@observable</code>.</p>
 <p>Support for using the <code>@observable</code> annotation in libraries, classes, and
 elsewhere is deprecated.</p>
-<hr />
+</div><hr />
 
-<h3 id="observe_3"><code>@observable</code> not supported on classes <a href="#observe_3">#3</a></h3>
+<div id="observe_3"><h3><code>@observable</code> not supported on classes <a href="#observe_3">#3</a></h3>
 <p>Only instance fields on <code>Observable</code> classes can be observable,
 and you must explicitly annotate each observable field as <code>@observable</code>.</p>
 <p>Support for using the <code>@observable</code> annotation in libraries, classes, and
 elsewhere is deprecated.</p>
-<hr />
+</div><hr />
 
-<h3 id="observe_4"><code>@observable</code> not supported on static fields <a href="#observe_4">#4</a></h3>
+<div id="observe_4"><h3><code>@observable</code> not supported on static fields <a href="#observe_4">#4</a></h3>
 <p>Only instance fields on <code>Observable</code> classes can be observable,
 and you must explicitly annotate each observable field as <code>@observable</code>.</p>
 <p>Support for using the <code>@observable</code> annotation in libraries, classes, and
 elsewhere is deprecated.</p>
-<hr />
+</div><hr />
 
-<h3 id="observe_5"><code>@observable</code> field not in an <code>Observable</code> class <a href="#observe_5">#5</a></h3>
+<div id="observe_5"><h3><code>@observable</code> field not in an <code>Observable</code> class <a href="#observe_5">#5</a></h3>
 <p>Only instance fields on <code>Observable</code> classes can be observable,
 and you must explicitly annotate each observable field as <code>@observable</code>.</p>
 <p>Support for using the <code>@observable</code> annotation in libraries, classes, and
 elsewhere is deprecated.</p>
-<hr /><h2>Messages from package <code>polymer</code></h2>
+</div><hr /><h2>Messages from package <code>polymer</code></h2>
 <hr />
 
-<h3 id="polymer_1">Import not found <a href="#polymer_1">#1</a></h3>
+<div id="polymer_1"><h3>Import not found <a href="#polymer_1">#1</a></h3>
 <p>An HTML import seems to be broken. This could be because the file doesn't exist
 or because the link URL is incorrect.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_2">Duplicate definition <a href="#polymer_2">#2</a></h3>
+<div id="polymer_2"><h3>Duplicate definition <a href="#polymer_2">#2</a></h3>
 <p>Custom element names are global and can only be defined once. Some common
 reasons why you might get two definitions:</p><ul><li>Two different elements are declared with the same name.</li><li>
 <p>A single HTML file defining an element, has been imported using two different
 URLs.</p></li></ul>
-<hr />
+</div><hr />
 
-<h3 id="polymer_3">Missing import to polymer.html <a href="#polymer_3">#3</a></h3>
+<div id="polymer_3"><h3>Missing import to polymer.html <a href="#polymer_3">#3</a></h3>
 <p>Starting with polymer 0.11.0, each file that uses the definition
 of polymer-element must import it either directly or transitively.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_4">Invalid import inside &lt;polymer-element> <a href="#polymer_4">#4</a></h3>
+<div id="polymer_4"><h3>Invalid import inside &lt;polymer-element> <a href="#polymer_4">#4</a></h3>
 <p>HTML imports are expected at the top of each document, outside of any
 polymer-element definitions. The polymer build process combines all your HTML
 files together so you can deploy a single HTML file with your application. This
 build process ignores imports that appear to be in the wrong location.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_5">Missing call to <code>initPolymer()</code> <a href="#polymer_5">#5</a></h3>
+<div id="polymer_5"><h3>Missing call to <code>initPolymer()</code> <a href="#polymer_5">#5</a></h3>
 <p>Your application entry point didn't have any Dart script tags, so it's missing
 some initialization needed for polymer.dart.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_6">Script tags with experimental bootstrap <a href="#polymer_6">#6</a></h3>
+<div id="polymer_6"><h3>Script tags with experimental bootstrap <a href="#polymer_6">#6</a></h3>
 <p>This experimental feature is no longer supported.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_7">Multiple Dart script tags per document <a href="#polymer_7">#7</a></h3>
+<div id="polymer_7"><h3>Multiple Dart script tags per document <a href="#polymer_7">#7</a></h3>
 <p>Dartium currently allows only one script tag per document. Any
 additional script tags might be ignored or result in an error. This will
 likely change in the future, but for now, combine the script tags together into
 a single Dart library.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_8">Imports before script tags <a href="#polymer_8">#8</a></h3>
+<div id="polymer_8"><h3>Imports before script tags <a href="#polymer_8">#8</a></h3>
 <p>It is good practice to put all your HTML imports at the beginning of the
 document, above any Dart script tags. Today, the execution of Dart script tags
 is not synchronous in Dartium, so the difference is not noticeable. However,
@@ -313,47 +328,47 @@
 match how they are in JavaScript. At that point the order of your imports with
 respect to script tags will be important. Following the practice of putting
 imports first protects your app from a future breaking change in this respect.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_9">Missing href on a <code>&lt;link&gt;</code> tag <a href="#polymer_9">#9</a></h3>
+<div id="polymer_9"><h3>Missing href on a <code>&lt;link&gt;</code> tag <a href="#polymer_9">#9</a></h3>
 <p>All <code>&lt;link&gt;</code> tags should have a valid URL to a resource.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_10"><code>&lt;element&gt;</code> is deprecated <a href="#polymer_10">#10</a></h3>
+<div id="polymer_10"><h3><code>&lt;element&gt;</code> is deprecated <a href="#polymer_10">#10</a></h3>
 <p>Long ago <code>&lt;polymer-element&gt;</code> used to be called <code>&lt;element&gt;</code>. You probably ran
 into this error if you were migrating code that was written on a very early
 version of polymer.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_11">Definition of a custom element not found <a href="#polymer_11">#11</a></h3>
+<div id="polymer_11"><h3>Definition of a custom element not found <a href="#polymer_11">#11</a></h3>
 <p>The polymer build was not able to find the definition of a custom element. This
 can happen if an element is defined with a <code>&lt;polymer-element&gt;</code> tag, but you are
 missing an HTML import or the import link is incorrect.</p>
 <p>This warning can also be a false alarm. For instance, when an element is defined
 programatically using <code>document.registerElement</code>. In that case the polymer build
 will not be able to see the definition and will produce this warning.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_12">Empty script tag <a href="#polymer_12">#12</a></h3>
+<div id="polymer_12"><h3>Empty script tag <a href="#polymer_12">#12</a></h3>
 <p>Script tags should either have a <code>src</code> attribute or a non-empty body.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_13">Expected Dart mime-type <a href="#polymer_13">#13</a></h3>
+<div id="polymer_13"><h3>Expected Dart mime-type <a href="#polymer_13">#13</a></h3>
 <p>You seem to have a <code>.dart</code> extension on a script tag, but the mime-type
 doesn't match <code>application/dart</code>.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_14">Expected Dart file extension <a href="#polymer_14">#14</a></h3>
+<div id="polymer_14"><h3>Expected Dart file extension <a href="#polymer_14">#14</a></h3>
 <p>You are using the <code>application/dart</code> mime-type on a script tag, so
 the URL to the script source URL should have a <code>.dart</code> extension.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_15">Script with both src and inline text <a href="#polymer_15">#15</a></h3>
+<div id="polymer_15"><h3>Script with both src and inline text <a href="#polymer_15">#15</a></h3>
 <p>You have a script tag that includes both a <code>src</code> attribute and inline script
 text. You must choose one or the other.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_16">Incorrect instantiation: missing base tag in instantiation <a href="#polymer_16">#16</a></h3>
+<div id="polymer_16"><h3>Incorrect instantiation: missing base tag in instantiation <a href="#polymer_16">#16</a></h3>
 <p>When you declare that a custom element extends from a base tag, for example:</p>
 <pre><code>&lt;polymer-element name="my-example" extends="ul"&gt;
 </code></pre>
@@ -373,9 +388,9 @@
 have the extra functionality of your custom element. In the example above, using
 <code>&lt;ul&gt;</code> tells the browser which base type it must create before
 doing the upgrade.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_17">Incorrect instantiation: extra <code>is</code> attribute or missing <code>extends</code> in declaration <a href="#polymer_17">#17</a></h3>
+<div id="polymer_17"><h3>Incorrect instantiation: extra <code>is</code> attribute or missing <code>extends</code> in declaration <a href="#polymer_17">#17</a></h3>
 <p>Creating a custom element using the syntax:</p>
 <pre><code>&lt;ul is="my-example"&gt;
 </code></pre>
@@ -389,9 +404,9 @@
 <code>extends</code> attribute, for example:</p>
 <pre><code>&lt;polymer-element name="my-example" extends="ul"&gt;
 </code></pre>
-<hr />
+</div><hr />
 
-<h3 id="polymer_18">Incorrect instantiation: base tag seems wrong <a href="#polymer_18">#18</a></h3>
+<div id="polymer_18"><h3>Incorrect instantiation: base tag seems wrong <a href="#polymer_18">#18</a></h3>
 <p>It seems you have a declaration like:</p>
 <pre><code>&lt;polymer-element name="my-example" extends="div"&gt;
 </code></pre>
@@ -405,9 +420,9 @@
 <p>or the declaration should be fixed to be like:</p>
 <pre><code>&lt;polymer-element name="my-example" extends="span"&gt;
 </code></pre>
-<hr />
+</div><hr />
 
-<h3 id="polymer_19">No dashes allowed in custom attributes <a href="#polymer_19">#19</a></h3>
+<div id="polymer_19"><h3>No dashes allowed in custom attributes <a href="#polymer_19">#19</a></h3>
 <p>Polymer used to recognize attributes with dashes like <code>my-name</code> and convert them
 to match properties where dashes were removed, and words follow the camelCase
 style (for example <code>myName</code>). This feature is no longer available. Now simply
@@ -415,59 +430,59 @@
 <p>Because HTML attributes are case-insensitive, you can also write the name of
 your property entirely in lowercase. Just be sure that your custom-elements
 don't declare two properties with the same name but different capitalization.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_20">Event handlers not supported here <a href="#polymer_20">#20</a></h3>
+<div id="polymer_20"><h3>Event handlers not supported here <a href="#polymer_20">#20</a></h3>
 <p>Bindings of the form <code>{{ }}</code> are supported inside <code>&lt;template&gt;</code> nodes, even outside
 of <code>&lt;polymer-element&gt;</code> declarations. However, those bindings only support binding
 values into the content of a node or an attribute.</p>
 <p>Inline event handlers of the form <code>on-click="{{method}}"</code> are a special feature
 of polymer elements, so they are only supported inside <code>&lt;polymer-element&gt;</code>
 definitions.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_21">No expressions allowed in event handler bindings <a href="#polymer_21">#21</a></h3>
+<div id="polymer_21"><h3>No expressions allowed in event handler bindings <a href="#polymer_21">#21</a></h3>
 <p>Unlike data bindings, event handler bindings of the form <code>on-click="{{method}}"</code>
 are not evaluated as expressions. They are meant to just contain a simple name
 that resolves to a method in your polymer element's class definition.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_22">Nested polymer element definitions not allowed <a href="#polymer_22">#22</a></h3>
+<div id="polymer_22"><h3>Nested polymer element definitions not allowed <a href="#polymer_22">#22</a></h3>
 <p>Because custom element names are global, there is no need to have a
 <code>&lt;polymer-element&gt;</code> definition nested within a <code>&lt;polymer-element&gt;</code>. If you have
 a definition inside another, move the second definition out.</p>
 <p>You might see this error if you have an HTML import within a polymer element.
 You should be able to move the import out of the element definition.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_23">Polymer element definitions without a name <a href="#polymer_23">#23</a></h3>
+<div id="polymer_23"><h3>Polymer element definitions without a name <a href="#polymer_23">#23</a></h3>
 <p>Polymer element definitions must have a name. You can include a name by using
 the <code>name</code> attribute in <code>&lt;polymer-element&gt;</code> for example:</p>
 <pre><code>&lt;polymer-element name="my-example"&gt;
 </code></pre>
-<hr />
+</div><hr />
 
-<h3 id="polymer_24">Custom element name missing a dash <a href="#polymer_24">#24</a></h3>
+<div id="polymer_24"><h3>Custom element name missing a dash <a href="#polymer_24">#24</a></h3>
 <p>Custom element names must have a dash (<code>-</code>) and can't be any of the following
 reserved names:</p><ul><li><code>annotation-xml</code></li><li><code>color-profile</code></li><li><code>font-face</code></li><li><code>font-face-src</code></li><li><code>font-face-uri</code></li><li><code>font-face-format</code></li><li><code>font-face-name</code></li><li><code>missing-glyph</code></li></ul>
-<hr />
+</div><hr />
 
-<h3 id="polymer_25">Error while inlining an import <a href="#polymer_25">#25</a></h3>
+<div id="polymer_25"><h3>Error while inlining an import <a href="#polymer_25">#25</a></h3>
 <p>An error occurred while inlining an import in the polymer build. This is often
 the result of a broken HTML import.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_26">Error while inlining a stylesheet <a href="#polymer_26">#26</a></h3>
+<div id="polymer_26"><h3>Error while inlining a stylesheet <a href="#polymer_26">#26</a></h3>
 <p>An error occurred while inlining a stylesheet in the polymer build. This is
 often the result of a broken URL in a <code>&lt;link rel="stylesheet" href="..."&gt;</code>.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_27">URL to a script file might be incorrect <a href="#polymer_27">#27</a></h3>
+<div id="polymer_27"><h3>URL to a script file might be incorrect <a href="#polymer_27">#27</a></h3>
 <p>An error occurred trying to read a script tag on a given URL. This is often the
 result of a broken URL in a <code>&lt;script src="..."&gt;</code>.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_28">Attribute missing "_" prefix <a href="#polymer_28">#28</a></h3>
+<div id="polymer_28"><h3>Attribute missing "_" prefix <a href="#polymer_28">#28</a></h3>
 <p>Not all browsers support bindings to certain attributes, especially URL
 attributes. Some browsers might sanitize attributes and result in an
 incorrect value. For this reason polymer provides a special set of attributes
@@ -480,94 +495,94 @@
 <pre><code>&lt;img _src="{{binding}}"&gt;
 </code></pre>
 <p>For more information, see <a href="http://goo.gl/5av8cU">http://goo.gl/5av8cU</a>.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_29">Attribute with extra "_" prefix <a href="#polymer_29">#29</a></h3>
+<div id="polymer_29"><h3>Attribute with extra "_" prefix <a href="#polymer_29">#29</a></h3>
 <p>A special attribute exists to support bindings on URL attributes. For example,
 this correctly binds the <code>src</code> attribute in an image:</p>
 <pre><code>&lt;img _src="{{binding}}"&gt;
 </code></pre>
 <p>However, this special <code>_src</code> attribute is only available for bindings. If you
 just have a URL, use the normal <code>src</code> attribute instead.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_30">Internal error: don't know how to include a URL <a href="#polymer_30">#30</a></h3>
+<div id="polymer_30"><h3>Internal error: don't know how to include a URL <a href="#polymer_30">#30</a></h3>
 <p>Sorry, you just ran into a bug in the polymer transformer code. Please file a
 bug at <a href="http://dartbug.com/new">http://dartbug.com/new</a> including, if possible, some example code that
 can help the team reproduce the issue.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_31">Internal error: phases run out of order <a href="#polymer_31">#31</a></h3>
+<div id="polymer_31"><h3>Internal error: phases run out of order <a href="#polymer_31">#31</a></h3>
 <p>Sorry, you just ran into a bug in the polymer transformer code. Please file a
 bug at <a href="http://dartbug.com/new">http://dartbug.com/new</a> including, if possible, some example code that
 can help the team reproduce the issue.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_32"><code>@CustomTag</code> used on a private class <a href="#polymer_32">#32</a></h3>
+<div id="polymer_32"><h3><code>@CustomTag</code> used on a private class <a href="#polymer_32">#32</a></h3>
 <p>The <code>@CustomTag</code> annotation is currently only supported on public classes. If
 you need to register a custom element whose implementation is a private class
 (that is, a class whose name starts with <code>_</code>), you can still do so by invoking
 <code>Polymer.register</code> within a public method marked with <code>@initMethod</code>.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_33"><code>@initMethod</code> is on a private function <a href="#polymer_33">#33</a></h3>
+<div id="polymer_33"><h3><code>@initMethod</code> is on a private function <a href="#polymer_33">#33</a></h3>
 <p>The <code>@initMethod</code> annotation is currently only supported on public top-level
 functions.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_34">Missing argument in annotation <a href="#polymer_34">#34</a></h3>
+<div id="polymer_34"><h3>Missing argument in annotation <a href="#polymer_34">#34</a></h3>
 <p>The annotation expects one argument, but the argument was not provided.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_35">Invalid argument in annotation <a href="#polymer_35">#35</a></h3>
+<div id="polymer_35"><h3>Invalid argument in annotation <a href="#polymer_35">#35</a></h3>
 <p>The polymer transformer was not able to extract a constant value for the
 annotation argument. This can happen if your code is currently in a state that
 can't be analyzed (for example, it has parse errors) or if the expression passed
 as an argument is invalid (for example, it is not a compile-time constant).</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_36">No polymer initializers found <a href="#polymer_36">#36</a></h3>
+<div id="polymer_36"><h3>No polymer initializers found <a href="#polymer_36">#36</a></h3>
 <p>No polymer initializers were found. Make sure to either 
 annotate your polymer elements with @CustomTag or include a 
 top level method annotated with @initMethod that registers your 
 elements. Both annotations are defined in the polymer library (
 package:polymer/polymer.dart).</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_37">Event bindings with @ are no longer supported <a href="#polymer_37">#37</a></h3>
+<div id="polymer_37"><h3>Event bindings with @ are no longer supported <a href="#polymer_37">#37</a></h3>
 <p>For a while there was an undocumented feature that allowed users to include
 expressions in event bindings using the <code>@</code> prefix, for example:</p>
 <pre><code>&lt;div on-click="{{@a.b.c}}"&gt;
 
 </code></pre>
 <p>This feature is no longer supported.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_38">Private symbol in event handler <a href="#polymer_38">#38</a></h3>
+<div id="polymer_38"><h3>Private symbol in event handler <a href="#polymer_38">#38</a></h3>
 <p>Currently private members can't be used in event handler bindings. So you can't
 write:</p>
 <pre><code>&lt;div on-click="{{_method}}"&gt;
 </code></pre>
 <p>This restriction might be removed in the future, but for now, you need to make
 your event handlers public.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_39">Private symbol in binding expression <a href="#polymer_39">#39</a></h3>
+<div id="polymer_39"><h3>Private symbol in binding expression <a href="#polymer_39">#39</a></h3>
 <p>Private members can't be used in binding expressions. For example, you can't
 write:</p>
 <pre><code>&lt;div&gt;{{a.b._c}}&lt;/div&gt;
 </code></pre>
-<hr />
+</div><hr />
 
-<h3 id="polymer_40">A warning was found while parsing the HTML document <a href="#polymer_40">#40</a></h3>
+<div id="polymer_40"><h3>A warning was found while parsing the HTML document <a href="#polymer_40">#40</a></h3>
 <p>The polymer transformer uses a parser that implements the HTML5 spec
 (<code>html5lib</code>). This message reports a
 warning that the parser detected.</p>
-<hr />
+</div><hr />
 
-<h3 id="polymer_41">Possible flash of unstyled content <a href="#polymer_41">#41</a></h3>
+<div id="polymer_41"><h3>Possible flash of unstyled content <a href="#polymer_41">#41</a></h3>
 <p>Custom element found in document body without an "unresolved" attribute on it or
 one of its parents. This means your app probably has a flash of unstyled content
 before it finishes loading. See <a href="http://goo.gl/iN03Pj">http://goo.gl/iN03Pj</a> for more info.</p>
-<hr /></body>
+</div><hr /></body>
 </html>
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index 8663115..7a29953 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -169,6 +169,7 @@
   BuildLogger _logger;
   AssetId _sourceId;
   bool _inPolymerElement = false;
+  bool _inAutoBindingElement = false;
   bool _dartTagSeen = false;
   bool _polymerHtmlSeen = false;
   bool _polymerExperimentalHtmlSeen = false;
@@ -192,10 +193,19 @@
       case 'element': _validateElementElement(node); break;
       case 'polymer-element': _validatePolymerElement(node); break;
       case 'script': _validateScriptElement(node); break;
+      case 'template':
+        var isTag = node.attributes['is'];
+        if (isTag != null && AUTO_BINDING_ELEMENTS.contains(isTag)) {
+          _inAutoBindingElement = true;
+        }
+        _validateNormalElement(node);
+        super.visitElement(node);
+        _inAutoBindingElement = false;
+        break;
       default:
-         _validateNormalElement(node);
-         super.visitElement(node);
-         break;
+        _validateNormalElement(node);
+        super.visitElement(node);
+        break;
     }
   }
 
@@ -409,7 +419,7 @@
   void _validateEventHandler(Element node, String name, String value) {
     if (!name.startsWith('on-')) return;
 
-    if (!_inPolymerElement) {
+    if (!_inPolymerElement && !_inAutoBindingElement) {
       _logger.warning(EVENT_HANDLERS_ONLY_WITHIN_POLYMER,
           span: node.attributeSpans[name]);
       return;
@@ -443,3 +453,5 @@
 
 const List<String> INTERNALLY_DEFINED_ELEMENTS = 
     const ['auto-binding-dart', 'polymer-element'];
+const List<String> AUTO_BINDING_ELEMENTS =
+    const ['auto-binding-dart', 'auto-binding'];
diff --git a/pkg/polymer/lib/src/build/polyfill_injector.dart b/pkg/polymer/lib/src/build/polyfill_injector.dart
index 1b88728..e416352 100644
--- a/pkg/polymer/lib/src/build/polyfill_injector.dart
+++ b/pkg/polymer/lib/src/build/polyfill_injector.dart
@@ -37,7 +37,8 @@
         convertErrorsToWarnings: !options.releaseMode,
         detailsUri: 'http://goo.gl/5HPeuP');
     return readPrimaryAsHtml(transform, logger).then((document) {
-      bool webComponentsFound = false;
+      bool dartSupportFound = false;
+      bool platformJsFound = false;
       Element dartJs;
       final dartScripts = <Element>[];
 
@@ -45,8 +46,10 @@
         var src = tag.attributes['src'];
         if (src != null) {
           var last = src.split('/').last;
-          if (_webComponentsJS.hasMatch(last)) {
-            webComponentsFound = true;
+          if (_platformJS.hasMatch(last)) {
+            platformJsFound = true;
+          } else if (_dartSupportJS.hasMatch(last)) {
+            dartSupportFound = true;
           } else if (last == 'dart.js') {
             dartJs = tag;
           }
@@ -95,12 +98,9 @@
       }
 
       var suffix = options.releaseMode ? '.js' : '.concat.js';
-      if (!webComponentsFound) {
-        _addScriptFirst('web_components/dart_support.js');
-
-        // platform.js should come before all other scripts.
-        _addScriptFirst('web_components/platform$suffix');
-      }
+      if (!dartSupportFound) _addScriptFirst('web_components/dart_support.js');
+      // platform.js should come before all other scripts.
+      if (!platformJsFound) _addScriptFirst('web_components/platform$suffix');
 
       transform.addOutput(
           new Asset.fromString(transform.primaryInput.id, document.outerHtml));
@@ -108,5 +108,5 @@
   }
 }
 
-final _webComponentsJS = new RegExp(r'platform.*\.js',
-    caseSensitive: false);
+final _platformJS = new RegExp(r'platform.*\.js', caseSensitive: false);
+final _dartSupportJS = new RegExp(r'dart_support.js', caseSensitive: false);
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index 42486c3..fb5c8c9 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -159,8 +159,8 @@
 
   // from declaration/path.js
   void resolveElementPaths(Node node) {
-    if (_Platform == null) return;
-    _Platform['urlResolver'].callMethod('resolveDom', [node]);
+    if (_Polymer == null) return;
+    _Polymer['urlResolver'].callMethod('resolveDom', [node]);
   }
 
   // Dart note: renamed from "addResolvePathApi".
@@ -553,3 +553,4 @@
 final _ATTRIBUTES_REGEX = new RegExp(r'\s|,');
 
 final JsObject _Platform = js.context['Platform'];
+final JsObject _Polymer = js.context['Polymer'];
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index c9d5ade..37a43ea 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -643,6 +643,8 @@
   /// You can override this method to change the instantiation behavior of the
   /// template, for example to use a different data-binding syntax.
   DocumentFragment instanceTemplate(Element template) {
+    // ensure template is decorated (lets things like <tr template ...> work)
+    TemplateBindExtension.decorate(template);
     var syntax = this.syntax;
     var t = templateBind(template);
     if (syntax == null && t.bindingDelegate == null) {
@@ -843,12 +845,12 @@
 
       closeNamedObserver('${name}__array');
     }
-    // if the new value is an array, being observing it
+    // if the new value is an array, begin observing it
     if (value is ObservableList) {
       _observeLog.fine(() => '[$_name] observeArrayValue: register $name');
       var sub = value.listChanges.listen((changes) {
         for (var callback in callbacks) {
-          smoke.invoke(this, callback, [old], adjust: true);
+          smoke.invoke(this, callback, [changes], adjust: true);
         }
       });
       registerNamedObserver('${name}__array', sub);
diff --git a/pkg/polymer/lib/src/js/polymer/build.log b/pkg/polymer/lib/src/js/polymer/build.log
index 703f18d..01302a8 100644
--- a/pkg/polymer/lib/src/js/polymer/build.log
+++ b/pkg/polymer/lib/src/js/polymer/build.log
@@ -1,34 +1,35 @@
 BUILD LOG
 ---------
-Build Time: 2014-08-12T15:26:59
+Build Time: 2014-09-10T09:11:24
 
 NODEJS INFORMATION
 ==================
 nodejs: v0.10.29
-chai: 1.9.1
 grunt: 0.4.5
-grunt-audit: 0.0.3
+chai: 1.9.1
 grunt-concat-sourcemap: 0.4.3
-grunt-contrib-concat: 0.5.0
-grunt-contrib-uglify: 0.4.1
-grunt-contrib-yuidoc: 0.5.2
+grunt-audit: 0.0.3
+grunt-contrib-concat: 0.4.0
+grunt-contrib-uglify: 0.5.1
 grunt-karma: 0.8.3
 grunt-string-replace: 0.2.7
-karma: 0.12.21
+karma: 0.12.23
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
 karma-ie-launcher: 0.1.5
-karma-mocha: 0.1.7
+karma-mocha: 0.1.9
 karma-safari-launcher: 0.1.1
 karma-script-launcher: 0.1.0
 mocha: 1.21.4
 
 REPO REVISIONS
 ==============
-polymer-expressions: 92f860ef9ff871e4b51fc5da38b2b76ba13ebdbe
-polymer-gestures: a21142376f0c8a9541a2919d3f77ca557d13afe9
-polymer-dev: 5d00e4b0252e443e2ed6d5c4a04a568e72ef3b25
+polymer-expressions: 30afaf9fffe647bbe53e67f4ac12596acaca77ca
+polymer-gestures: 3534e23ccc0f50ee24e47fd915579a5ebc770a76
+polymer-dev: d66a86eac545ff8115f781ec6b1466024f49c0c0
+HTMLImports: d0c8d08f23ed407288bcac385e19747a3fbeba96
+TemplateBinding: 41e95ea0e4b45543a29ea5240cd4f0defc7208c1
 
 BUILD HASHES
 ============
-build/polymer.js: 23408455239101d17426ef7448361730103cb2cf
\ No newline at end of file
+build/polymer.js: 5eb34c0f8e6abe9984a5a2811c022fca4d1098b6
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/layout.html b/pkg/polymer/lib/src/js/polymer/layout.html
index 46dec0a..55d4d2f 100644
--- a/pkg/polymer/lib/src/js/polymer/layout.html
+++ b/pkg/polymer/lib/src/js/polymer/layout.html
@@ -1,278 +1,286 @@
-<!--
-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
--->
-<style shim-shadowdom>
-/*******************************
-          Flex Layout
-*******************************/
-
-html /deep/ [layout][horizontal], html /deep/ [layout][vertical] {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-
-html /deep/ [layout][horizontal][inline], html /deep/ [layout][vertical][inline] {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-}
-
-html /deep/ [layout][horizontal] {
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-}
-
-html /deep/ [layout][horizontal][reverse] {
-  -ms-flex-direction: row-reverse;
-  -webkit-flex-direction: row-reverse;
-  flex-direction: row-reverse;
-}
-
-html /deep/ [layout][vertical] {
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-}
-
-html /deep/ [layout][vertical][reverse] {
-  -ms-flex-direction: column-reverse;
-  -webkit-flex-direction: column-reverse;
-  flex-direction: column-reverse;
-}
-
-html /deep/ [layout][wrap] {
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-}
-
-html /deep/ [layout][wrap-reverse] {
-  -ms-flex-wrap: wrap-reverse;
-  -webkit-flex-wrap: wrap-reverse;
-  flex-wrap: wrap-reverse;
-}
-
-html /deep/ [flex] {
-  -ms-flex: 1;
-  -webkit-flex: 1;
-  flex: 1;
-}
-
-html /deep/ [flex][auto] {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-}
-
-html /deep/ [flex][none] {
-  -ms-flex: none;
-  -webkit-flex: none;
-  flex: none;
-}
-
-html /deep/ [flex][one] {
-  -ms-flex: 1;
-  -webkit-flex: 1;
-  flex: 1;
-}
-
-html /deep/ [flex][two] {
-  -ms-flex: 2;
-  -webkit-flex: 2;
-  flex: 2;
-}
-
-html /deep/ [flex][three] {
-  -ms-flex: 3;
-  -webkit-flex: 3;
-  flex: 3;
-}
-
-html /deep/ [flex][four] {
-  -ms-flex: 4;
-  -webkit-flex: 4;
-  flex: 4;
-}
-
-html /deep/ [flex][five] {
-  -ms-flex: 5;
-  -webkit-flex: 5;
-  flex: 5;
-}
-
-html /deep/ [flex][six] {
-  -ms-flex: 6;
-  -webkit-flex: 6;
-  flex: 6;
-}
-
-html /deep/ [flex][seven] {
-  -ms-flex: 7;
-  -webkit-flex: 7;
-  flex: 7;
-}
-
-html /deep/ [flex][eight] {
-  -ms-flex: 8;
-  -webkit-flex: 8;
-  flex: 8;
-}
-
-html /deep/ [flex][nine] {
-  -ms-flex: 9;
-  -webkit-flex: 9;
-  flex: 9;
-}
-
-html /deep/ [flex][ten] {
-  -ms-flex: 10;
-  -webkit-flex: 10;
-  flex: 10;
-}
-
-html /deep/ [flex][eleven] {
-  -ms-flex: 11;
-  -webkit-flex: 11;
-  flex: 11;
-}
-
-html /deep/ [flex][twelve] {
-  -ms-flex: 12;
-  -webkit-flex: 12;
-  flex: 12;
-}
-
-/* alignment in cross axis */
-
-html /deep/ [layout][start] {
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-
-html /deep/ [layout][center], html /deep/ [layout][center-center] {
-  -ms-flex-align: center;
-  -webkit-align-items: center;
-  align-items: center;
-}
-
-html /deep/ [layout][end] {
-  -ms-flex-align: end;
-  -webkit-align-items: flex-end;
-  align-items: flex-end;
-}
-
-/* alignment in main axis */
-
-html /deep/ [layout][start-justified] {
-  -ms-flex-pack: start;
-  -webkit-justify-content: flex-start;
-  justify-content: flex-start;
-}
-
-html /deep/ [layout][center-justified], html /deep/ [layout][center-center] {
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-}
-
-html /deep/ [layout][end-justified] {
-  -ms-flex-pack: end;
-  -webkit-justify-content: flex-end;
-  justify-content: flex-end;
-}
-
-html /deep/ [layout][around-justified] {
-  -ms-flex-pack: around;
-  -webkit-justify-content: space-around;
-  justify-content: space-around;
-}
-
-html /deep/ [layout][justified] {
-  -ms-flex-pack: justify;
-  -webkit-justify-content: space-between;
-  justify-content: space-between;
-}
-
-/* self alignment */
-
-html /deep/ [self-start] {
-  -ms-align-self: flex-start;
-  -webkit-align-self: flex-start;
-  align-self: flex-start;
-}
-
-html /deep/ [self-center] {
-  -ms-align-self: center;
-  -webkit-align-self: center;
-  align-self: center;
-}
-
-html /deep/ [self-end] {
-  -ms-align-self: flex-end;
-  -webkit-align-self: flex-end;
-  align-self: flex-end;
-}
-
-html /deep/ [self-stretch] {
-  -ms-align-self: stretch;
-  -webkit-align-self: stretch;
-  align-self: stretch;
-}
-
-/*******************************
-          Other Layout
-*******************************/
-
-html /deep/ [block] {
-  display: block;
-}
-
-/* ie support for hidden */
-html /deep/ [hidden] {
-  display: none !important;
-}
-
-html /deep/ [relative] {
-  position: relative;
-}
-
-html /deep/ [fit] {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-body[fullbleed] {
-  margin: 0;
-  height: 100vh;
-}
-
-/*******************************
-            Other
-*******************************/
-
-html /deep/ [segment], html /deep/ segment {
-  display: block;
-  position: relative;
-  -webkit-box-sizing: border-box;
-  -ms-box-sizing: border-box;
-  box-sizing: border-box;
-  margin: 1em 0.5em;
-  padding: 1em;
-  background-color: white;
-  -webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
-  box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
-  border-radius: 5px 5px 5px 5px;
-}
-
+<!--

+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

+-->

+<style shim-shadowdom>

+/*******************************

+          Flex Layout

+*******************************/

+

+html /deep/ [layout][horizontal], html /deep/ [layout][vertical] {

+  display: -ms-flexbox;

+  display: -webkit-flex;

+  display: flex;

+}

+

+html /deep/ [layout][horizontal][inline], html /deep/ [layout][vertical][inline] {

+  display: -ms-inline-flexbox;

+  display: -webkit-inline-flex;

+  display: inline-flex;

+}

+

+html /deep/ [layout][horizontal] {

+  -ms-flex-direction: row;

+  -webkit-flex-direction: row;

+  flex-direction: row;

+}

+

+html /deep/ [layout][horizontal][reverse] {

+  -ms-flex-direction: row-reverse;

+  -webkit-flex-direction: row-reverse;

+  flex-direction: row-reverse;

+}

+

+html /deep/ [layout][vertical] {

+  -ms-flex-direction: column;

+  -webkit-flex-direction: column;

+  flex-direction: column;

+}

+

+html /deep/ [layout][vertical][reverse] {

+  -ms-flex-direction: column-reverse;

+  -webkit-flex-direction: column-reverse;

+  flex-direction: column-reverse;

+}

+

+html /deep/ [layout][wrap] {

+  -ms-flex-wrap: wrap;

+  -webkit-flex-wrap: wrap;

+  flex-wrap: wrap;

+}

+

+html /deep/ [layout][wrap-reverse] {

+  -ms-flex-wrap: wrap-reverse;

+  -webkit-flex-wrap: wrap-reverse;

+  flex-wrap: wrap-reverse;

+}

+

+html /deep/ [flex] {

+  -ms-flex: 1 1 0.000000001px;

+  -webkit-flex: 1;

+  flex: 1;

+  -webkit-flex-basis: 0.000000001px;

+  flex-basis: 0.000000001px;

+}

+

+html /deep/ [vertical][layout] > [flex][auto-vertical], html /deep/ [vertical][layout]::shadow [flex][auto-vertical] {

+  -ms-flex: 1 1 auto;

+  -webkit-flex-basis: auto;

+  flex-basis: auto;

+}

+

+html /deep/ [flex][auto] {

+  -ms-flex: 1 1 auto;

+  -webkit-flex-basis: auto;

+  flex-basis: auto;

+}

+

+html /deep/ [flex][none] {

+  -ms-flex: none;

+  -webkit-flex: none;

+  flex: none;

+}

+

+html /deep/ [flex][one] {

+  -ms-flex: 1;

+  -webkit-flex: 1;

+  flex: 1;

+}

+

+html /deep/ [flex][two] {

+  -ms-flex: 2;

+  -webkit-flex: 2;

+  flex: 2;

+}

+

+html /deep/ [flex][three] {

+  -ms-flex: 3;

+  -webkit-flex: 3;

+  flex: 3;

+}

+

+html /deep/ [flex][four] {

+  -ms-flex: 4;

+  -webkit-flex: 4;

+  flex: 4;

+}

+

+html /deep/ [flex][five] {

+  -ms-flex: 5;

+  -webkit-flex: 5;

+  flex: 5;

+}

+

+html /deep/ [flex][six] {

+  -ms-flex: 6;

+  -webkit-flex: 6;

+  flex: 6;

+}

+

+html /deep/ [flex][seven] {

+  -ms-flex: 7;

+  -webkit-flex: 7;

+  flex: 7;

+}

+

+html /deep/ [flex][eight] {

+  -ms-flex: 8;

+  -webkit-flex: 8;

+  flex: 8;

+}

+

+html /deep/ [flex][nine] {

+  -ms-flex: 9;

+  -webkit-flex: 9;

+  flex: 9;

+}

+

+html /deep/ [flex][ten] {

+  -ms-flex: 10;

+  -webkit-flex: 10;

+  flex: 10;

+}

+

+html /deep/ [flex][eleven] {

+  -ms-flex: 11;

+  -webkit-flex: 11;

+  flex: 11;

+}

+

+html /deep/ [flex][twelve] {

+  -ms-flex: 12;

+  -webkit-flex: 12;

+  flex: 12;

+}

+

+/* alignment in cross axis */

+

+html /deep/ [layout][start] {

+  -ms-flex-align: start;

+  -webkit-align-items: flex-start;

+  align-items: flex-start;

+}

+

+html /deep/ [layout][center], html /deep/ [layout][center-center] {

+  -ms-flex-align: center;

+  -webkit-align-items: center;

+  align-items: center;

+}

+

+html /deep/ [layout][end] {

+  -ms-flex-align: end;

+  -webkit-align-items: flex-end;

+  align-items: flex-end;

+}

+

+/* alignment in main axis */

+

+html /deep/ [layout][start-justified] {

+  -ms-flex-pack: start;

+  -webkit-justify-content: flex-start;

+  justify-content: flex-start;

+}

+

+html /deep/ [layout][center-justified], html /deep/ [layout][center-center] {

+  -ms-flex-pack: center;

+  -webkit-justify-content: center;

+  justify-content: center;

+}

+

+html /deep/ [layout][end-justified] {

+  -ms-flex-pack: end;

+  -webkit-justify-content: flex-end;

+  justify-content: flex-end;

+}

+

+html /deep/ [layout][around-justified] {

+  -ms-flex-pack: distribute;

+  -webkit-justify-content: space-around;

+  justify-content: space-around;

+}

+

+html /deep/ [layout][justified] {

+  -ms-flex-pack: justify;

+  -webkit-justify-content: space-between;

+  justify-content: space-between;

+}

+

+/* self alignment */

+

+html /deep/ [self-start] {

+  -ms-align-self: flex-start;

+  -webkit-align-self: flex-start;

+  align-self: flex-start;

+}

+

+html /deep/ [self-center] {

+  -ms-align-self: center;

+  -webkit-align-self: center;

+  align-self: center;

+}

+

+html /deep/ [self-end] {

+  -ms-align-self: flex-end;

+  -webkit-align-self: flex-end;

+  align-self: flex-end;

+}

+

+html /deep/ [self-stretch] {

+  -ms-align-self: stretch;

+  -webkit-align-self: stretch;

+  align-self: stretch;

+}

+

+/*******************************

+          Other Layout

+*******************************/

+

+html /deep/ [block] {

+  display: block;

+}

+

+/* ie support for hidden */

+html /deep/ [hidden] {

+  display: none !important;

+}

+

+html /deep/ [relative] {

+  position: relative;

+}

+

+html /deep/ [fit] {

+  position: absolute;

+  top: 0;

+  right: 0;

+  bottom: 0;

+  left: 0;

+}

+

+body[fullbleed] {

+  margin: 0;

+  height: 100vh;

+}

+

+/*******************************

+            Other

+*******************************/

+

+html /deep/ [segment], html /deep/ segment {

+  display: block;

+  position: relative;

+  -webkit-box-sizing: border-box;

+  -ms-box-sizing: border-box;

+  box-sizing: border-box;

+  margin: 1em 0.5em;

+  padding: 1em;

+  background-color: white;

+  -webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);

+  box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);

+  border-radius: 5px 5px 5px 5px;

+}

+

 </style>
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
index 65d22b9..0d97f53 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
@@ -591,6 +591,9 @@
 
   var eventFactory = scope.eventFactory;
 
+  // set of recognizers to run for the currently handled event
+  var currentGestures;
+
   /**
    * This module is for normalizing events. Mouse and Touch events will be
    * collected here, and fire PointerEvents that have the same semantics, no
@@ -605,6 +608,7 @@
    */
   var dispatcher = {
     pointermap: new scope.PointerMap(),
+    requiredGestures: new scope.PointerMap(),
     eventMap: Object.create(null),
     // Scope objects for native events.
     // This exists for ease of testing.
@@ -665,6 +669,7 @@
     },
     // EVENTS
     down: function(inEvent) {
+      this.requiredGestures.set(inEvent.pointerId, currentGestures);
       this.fireEvent('down', inEvent);
     },
     move: function(inEvent) {
@@ -674,10 +679,12 @@
     },
     up: function(inEvent) {
       this.fireEvent('up', inEvent);
+      this.requiredGestures.delete(inEvent.pointerId);
     },
     cancel: function(inEvent) {
       inEvent.tapPrevented = true;
       this.fireEvent('up', inEvent);
+      this.requiredGestures.delete(inEvent.pointerId);
     },
     // LISTENER LOGIC
     eventHandler: function(inEvent) {
@@ -685,12 +692,34 @@
       // platform events. This can happen when two elements in different scopes
       // are set up to create pointer events, which is relevant to Shadow DOM.
 
-      // TODO(dfreedm): make this check more granular, allow for minimal event generation
-      // e.g inEvent._handledByPG['tap'] and inEvent._handledByPG['track'], etc
+      var type = inEvent.type;
+
+      // only generate the list of desired events on "down"
+      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {
+        if (!inEvent._handledByPG) {
+          currentGestures = {};
+        }
+        // map gesture names to ordered set of recognizers
+        var gesturesWanted = inEvent.currentTarget._pgEvents;
+        if (gesturesWanted) {
+          var gk = Object.keys(gesturesWanted);
+          for (var i = 0, r, ri, g; i < gk.length; i++) {
+            // gesture
+            g = gk[i];
+            if (gesturesWanted[g] > 0) {
+              // lookup gesture recognizer
+              r = this.dependencyMap[g];
+              // recognizer index
+              ri = r ? r.index : -1;
+              currentGestures[ri] = true;
+            }
+          }
+        }
+      }
+
       if (inEvent._handledByPG) {
         return;
       }
-      var type = inEvent.type;
       var fn = this.eventMap && this.eventMap[type];
       if (fn) {
         fn(inEvent);
@@ -782,13 +811,17 @@
     },
     gestureTrigger: function() {
       // process the gesture queue
-      for (var i = 0, e; i < this.gestureQueue.length; i++) {
+      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {
         e = this.gestureQueue[i];
+        rg = e._requiredGestures;
         for (var j = 0, g, fn; j < this.gestures.length; j++) {
-          g = this.gestures[j];
-          fn = g[e.type];
-          if (g.enabled && fn) {
-            fn.call(g, e);
+          // only run recognizer if an element in the source event's path is listening for those gestures
+          if (rg[j]) {
+            g = this.gestures[j];
+            fn = g[e.type];
+            if (fn) {
+              fn.call(g, e);
+            }
           }
         }
       }
@@ -799,6 +832,7 @@
       if (!this.gestureQueue.length) {
         requestAnimationFrame(this.boundGestureTrigger);
       }
+      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);
       this.gestureQueue.push(ev);
     }
   };
@@ -820,12 +854,6 @@
     var dep = dispatcher.dependencyMap[g];
     if (dep) {
       var recognizer = dispatcher.gestures[dep.index];
-      if (dep.listeners === 0) {
-        if (recognizer) {
-          recognizer.enabled = true;
-        }
-      }
-      dep.listeners++;
       if (!node._pgListeners) {
         dispatcher.register(node);
         node._pgListeners = 0;
@@ -849,6 +877,10 @@
           actionNode.setAttribute('touch-action', touchAction);
         }
       }
+      if (!node._pgEvents) {
+        node._pgEvents = {};
+      }
+      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;
       node._pgListeners++;
     }
     return Boolean(dep);
@@ -883,21 +915,19 @@
     var g = gesture.toLowerCase();
     var dep = dispatcher.dependencyMap[g];
     if (dep) {
-      if (dep.listeners > 0) {
-        dep.listeners--;
-      }
-      if (dep.listeners === 0) {
-        var recognizer = dispatcher.gestures[dep.index];
-        if (recognizer) {
-          recognizer.enabled = false;
-        }
-      }
       if (node._pgListeners > 0) {
         node._pgListeners--;
       }
       if (node._pgListeners === 0) {
         dispatcher.unregister(node);
       }
+      if (node._pgEvents) {
+        if (node._pgEvents[g] > 0) {
+          node._pgEvents[g]--;
+        } else {
+          node._pgEvents[g] = 0;
+        }
+      }
     }
     return Boolean(dep);
   };
@@ -1365,9 +1395,6 @@
       'MSPointerCancel',
     ],
     register: function(target) {
-      if (target !== document) {
-        return;
-      }
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
@@ -1399,9 +1426,12 @@
       dispatcher.down(e);
     },
     MSPointerMove: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.target = pointermap.get(e.pointerId);
-      dispatcher.move(e);
+      var target = pointermap.get(inEvent.pointerId);
+      if (target) {
+        var e = this.prepareEvent(inEvent);
+        e.target = target;
+        dispatcher.move(e);
+      }
     },
     MSPointerUp: function(inEvent) {
       var e = this.prepareEvent(inEvent);
@@ -1447,9 +1477,6 @@
       return e;
     },
     register: function(target) {
-      if (target !== document) {
-        return;
-      }
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
@@ -1465,9 +1492,12 @@
       dispatcher.down(e);
     },
     pointermove: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.target = pointermap.get(e.pointerId);
-      dispatcher.move(e);
+      var target = pointermap.get(inEvent.pointerId);
+      if (target) {
+        var e = this.prepareEvent(inEvent);
+        e.target = target;
+        dispatcher.move(e);
+      }
     },
     pointerup: function(inEvent) {
       var e = this.prepareEvent(inEvent);
@@ -3668,7 +3698,7 @@
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 Polymer = {
-  version: '0.3.5-5d00e4b'
+  version: '0.4.0-d66a86e'
 };
 
 /*
@@ -3697,6 +3727,4113 @@
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 
+ /*
+	On supported platforms, platform.js is not needed. To retain compatibility
+	with the polyfills, we stub out minimal functionality.
+ */
+if (!window.Platform) {
+  logFlags = window.logFlags || {};
+
+
+  Platform = {
+  	flush: function() {}
+  };
+
+  CustomElements = {
+  	useNative: true,
+    ready: true,
+    takeRecords: function() {},
+    instanceof: function(obj, base) {
+      return obj instanceof base;
+    }
+  };
+  
+  HTMLImports = {
+  	useNative: true
+  };
+
+  
+  addEventListener('HTMLImportsLoaded', function() {
+    document.dispatchEvent(
+      new CustomEvent('WebComponentsReady', {bubbles: true})
+    );
+  });
+
+
+  // ShadowDOM
+  ShadowDOMPolyfill = null;
+  wrap = unwrap = function(n){
+    return n;
+  };
+
+}
+
+/*

+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.

+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt

+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt

+ * Code distributed by Google as part of the polymer project is also

+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt

+ */

+

+(function(scope) {

+

+var hasNative = ('import' in document.createElement('link'));

+var useNative = hasNative;

+

+isIE = /Trident/.test(navigator.userAgent);

+

+// TODO(sorvell): SD polyfill intrusion

+var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);

+var wrap = function(node) {

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

+};

+var mainDoc = wrap(document);

+    

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

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

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

+// and the polyfill are in use.

+var currentScriptDescriptor = {

+  get: function() {

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

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

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

+        // interactive when scripts run so we cheat.

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

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

+    return wrap(script);

+  },

+  configurable: true

+};

+

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

+Object.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);

+

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

+//  document ready) time have loaded.

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

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

+function 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 = isIE ? 'complete' : 'interactive';

+var READY_EVENT = 'readystatechange';

+function isDocumentReady(doc) {

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

+      doc.readyState === requiredReadyState);

+}

+

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

+function whenDocumentReady(callback, doc) {

+  if (!isDocumentReady(doc)) {

+    var checkReady = function() {

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

+          doc.readyState === requiredReadyState) {

+        doc.removeEventListener(READY_EVENT, checkReady);

+        whenDocumentReady(callback, doc);

+      }

+    };

+    doc.addEventListener(READY_EVENT, checkReady);

+  } else if (callback) {

+    callback();

+  }

+}

+

+function markTargetLoaded(event) {

+  event.target.__loaded = true;

+}

+

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

+function watchImportsLoad(callback, doc) {

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

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

+  function checkDone(d) { 

+    if (loaded == l) {

+      callback && callback();

+    }

+  }

+  function loadedImport(e) {

+    markTargetLoaded(e);

+    loaded++;

+    checkDone();

+  }

+  if (l) {

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

+      if (isImportLoaded(imp)) {

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

+      } else {

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

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

+      }

+    }

+  } else {

+    checkDone();

+  }

+}

+

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

+// all imports (see below).

+function isImportLoaded(link) {

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

+}

+

+// TODO(sorvell): Workaround for 

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

+// this bug is addressed.

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

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

+// imports for loading.

+//

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

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

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

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

+if (useNative) {

+  new MutationObserver(function(mxns) {

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

+      if (m.addedNodes) {

+        handleImports(m.addedNodes);

+      }

+    }

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

+

+  function handleImports(nodes) {

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

+      if (isImport(n)) {

+        handleImport(n);  

+      }

+    }

+  }

+

+  function isImport(element) {

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

+  }

+

+  function handleImport(element) {

+    var loaded = element.import;

+    if (loaded) {

+      markTargetLoaded({target: element});

+    } else {

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

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

+    }

+  }

+

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

+  // when this script is run.

+  (function() {

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

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

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

+        handleImport(imp);

+      }

+    }

+  })();

+

+}

+

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

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

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

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

+whenImportsReady(function() {

+  HTMLImports.ready = true;

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

+  mainDoc.dispatchEvent(

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

+  );

+});

+

+// exports

+scope.useNative = useNative;

+scope.isImportLoaded = isImportLoaded;

+scope.whenReady = whenImportsReady;

+scope.isIE = isIE;

+

+// deprecated

+scope.whenImportsReady = whenImportsReady;

+

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

@@ -4477,8 +8704,8 @@
         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]);
+          observer.open(function(splices) {
+            this.invokeMethod(callbackName, [splices]);
           }, this);
           this.registerNamedObserver(name + '__array', observer);
         }
@@ -4644,6 +8871,8 @@
   // element api supporting mdv
   var mdv = {
     instanceTemplate: function(template) {
+      // ensure template is decorated (lets' things like <tr template ...> work)
+      HTMLTemplateElement.decorate(template);
       // ensure a default bindingDelegate
       var syntax = this.syntax || (!template.bindingDelegate &&
           this.element.syntax);
@@ -5116,9 +9345,9 @@
 
   // specify an 'own' prototype for tag `name`
   function element(name, prototype) {
-    if (arguments.length === 1 && typeof arguments[0] !== 'string') {
+    if (typeof name !== 'string') {
+      var script = prototype || document._currentScript;
       prototype = name;
-      var script = document._currentScript;
       name = script && script.parentNode && script.parentNode.getAttribute ?
           script.parentNode.getAttribute('name') : '';
       if (!name) {
@@ -5191,11 +9420,14 @@
   // 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);
-    }
+  if (Platform.consumeDeclarations) {
+    Platform.consumeDeclarations(function(declarations) {;
+      if (declarations) {
+        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {
+          element.apply(null, d);
+        }
+      }
+    });
   }
 
 })(Polymer);
@@ -5213,7 +9445,7 @@
 
 var path = {
   resolveElementPaths: function(node) {
-    Platform.urlResolver.resolveDom(node);
+    Polymer.urlResolver.resolveDom(node);
   },
   addResolvePathApi: function() {
     // let assetpath attribute modify the resolve path
@@ -5268,7 +9500,7 @@
         var styles = this.findLoadableStyles(content);
         if (styles.length) {
           var templateUrl = template.ownerDocument.baseURI;
-          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);
+          return Polymer.styleResolver.loadStyles(styles, templateUrl, callback);
         }
       }
       if (callback) {
@@ -5901,7 +10133,7 @@
     },
     templateContent: function() {
       var template = this.fetchTemplate();
-      return template && Platform.templateContent(template);
+      return template && template.content;
     },
     installBindingDelegate: function(template) {
       if (template) {
@@ -6301,17 +10533,19 @@
     },
 
     ready: function() {
-      this.flush();
       // 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) {
+      var polyfillWasReady = CustomElements.ready;
+      CustomElements.ready = false;
+      this.flush();
+      if (!CustomElements.useNative) {
         CustomElements.upgradeDocumentTree(document);
-        CustomElements.ready = true;
       }
+      CustomElements.ready = polyfillWasReady;
       Platform.flush();
       requestAnimationFrame(this.flushReadyCallbacks);
     },
@@ -6350,15 +10584,8 @@
     return importQueue.length ? importQueue[0] : mainQueue[0];
   }
 
-  var polymerReadied = false; 
-
-  document.addEventListener('WebComponentsReady', function() {
-    CustomElements.ready = false;
-  });
-  
-  function whenPolymerReady(callback) {
+  function whenReady(callback) {
     queue.waitToReady = true;
-    CustomElements.ready = false;
     HTMLImports.whenImportsReady(function() {
       queue.addReadyCallback(callback);
       queue.waitToReady = false;
@@ -6369,50 +10596,7 @@
   // exports
   scope.elements = elements;
   scope.queue = queue;
-  scope.whenReady = scope.whenPolymerReady = whenPolymerReady;
-})(Polymer);
-
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-
-  var whenPolymerReady = scope.whenPolymerReady;
-
-  function importElements(elementOrFragment, callback) {
-    if (elementOrFragment) {
-      document.head.appendChild(elementOrFragment);
-      whenPolymerReady(callback);
-    } else if (callback) {
-      callback();
-    }
-  }
-
-  function importUrls(urls, callback) {
-    if (urls && urls.length) {
-        var frag = document.createDocumentFragment();
-        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {
-          link = document.createElement('link');
-          link.rel = 'import';
-          link.href = url;
-          frag.appendChild(link);
-        }
-        importElements(frag, callback);
-    } else if (callback) {
-      callback();
-    }
-  }
-
-  // exports
-  scope.import = importUrls;
-  scope.importElements = importElements;
-
+  scope.whenReady = scope.whenPolymerReady = whenReady;
 })(Polymer);
 
 /*
@@ -6431,7 +10615,7 @@
   var extend = scope.extend;
   var api = scope.api;
   var queue = scope.queue;
-  var whenPolymerReady = scope.whenPolymerReady;
+  var whenReady = scope.whenReady;
   var getRegisteredPrototype = scope.getRegisteredPrototype;
   var waitingForPrototype = scope.waitingForPrototype;
 
@@ -6541,7 +10725,7 @@
 
   // boot tasks
 
-  whenPolymerReady(function() {
+  whenReady(function() {
     document.body.removeAttribute('unresolved');
     document.dispatchEvent(
       new CustomEvent('polymer-ready', {bubbles: true})
@@ -6563,6 +10747,49 @@
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 
+(function(scope) {
+
+  var whenPolymerReady = scope.whenPolymerReady;
+
+  function importElements(elementOrFragment, callback) {
+    if (elementOrFragment) {
+      document.head.appendChild(elementOrFragment);
+      whenPolymerReady(callback);
+    } else if (callback) {
+      callback();
+    }
+  }
+
+  function importUrls(urls, callback) {
+    if (urls && urls.length) {
+        var frag = document.createDocumentFragment();
+        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {
+          link = document.createElement('link');
+          link.rel = 'import';
+          link.href = url;
+          frag.appendChild(link);
+        }
+        importElements(frag, callback);
+    } else if (callback) {
+      callback();
+    }
+  }
+
+  // exports
+  scope.import = importUrls;
+  scope.importElements = importElements;
+
+})(Polymer);
+
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
 /**
  * The `auto-binding` element extends the template element. It provides a quick 
  * and easy way to do data binding without the need to setup a model. 
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 23532d4..8cda857 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
@@ -20,6 +20,18 @@
     "../polymer-expressions/src/polymer-expressions.js",
     "build/polymer-versioned.js",
     "src/boot.js",
+    "src/system/compat.js",
+    "../HTMLImports/src/base.js",
+    "src/system/module.js",
+    "src/system/unresolved.js",
+    "../observe-js/src/observe.js",
+    "../NodeBind/src/NodeBind.js",
+    "../TemplateBinding/src/TemplateBinding.js",
+    "src/system/microtask.js",
+    "src/system/patches-mdv.js",
+    "src/lib/url.js",
+    "src/lib/loader.js",
+    "src/lib/styleloader.js",
     "src/lib/lang.js",
     "src/lib/job.js",
     "src/lib/dom.js",
@@ -42,55 +54,67 @@
     "src/declaration/mdv.js",
     "src/declaration/prototype.js",
     "src/declaration/queue.js",
-    "src/declaration/import.js",
     "src/declaration/polymer-element.js",
+    "src/lib/import.js",
     "src/lib/auto-binding.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACraA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACncA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uB;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9rDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrwCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
   "sourcesContent": [
     "/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
     "/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'html /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  /**\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    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.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\n      // TODO(dfreedm): make this check more granular, allow for minimal event generation\n      // e.g inEvent._handledByPG['tap'] and inEvent._handledByPG['track'], etc\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      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; 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 (g.enabled && 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\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (dep.listeners === 0) {\n        if (recognizer) {\n          recognizer.enabled = true;\n        }\n      }\n      dep.listeners++;\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (dep.listeners > 0) {\n        dep.listeners--;\n      }\n      if (dep.listeners === 0) {\n        var recognizer = dispatcher.gestures[dep.index];\n        if (recognizer) {\n          recognizer.enabled = false;\n        }\n      }\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  // set of recognizers to run for the currently handled event\n  var currentGestures;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    requiredGestures: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.requiredGestures.set(inEvent.pointerId, currentGestures);\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      var type = inEvent.type;\n\n      // only generate the list of desired events on \"down\"\n      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {\n        if (!inEvent._handledByPG) {\n          currentGestures = {};\n        }\n        // map gesture names to ordered set of recognizers\n        var gesturesWanted = inEvent.currentTarget._pgEvents;\n        if (gesturesWanted) {\n          var gk = Object.keys(gesturesWanted);\n          for (var i = 0, r, ri, g; i < gk.length; i++) {\n            // gesture\n            g = gk[i];\n            if (gesturesWanted[g] > 0) {\n              // lookup gesture recognizer\n              r = this.dependencyMap[g];\n              // recognizer index\n              ri = r ? r.index : -1;\n              currentGestures[ri] = true;\n            }\n          }\n        }\n      }\n\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        rg = e._requiredGestures;\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          // only run recognizer if an element in the source event's path is listening for those gestures\n          if (rg[j]) {\n            g = this.gestures[j];\n            fn = g[e.type];\n            if (fn) {\n              fn.call(g, e);\n            }\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      if (!node._pgEvents) {\n        node._pgEvents = {};\n      }\n      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n      if (node._pgEvents) {\n        if (node._pgEvents[g] > 0) {\n          node._pgEvents[g]--;\n        } else {\n          node._pgEvents[g] = 0;\n        }\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.findTarget(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var target = pointermap.get(this.POINTER_ID);\n        if (target) {\n          var e = this.prepareEvent(inEvent);\n          e.target = target;\n          // handle case where we missed a mouseup\n          if (e.buttons === 0) {\n            dispatcher.cancel(e);\n            this.cleanupMouse();\n          } else {\n            dispatcher.move(e);\n          }\n        }\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.findTarget(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (initial) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: this.currentTouchEvent.target\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var touchAction = scope.targetFinding.findTouchAction(inEvent);\n        var scrollAxis = this.touchActionToScrollType(touchAction);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36\n        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ\n        if (inEvent.cancelable) {\n          this.processTouches(inEvent, this.move);\n        }\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      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.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.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      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.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.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n      /*\n       * NOTE: an empty touch listener on body will reactivate nodes imported from templates with touch listeners\n       * Removing it will re-break the nodes\n       *\n       * Work around for https://bugs.webkit.org/show_bug.cgi?id=135628\n       */\n      var isSafari = nav.userAgent.match('Safari') && !nav.userAgent.match('Chrome');\n      if (isSafari) {\n        document.body.addEventListener('touchstart', function(){});\n      }\n    }\n  }\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     exposes: [\n      'trackstart',\n      'track',\n      'trackx',\n      'tracky',\n      'trackend'\n     ],\n     defaultActions: {\n       'track': 'none',\n       'trackx': 'pan-y',\n       'tracky': 'pan-x'\n     },\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       } else if (inType === 'trackx') {\n         return;\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       } else if (inType === 'tracky') {\n         return;\n       }\n       var gestureProto = {\n         bubbles: true,\n         cancelable: true,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       };\n       if (inType !== 'tracky') {\n         gestureProto.x = inEvent.x;\n         gestureProto.dx = d.x;\n         gestureProto.ddx = dd.x;\n         gestureProto.clientX = inEvent.clientX;\n         gestureProto.pageX = inEvent.pageX;\n         gestureProto.screenX = inEvent.screenX;\n         gestureProto.xDirection = t.xDirection;\n       }\n       if (inType !== 'trackx') {\n         gestureProto.dy = d.y;\n         gestureProto.ddy = dd.y;\n         gestureProto.y = inEvent.y;\n         gestureProto.clientY = inEvent.clientY;\n         gestureProto.pageY = inEvent.pageY;\n         gestureProto.screenY = inEvent.screenY;\n         gestureProto.yDirection = t.yDirection;\n       }\n       var e = eventFactory.makeGestureEvent(inType, gestureProto);\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             p.lastMoveEvent = p.downEvent;\n             this.fireTrack('trackstart', inEvent, p);\n           }\n         }\n         if (p.tracking) {\n           this.fireTrack('track', inEvent, p);\n           this.fireTrack('trackx', inEvent, p);\n           this.fireTrack('tracky', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    exposes: [\n      'hold',\n      'holdpulse',\n      'release'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    exposes: [\n      'tap'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n",
     "/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n",
     "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      switch (op) {\n        case '||':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) ||\n                right(model, observer, filterRegistry);\n          };\n        case '&&':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) &&\n                right(model, observer, filterRegistry);\n          };\n      }\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      this.dynamicDeps = true;\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.5-5d00e4b'\n};\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.4.0-d66a86e'\n};\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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 /*\n\tOn supported platforms, platform.js is not needed. To retain compatibility\n\twith the polyfills, we stub out minimal functionality.\n */\nif (!window.Platform) {\n  logFlags = window.logFlags || {};\n\n\n  Platform = {\n  \tflush: function() {}\n  };\n\n  CustomElements = {\n  \tuseNative: true,\n    ready: true,\n    takeRecords: function() {},\n    instanceof: function(obj, base) {\n      return obj instanceof base;\n    }\n  };\n  \n  HTMLImports = {\n  \tuseNative: true\n  };\n\n  \n  addEventListener('HTMLImportsLoaded', function() {\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n\n\n  // ShadowDOM\n  ShadowDOMPolyfill = null;\n  wrap = unwrap = function(n){\n    return n;\n  };\n\n}\n",
+    "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded : link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n",
+    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n",
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      var ifValue = true;\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        ifValue = deps.ifValue;\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !ifValue) {\n          this.valueChanged();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          ifValue = ifValue.open(this.updateIfValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      var value = deps.value;\n      if (!deps.oneTime)\n        value = value.open(this.updateIteratedValue, this);\n\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(value);\n    },\n\n    /**\n     * Gets the updated value of the bind/repeat. This can potentially call\n     * user code (if a bindingDelegate is set up) so we try to avoid it if we\n     * already have the value in hand (from Observer.open).\n     */\n    getUpdatedValue: function() {\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      return value;\n    },\n\n    updateIfValue: function(ifValue) {\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(this.getUpdatedValue());\n    },\n\n    updateIteratedValue: function(value) {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      this.updateValue(value);\n    },\n\n    updateValue: function(value) {\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = Platform.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n\n\n  // mixin\n\n  // copy all properties from inProps (et al) to inObj\n  function mixin(inObj/*, inProps, inMoreProps, ...*/) {\n    var obj = inObj || {};\n    for (var i = 1; i < arguments.length; i++) {\n      var p = arguments[i];\n      try {\n        for (var n in p) {\n          copyProperty(n, p, obj);\n        }\n      } catch(x) {\n      }\n    }\n    return obj;\n  }\n\n  // copy property inName from inSource object to inTarget object\n  function copyProperty(inName, inSource, inTarget) {\n    var pd = getPropertyDescriptor(inSource, inName);\n    Object.defineProperty(inTarget, inName, pd);\n  }\n\n  // get property descriptor for inName on inObject, even if\n  // inName exists on some link in inObject's prototype chain\n  function getPropertyDescriptor(inObject, inName) {\n    if (inObject) {\n      var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n      return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n    }\n  }\n\n  // exports\n\n  scope.extend = extend;\n  scope.mixin = mixin;\n\n  // for bc\n  Platform.mixin = mixin;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // 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",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  \n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n\n  // exports\n\n  scope.createDOM = createDOM;\n\n})(Polymer);\n",
     "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function noopHandler(value) {\n    return value;\n  }\n\n  var typeHandlers = {\n    string: noopHandler,\n    'undefined': noopHandler,\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true\n      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail === null || detail === undefined ? {} : detail;\n      var event = new CustomEvent(type, {\n        bubbles: bubbles !== undefined ? bubbles : true,\n        cancelable: cancelable !== undefined ? cancelable : true,\n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = PolymerGestures.addEventListener;\n  scope.removeEventListener = PolymerGestures.removeEventListener;\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  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(splices) {\n            this.invokeMethod(callbackName, [splices]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure template is decorated (lets' things like <tr template ...> work)\n      HTMLTemplateElement.decorate(template);\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      if (!this.ownerDocument.isStagingDocument) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (hasShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (hasShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (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  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return 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 (hasShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (typeof name !== 'string') {\n      var script = prototype || document._currentScript;\n      prototype = name;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  if (Platform.consumeDeclarations) {\n    Platform.consumeDeclarations(function(declarations) {;\n      if (declarations) {\n        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n          element.apply(null, d);\n        }\n      }\n    });\n  }\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Polymer.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Polymer.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (hasShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        PolymerGestures.addEventListener(node, eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            PolymerGestures.removeEventListener(node, eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute into the 'publish' object\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // create a `publish` object if needed.\n        // the `publish` object is only relevant to this prototype, the \n        // publishing logic in `declaration/properties.js` is responsible for\n        // managing property values on the prototype chain.\n        // TODO(sjmiles): the `publish` object is later chained to it's \n        //                ancestor object, presumably this is only for \n        //                reflection or other non-library uses. \n        var publish = prototype.publish || (prototype.publish = {}); \n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // looks weird, but causes n to exist on `publish` if it does not;\n          // a more careful test would need expensive `in` operator\n          if (n && publish[n] === undefined) {\n            publish[n] = undefined;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && 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  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && template.content;\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (hasShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      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\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  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.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = 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  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      var polyfillWasReady = CustomElements.ready;\n      CustomElements.ready = false;\n      this.flush();\n      if (!CustomElements.useNative) {\n        CustomElements.upgradeDocumentTree(document);\n      }\n      CustomElements.ready = polyfillWasReady;\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  function whenReady(callback) {\n    queue.waitToReady = true;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenReady;\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenReady = scope.whenReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(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      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  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/polymer/polymer.js b/pkg/polymer/lib/src/js/polymer/polymer.js
index ce50ae2..c0a13e1 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -7,8 +7,9 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.3.5-5d00e4b
-window.PolymerGestures={},function(a){var b=!1,c=document.createElement("meta");if(c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findTouchAction:function(a){var c;if(b&&a.path){for(var d=a.path,e=0;e<d.length;e++)if(c=d[e],c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action")}else for(c=a.target;c;){if(c.hasAttribute("touch-action"))return c.getAttribute("touch-action");c=c.parentNode||c.host}return"auto"},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"html /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f="string"==typeof document.head.style.touchAction,g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b=["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={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],dependencyMap:{down:{listeners:0,index:-1},up:{listeners:0,index:-1}},gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){var c=Object.create(null);c.listeners=0,c.index=this.gestures.length;for(var d,e=0;e<b.exposes.length;e++)d=b.exposes[e].toLowerCase(),this.dependencyMap[d]=c;this.gestures.push(b)},register:function(a,b){for(var c,d=this.eventSourceList.length,e=0;d>e&&(c=this.eventSourceList[e]);e++)c.register.call(c,a,b)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.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){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){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),g=0;g<b.length;g++)e=b[g],f[e]=a[e]||c[g],("target"===e||"relatedTarget"===e)&&d&&f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement);return f.preventDefault=function(){a.preventDefault()},f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b=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],c.enabled&&d&&d.call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};f.boundHandler=f.eventHandler.bind(f),f.boundGestureTrigger=f.gestureTrigger.bind(f),a.dispatcher=f,a.activateGesture=function(a,b){var c=b.toLowerCase(),d=f.dependencyMap[c];if(d){var e=f.gestures[d.index];if(0===d.listeners&&e&&(e.enabled=!0),d.listeners++,a._pgListeners||(f.register(a),a._pgListeners=0),e){var g,h=e.defaultActions&&e.defaultActions[c];switch(a.nodeType){case Node.ELEMENT_NODE:g=a;break;case Node.DOCUMENT_FRAGMENT_NODE:g=a.host;break;default:g=null}h&&g&&!g.hasAttribute("touch-action")&&g.setAttribute("touch-action",h)}a._pgListeners++}return Boolean(d)},a.addEventListener=function(b,c,d,e){d&&(a.activateGesture(b,c),b.addEventListener(c,d,e))},a.deactivateGesture=function(a,b){var c=b.toLowerCase(),d=f.dependencyMap[c];if(d){if(d.listeners>0&&d.listeners--,0===d.listeners){var e=f.gestures[d.index];e&&(e.enabled=!1)}a._pgListeners>0&&a._pgListeners--,0===a._pgListeners&&f.unregister(a)}return Boolean(d)},a.removeEventListener=function(b,c,d,e){d&&(a.deactivateGesture(b,c),b.removeEventListener(c,d,e))}}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],exposes:["down","up","move"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.findTarget(d),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d){var e=this.prepareEvent(a);e.target=d,0===e.buttons?(b.cancel(e),this.cleanupMouse()):b.move(e)}}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=(a.targetFinding.allShadows.bind(a.targetFinding),b.pointermap),d=(Array.prototype.map.call.bind(Array.prototype.map),2500),e=200,f=20,g=!1,h={events:["touchstart","touchmove","touchend","touchcancel"],exposes:["down","up","move"],register:function(a,c){c||b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y"},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return b===c.EMITTER?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":"XY"},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===c.pointers()||1===c.pointers()&&c.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,e)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,d){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var e={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:this.currentTouchEvent.target};return a.findTarget(e)}return a.findTarget(b)}return c.get(d)},touchToPointer:function(a){var c=this.currentTouchEvent,d=b.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(c.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE,d._source="touch";var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,c.preventDefault()},d},processTouches:function(a,b){var d=a.changedTouches;this.currentTouchEvent=a;for(var e,f,g=0;g<d.length;g++)e=d[g],f=this.touchToPointer(e),"touchstart"===a.type&&c.set(f.pointerId,f.target),c.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findTouchAction(b),e=this.touchActionToScrollType(d);if("none"===e)c=!1;else if("XY"===e)c=!0;else{var f=b.changedTouches[0],g=e,h="Y"===e?"X":"Y",i=Math.abs(f["client"+g]-this.firstXY[g]),j=Math.abs(f["client"+h]-this.firstXY[h]);c=i>=j}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(c.pointers()>=b.length){var d=[];c.forEach(function(a,c){if(1!==c&&!this.findTouch(b,c-2)){var e=a;d.push(e)}},this),d.forEach(function(a){this.cancel(a),c.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){b.down(a)},touchmove:function(a){if(g)a.cancelable&&this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=f&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){b.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(c){c.relatedTarget=a.findTarget(c),b.up(c)},cancel:function(a){b.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){c["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,e=b.changedTouches[0];if(this.isPrimaryTouch(e)){var f={x:e.clientX,y:e.clientY};c.push(f);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,f);setTimeout(g,d)}}};a.touchEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){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.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.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){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.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.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher,c=window.navigator;if(window.PointerEvent)b.registerSource("pointer",a.pointerEvents);else if(c.msPointerEnabled)b.registerSource("ms",a.msEvents);else if(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart){b.registerSource("touch",a.touchEvents);var d=c.userAgent.match("Safari")&&!c.userAgent.match("Chrome");d&&document.body.addEventListener("touchstart",function(){})}b.register(document,!0)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],exposes:["trackstart","track","trackx","tracky","trackend"],defaultActions:{track:"none",trackx:"pan-y",tracky:"pan-x"},WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);if(g.x)e.xDirection=this.clampDir(g.x);else if("trackx"===a)return;if(g.y)e.yDirection=this.clampDir(g.y);else if("tracky"===a)return;var h={bubbles:!0,cancelable:!0,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"};"tracky"!==a&&(h.x=b.x,h.dx=f.x,h.ddx=g.x,h.clientX=b.clientX,h.pageX=b.pageX,h.screenX=b.screenX,h.xDirection=e.xDirection),"trackx"!==a&&(h.dy=f.y,h.ddy=g.y,h.y=b.y,h.clientY=b.clientY,h.pageY=b.pageY,h.screenY=b.screenY,h.yDirection=e.yDirection);var i=c.makeGestureEvent(a,h);e.downTarget.dispatchEvent(i)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(!b.tracking){var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,b.lastMoveEvent=b.downEvent,this.fireTrack("trackstart",a,b))}b.tracking&&(this.fireTrack("track",a,b),this.fireTrack("trackx",a,b),this.fireTrack("tracky",a,b)),b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],exposes:["hold","holdpulse","release"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],exposes:["tap"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;
-if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);switch(b=i(b),c=i(c),a){case"||":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)||c(a,d,e)};case"&&":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)&&c(a,d,e)}}return function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),this.dynamicDeps=!0,function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.3.5-5d00e4b"},"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){return a}function c(a,b){var c=typeof b;return b instanceof Date&&(c="date"),d[c](a,b)}var d={string:b,undefined:b,date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=c}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=null===b||void 0===b?{}:b,g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];PolymerGestures.addEventListener(this,c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d,a.addEventListener=PolymerGestures.addEventListener,a.removeEventListener=PolymerGestures.removeEventListener}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,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||this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},window.ShadowDOMPolyfill),e="element",f="controller",g={STYLE_SCOPE_ATTRIBUTE:e,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(f),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,e){if(b=b||this.findStyleScope(),e=e||"",b){d&&(a=c(a,b.host));var g=this.element.cssTextToScopeStyle(a,f);Polymer.applyStyleToScope(g,b),this.styleCacheForScope(b)[this.localName+e]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);return c[b]},styleCacheForScope:function(a){if(d){var b=a.host?a.host.localName:a.localName;return h[b]||(h[b]={})}return a._scopeStyles=a._scopeStyles||{}}},h={};a.api.instance.styles=g}(Polymer),function(a){function b(a,b){if(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),i&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",j=document.head.querySelectorAll(g);j.length&&(f=j[j.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return q?q.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i=window.ShadowDOMPolyfill,j="style",k="@import",l="link[rel=stylesheet]",m="global",n="polymer-scope",o={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(l),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(j),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(k)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(l),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(j+"["+n+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(n)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(m);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+n+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},p=HTMLElement.prototype,q=p.matches||p.matchesSelector||p.webkitMatchesSelector||p.mozMatchesSelector;a.api.declaration.styles=o,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return PolymerGestures.addEventListener(d,c,h),f?void 0:{open:g,discardChanges:g,close:function(){PolymerGestures.removeEventListener(d,c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c];d&&void 0!==d.reflect&&(b.reflect[c]=Boolean(d.reflect),d=d.value),void 0!==d&&(b[c]=d)}},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a){var d=this.getAttribute(b);if(d)for(var e,f=a.publish||(a.publish={}),g=d.split(c),h=0,i=g.length;i>h;h++)e=g[h].trim(),e&&void 0===f[e]&&(f[e]=void 0)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&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=window.ShadowDOMPolyfill,g={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),f&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),h[a]=b}return b},findBasePrototype:function(a){return h[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},h={};g.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=g}(Polymer),function(a){function b(a){return document.contains(a)?i:h}function c(){return h.length?h[0]:i[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a){a.__queue||(a.__queue={},f.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?h.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=f.length;c>b&&(a=f[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){g.push(a)},flush:function(){if(!this.flushing){this.flushing=!0;for(var a;g.length;)a=g.shift(),a.__queue.go.call(a),a.__queue=null;this.flushing=!1}},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&j.push(a)},flushReadyCallbacks:function(){if(j)for(var a;j.length;)(a=j.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[],j=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.elements=f,a.queue=e,a.whenReady=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"),f.wait(this),this.loadResources(),this.registerWhenReady()
-},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
+// @version: 0.4.0-d66a86e
+window.PolymerGestures={},function(a){var b=!1,c=document.createElement("meta");if(c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findTouchAction:function(a){var c;if(b&&a.path){for(var d=a.path,e=0;e<d.length;e++)if(c=d[e],c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action")}else for(c=a.target;c;){if(c.hasAttribute("touch-action"))return c.getAttribute("touch-action");c=c.parentNode||c.host}return"auto"},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"html /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f="string"==typeof document.head.style.touchAction,g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b,c=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented","_source"],d=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],e="undefined"!=typeof SVGElementInstance,f=a.eventFactory,g={pointermap:new a.PointerMap,requiredGestures:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],dependencyMap:{down:{listeners:0,index:-1},up:{listeners:0,index:-1}},gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){var c=Object.create(null);c.listeners=0,c.index=this.gestures.length;for(var d,e=0;e<b.exposes.length;e++)d=b.exposes[e].toLowerCase(),this.dependencyMap[d]=c;this.gestures.push(b)},register:function(a,b){for(var c,d=this.eventSourceList.length,e=0;d>e&&(c=this.eventSourceList[e]);e++)c.register.call(c,a,b)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.requiredGestures.set(a.pointerId,b),this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a),this.requiredGestures.delete(a.pointerId)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a),this.requiredGestures.delete(a.pointerId)},eventHandler:function(a){var c=a.type;if("touchstart"===c||"mousedown"===c||"pointerdown"===c||"MSPointerDown"===c){a._handledByPG||(b={});var d=a.currentTarget._pgEvents;if(d)for(var e,f,g,h=Object.keys(d),i=0;i<h.length;i++)g=h[i],d[g]>0&&(e=this.dependencyMap[g],f=e?e.index:-1,b[f]=!0)}if(!a._handledByPG){var j=this.eventMap&&this.eventMap[c];j&&j(a),a._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=f.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,f=Object.create(null),g=0;g<c.length;g++)b=c[g],f[b]=a[b]||d[g],("target"===b||"relatedTarget"===b)&&e&&f[b]instanceof SVGElementInstance&&(f[b]=f[b].correspondingUseElement);return f.preventDefault=function(){a.preventDefault()},f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b,c=0;c<this.gestureQueue.length;c++){a=this.gestureQueue[c],b=a._requiredGestures;for(var d,e,f=0;f<this.gestures.length;f++)b[f]&&(d=this.gestures[f],e=d[a.type],e&&e.call(d,a))}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),a._requiredGestures=this.requiredGestures.get(a.pointerId),this.gestureQueue.push(a)}};g.boundHandler=g.eventHandler.bind(g),g.boundGestureTrigger=g.gestureTrigger.bind(g),a.dispatcher=g,a.activateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];if(d){var e=g.gestures[d.index];if(a._pgListeners||(g.register(a),a._pgListeners=0),e){var f,h=e.defaultActions&&e.defaultActions[c];switch(a.nodeType){case Node.ELEMENT_NODE:f=a;break;case Node.DOCUMENT_FRAGMENT_NODE:f=a.host;break;default:f=null}h&&f&&!f.hasAttribute("touch-action")&&f.setAttribute("touch-action",h)}a._pgEvents||(a._pgEvents={}),a._pgEvents[c]=(a._pgEvents[c]||0)+1,a._pgListeners++}return Boolean(d)},a.addEventListener=function(b,c,d,e){d&&(a.activateGesture(b,c),b.addEventListener(c,d,e))},a.deactivateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];return d&&(a._pgListeners>0&&a._pgListeners--,0===a._pgListeners&&g.unregister(a),a._pgEvents&&(a._pgEvents[c]>0?a._pgEvents[c]--:a._pgEvents[c]=0)),Boolean(d)},a.removeEventListener=function(b,c,d,e){d&&(a.deactivateGesture(b,c),b.removeEventListener(c,d,e))}}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],exposes:["down","up","move"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.findTarget(d),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d){var e=this.prepareEvent(a);e.target=d,0===e.buttons?(b.cancel(e),this.cleanupMouse()):b.move(e)}}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=(a.targetFinding.allShadows.bind(a.targetFinding),b.pointermap),d=(Array.prototype.map.call.bind(Array.prototype.map),2500),e=200,f=20,g=!1,h={events:["touchstart","touchmove","touchend","touchcancel"],exposes:["down","up","move"],register:function(a,c){c||b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y"},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return b===c.EMITTER?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":"XY"},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===c.pointers()||1===c.pointers()&&c.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,e)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,d){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var e={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:this.currentTouchEvent.target};return a.findTarget(e)}return a.findTarget(b)}return c.get(d)},touchToPointer:function(a){var c=this.currentTouchEvent,d=b.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(c.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE,d._source="touch";var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,c.preventDefault()},d},processTouches:function(a,b){var d=a.changedTouches;this.currentTouchEvent=a;for(var e,f,g=0;g<d.length;g++)e=d[g],f=this.touchToPointer(e),"touchstart"===a.type&&c.set(f.pointerId,f.target),c.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findTouchAction(b),e=this.touchActionToScrollType(d);if("none"===e)c=!1;else if("XY"===e)c=!0;else{var f=b.changedTouches[0],g=e,h="Y"===e?"X":"Y",i=Math.abs(f["client"+g]-this.firstXY[g]),j=Math.abs(f["client"+h]-this.firstXY[h]);c=i>=j}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(c.pointers()>=b.length){var d=[];c.forEach(function(a,c){if(1!==c&&!this.findTouch(b,c-2)){var e=a;d.push(e)}},this),d.forEach(function(a){this.cancel(a),c.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){b.down(a)},touchmove:function(a){if(g)a.cancelable&&this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=f&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){b.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(c){c.relatedTarget=a.findTarget(c),b.up(c)},cancel:function(a){b.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){c["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,e=b.changedTouches[0];if(this.isPrimaryTouch(e)){var f={x:e.clientX,y:e.clientY};c.push(f);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,f);setTimeout(g,d)}}};a.touchEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher,c=window.navigator;if(window.PointerEvent)b.registerSource("pointer",a.pointerEvents);else if(c.msPointerEnabled)b.registerSource("ms",a.msEvents);else if(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart){b.registerSource("touch",a.touchEvents);var d=c.userAgent.match("Safari")&&!c.userAgent.match("Chrome");d&&document.body.addEventListener("touchstart",function(){})}b.register(document,!0)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],exposes:["trackstart","track","trackx","tracky","trackend"],defaultActions:{track:"none",trackx:"pan-y",tracky:"pan-x"},WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);if(g.x)e.xDirection=this.clampDir(g.x);else if("trackx"===a)return;if(g.y)e.yDirection=this.clampDir(g.y);else if("tracky"===a)return;var h={bubbles:!0,cancelable:!0,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"};"tracky"!==a&&(h.x=b.x,h.dx=f.x,h.ddx=g.x,h.clientX=b.clientX,h.pageX=b.pageX,h.screenX=b.screenX,h.xDirection=e.xDirection),"trackx"!==a&&(h.dy=f.y,h.ddy=g.y,h.y=b.y,h.clientY=b.clientY,h.pageY=b.pageY,h.screenY=b.screenY,h.yDirection=e.yDirection);var i=c.makeGestureEvent(a,h);e.downTarget.dispatchEvent(i)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(!b.tracking){var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,b.lastMoveEvent=b.downEvent,this.fireTrack("trackstart",a,b))}b.tracking&&(this.fireTrack("track",a,b),this.fireTrack("trackx",a,b),this.fireTrack("tracky",a,b)),b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],exposes:["hold","holdpulse","release"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],exposes:["tap"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);
+return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);switch(b=i(b),c=i(c),a){case"||":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)||c(a,d,e)};case"&&":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)&&c(a,d,e)}}return function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),this.dynamicDeps=!0,function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.4.0-d66a86e"},"function"==typeof window.Polymer&&(Polymer={}),window.Platform||(logFlags=window.logFlags||{},Platform={flush:function(){}},CustomElements={useNative:!0,ready:!0,takeRecords:function(){},"instanceof":function(a,b){return a instanceof b}},HTMLImports={useNative:!0},addEventListener("HTMLImportsLoaded",function(){document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))}),ShadowDOMPolyfill=null,wrap=unwrap=function(a){return a}),function(a){function b(a,b){b=b||o,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a){a.target.__loaded=!0}function f(a,b){function c(){h==i&&a&&a()}function d(a){e(a),h++,c()}var f=b.querySelectorAll("link[rel=import]"),h=0,i=f.length;if(i)for(var j,k=0;i>k&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return l?a.__loaded:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a.import;b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=g,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var testingExposeCycleCount=global.testingExposeCycleCount,hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);
+var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue()))},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_,e=!0;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),e=c.ifValue,c.ifOneTime&&!e)return void this.valueChanged();c.ifOneTime||(e=e.open(this.updateIfValue,this))}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b));var f=c.value;return c.oneTime||(f=f.open(this.updateIteratedValue,this)),e?void this.updateValue(f):void this.valueChanged()},getUpdatedValue:function(){var a=this.deps.value;return this.deps.oneTime||(a=a.discardChanges()),a},updateIfValue:function(a){return a?void this.updateValue(this.getUpdatedValue()):void this.valueChanged()},updateIteratedValue:function(a){if(this.deps.hasIf){var b=this.deps.ifValue;if(this.deps.ifOneTime||(b=b.discardChanges()),!b)return void this.valueChanged()}this.updateValue(a)},updateValue:function(a){this.deps.repeat||(a=[a]);var b=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(a);this.valueChanged(a,b)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Polymer),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=Platform.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(Polymer),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(Polymer),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}function c(a){for(var b=a||{},c=1;c<arguments.length;c++){var e=arguments[c];try{for(var f in e)d(f,e,b)}catch(g){}}return b}function d(a,b,c){var d=e(b,a);Object.defineProperty(c,a,d)}function e(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||e(Object.getPrototypeOf(a),b)}}a.extend=b,a.mixin=c,Platform.mixin=c}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(a){function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c={};HTMLElement.register=function(a,b){c[a]=b},HTMLElement.getPrototypeForTag=function(a){var b=a?c[a]:HTMLElement.prototype;return b||Object.getPrototypeOf(document.createElement(a))};var d=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,d.apply(this,arguments)};var e=DOMTokenList.prototype.add,f=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)e.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)f.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var g=function(){return Array.prototype.slice.call(this)},h=window.NamedNodeMap||window.MozNamedAttrMap||{};NodeList.prototype.array=g,h.prototype.array=g,HTMLCollection.prototype.array=g,a.createDOM=b}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a){return a}function c(a,b){var c=typeof b;return b instanceof Date&&(c="date"),d[c](a,b)}var d={string:b,undefined:b,date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=c}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=null===b||void 0===b?{}:b,g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];PolymerGestures.addEventListener(this,c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d,a.addEventListener=PolymerGestures.addEventListener,a.removeEventListener=PolymerGestures.removeEventListener}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a){this.invokeMethod(e,[a])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){var e=a+"_",f=a+"Observable_";this[f]=c;var g=this[e],h=this,i=c.open(function(b,c){h[e]=b,h.emitPropertyChangeRecord(a,b,c)});if(d&&!b(g,i)){var j=d(g,i);b(i,j)||(i=j,c.setValue&&c.setValue(i))}this[e]=i,this.emitPropertyChangeRecord(a,i,g);var k={close:function(){c.close(),h[f]=void 0}};return this.registerObserver(k),k},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){return d?void(this[a]=b):this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){HTMLTemplateElement.decorate(a);for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),this.ownerDocument.isStagingDocument||this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()
+},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},window.ShadowDOMPolyfill),e="element",f="controller",g={STYLE_SCOPE_ATTRIBUTE:e,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(f),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,e){if(b=b||this.findStyleScope(),e=e||"",b){d&&(a=c(a,b.host));var g=this.element.cssTextToScopeStyle(a,f);Polymer.applyStyleToScope(g,b),this.styleCacheForScope(b)[this.localName+e]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);return c[b]},styleCacheForScope:function(a){if(d){var b=a.host?a.host.localName:a.localName;return h[b]||(h[b]={})}return a._scopeStyles=a._scopeStyles||{}}},h={};a.api.instance.styles=g}(Polymer),function(a){function b(a,b){if("string"!=typeof a){var c=b||document._currentScript;if(b=a,a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a),Platform.consumeDeclarations&&Platform.consumeDeclarations(function(a){if(a)for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.apply(null,c)})}(Polymer),function(a){var b={resolveElementPaths:function(a){Polymer.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),i&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",j=document.head.querySelectorAll(g);j.length&&(f=j[j.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return q?q.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i=window.ShadowDOMPolyfill,j="style",k="@import",l="link[rel=stylesheet]",m="global",n="polymer-scope",o={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Polymer.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(l),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(j),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(k)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(l),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(j+"["+n+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(n)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(m);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+n+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},p=HTMLElement.prototype,q=p.matches||p.matchesSelector||p.webkitMatchesSelector||p.mozMatchesSelector;a.api.declaration.styles=o,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return PolymerGestures.addEventListener(d,c,h),f?void 0:{open:g,discardChanges:g,close:function(){PolymerGestures.removeEventListener(d,c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c];d&&void 0!==d.reflect&&(b.reflect[c]=Boolean(d.reflect),d=d.value),void 0!==d&&(b[c]=d)}},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a){var d=this.getAttribute(b);if(d)for(var e,f=a.publish||(a.publish={}),g=d.split(c),h=0,i=g.length;i>h;h++)e=g[h].trim(),e&&void 0===f[e]&&(f[e]=void 0)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&a.content},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f=window.ShadowDOMPolyfill,g={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),f&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),h[a]=b}return b},findBasePrototype:function(a){return h[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},h={};g.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=g}(Polymer),function(a){function b(a){return document.contains(a)?i:h}function c(){return h.length?h[0]:i[0]}function d(a){e.waitToReady=!0,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a){a.__queue||(a.__queue={},f.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?h.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=f.length;c>b&&(a=f[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){g.push(a)},flush:function(){if(!this.flushing){this.flushing=!0;for(var a;g.length;)a=g.shift(),a.__queue.go.call(a),a.__queue=null;this.flushing=!1}},ready:function(){var a=CustomElements.ready;CustomElements.ready=!1,this.flush(),CustomElements.useNative||CustomElements.upgradeDocumentTree(document),CustomElements.ready=a,Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&j.push(a)},flushReadyCallbacks:function(){if(j)for(var a;j.length;)(a=j.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[],j=[];a.elements=f,a.queue=e,a.whenReady=a.whenPolymerReady=d}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),f.wait(this),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
 //# 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 59f018e..0fc102e 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/mouse.js","../polymer-gestures/src/touch.js","../polymer-gestures/src/ms.js","../polymer-gestures/src/pointer.js","../polymer-gestures/src/platform-events.js","../polymer-gestures/src/track.js","../polymer-gestures/src/hold.js","../polymer-gestures/src/tap.js","../polymer-expressions/third_party/esprima/esprima.js","../polymer-expressions/src/polymer-expressions.js","build/polymer-versioned.js","src/boot.js","src/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":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'html /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  /**\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    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.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\n      // TODO(dfreedm): make this check more granular, allow for minimal event generation\n      // e.g inEvent._handledByPG['tap'] and inEvent._handledByPG['track'], etc\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      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; 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 (g.enabled && 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\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (dep.listeners === 0) {\n        if (recognizer) {\n          recognizer.enabled = true;\n        }\n      }\n      dep.listeners++;\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (dep.listeners > 0) {\n        dep.listeners--;\n      }\n      if (dep.listeners === 0) {\n        var recognizer = dispatcher.gestures[dep.index];\n        if (recognizer) {\n          recognizer.enabled = false;\n        }\n      }\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.findTarget(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var target = pointermap.get(this.POINTER_ID);\n        if (target) {\n          var e = this.prepareEvent(inEvent);\n          e.target = target;\n          // handle case where we missed a mouseup\n          if (e.buttons === 0) {\n            dispatcher.cancel(e);\n            this.cleanupMouse();\n          } else {\n            dispatcher.move(e);\n          }\n        }\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.findTarget(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (initial) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: this.currentTouchEvent.target\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var touchAction = scope.targetFinding.findTouchAction(inEvent);\n        var scrollAxis = this.touchActionToScrollType(touchAction);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36\n        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ\n        if (inEvent.cancelable) {\n          this.processTouches(inEvent, this.move);\n        }\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      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.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.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      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.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.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n      /*\n       * NOTE: an empty touch listener on body will reactivate nodes imported from templates with touch listeners\n       * Removing it will re-break the nodes\n       *\n       * Work around for https://bugs.webkit.org/show_bug.cgi?id=135628\n       */\n      var isSafari = nav.userAgent.match('Safari') && !nav.userAgent.match('Chrome');\n      if (isSafari) {\n        document.body.addEventListener('touchstart', function(){});\n      }\n    }\n  }\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     exposes: [\n      'trackstart',\n      'track',\n      'trackx',\n      'tracky',\n      'trackend'\n     ],\n     defaultActions: {\n       'track': 'none',\n       'trackx': 'pan-y',\n       'tracky': 'pan-x'\n     },\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       } else if (inType === 'trackx') {\n         return;\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       } else if (inType === 'tracky') {\n         return;\n       }\n       var gestureProto = {\n         bubbles: true,\n         cancelable: true,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       };\n       if (inType !== 'tracky') {\n         gestureProto.x = inEvent.x;\n         gestureProto.dx = d.x;\n         gestureProto.ddx = dd.x;\n         gestureProto.clientX = inEvent.clientX;\n         gestureProto.pageX = inEvent.pageX;\n         gestureProto.screenX = inEvent.screenX;\n         gestureProto.xDirection = t.xDirection;\n       }\n       if (inType !== 'trackx') {\n         gestureProto.dy = d.y;\n         gestureProto.ddy = dd.y;\n         gestureProto.y = inEvent.y;\n         gestureProto.clientY = inEvent.clientY;\n         gestureProto.pageY = inEvent.pageY;\n         gestureProto.screenY = inEvent.screenY;\n         gestureProto.yDirection = t.yDirection;\n       }\n       var e = eventFactory.makeGestureEvent(inType, gestureProto);\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             p.lastMoveEvent = p.downEvent;\n             this.fireTrack('trackstart', inEvent, p);\n           }\n         }\n         if (p.tracking) {\n           this.fireTrack('track', inEvent, p);\n           this.fireTrack('trackx', inEvent, p);\n           this.fireTrack('tracky', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    exposes: [\n      'hold',\n      'holdpulse',\n      'release'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    exposes: [\n      'tap'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      switch (op) {\n        case '||':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) ||\n                right(model, observer, filterRegistry);\n          };\n        case '&&':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) &&\n                right(model, observer, filterRegistry);\n          };\n      }\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      this.dynamicDeps = true;\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.5-5d00e4b'\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  function noopHandler(value) {\n    return value;\n  }\n\n  var typeHandlers = {\n    string: noopHandler,\n    'undefined': noopHandler,\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true\n      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail === null || detail === undefined ? {} : detail;\n      var event = new CustomEvent(type, {\n        bubbles: bubbles !== undefined ? bubbles : true,\n        cancelable: cancelable !== undefined ? cancelable : true,\n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = PolymerGestures.addEventListener;\n  scope.removeEventListener = PolymerGestures.removeEventListener;\n\n})(Polymer);\n","/*\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      if (!this.ownerDocument.isStagingDocument) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (hasShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (hasShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (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  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return 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 (hasShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        PolymerGestures.addEventListener(node, eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            PolymerGestures.removeEventListener(node, eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute into the 'publish' object\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // create a `publish` object if needed.\n        // the `publish` object is only relevant to this prototype, the \n        // publishing logic in `declaration/properties.js` is responsible for\n        // managing property values on the prototype chain.\n        // TODO(sjmiles): the `publish` object is later chained to it's \n        //                ancestor object, presumably this is only for \n        //                reflection or other non-library uses. \n        var publish = prototype.publish || (prototype.publish = {}); \n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // looks weird, but causes n to exist on `publish` if it does not;\n          // a more careful test would need expensive `in` operator\n          if (n && publish[n] === undefined) {\n            publish[n] = undefined;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && 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  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (hasShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      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\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  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.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = 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      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  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.concat.js"],"names":["window","PolymerGestures","scope","HAS_FULL_PATH","pathTest","document","createElement","createShadowRoot","sr","s","appendChild","addEventListener","ev","path","stopPropagation","CustomEvent","bubbles","head","dispatchEvent","parentNode","removeChild","target","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","Boolean","elementFromPoint","targetingShadow","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","t","owner","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","clientX","clientY","findTouchAction","n","i","length","ELEMENT_NODE","hasAttribute","getAttribute","host","LCA","a","b","contains","adepth","depth","bdepth","d","walk","u","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","style","touchAction","hasShadowRoot","ShadowDOMPolyfill","forEach","r","String","map","el","textContent","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","cancelable","makeGestureEvent","Object","create","k","keys","makePointerEvent","p","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","_source","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","currentGestures","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","dispatcher","pointermap","requiredGestures","eventMap","eventSources","eventSourceList","gestures","dependencyMap","down","listeners","index","up","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","obj","g","exposes","toLowerCase","register","initial","es","l","unregister","fireEvent","move","type","fillGestureQueue","cancel","tapPrevented","eventHandler","_handledByPG","gesturesWanted","currentTarget","_pgEvents","ri","gk","fn","listen","addEvent","unlisten","removeEvent","eventName","boundHandler","removeEventListener","makeEvent","preventDefault","_target","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","rg","_requiredGestures","j","requestAnimationFrame","boundGestureTrigger","activateGesture","gesture","dep","recognizer","_pgListeners","actionNode","defaultActions","setAttribute","handler","capture","deactivateGesture","DEDUP_DIST","WHICH_TO_BUTTONS","HAS_BUTTONS","MouseEvent","mouseEvents","POINTER_ID","POINTER_TYPE","lastTouches","isEventSimulatedFromTouch","lts","dx","Math","abs","dy","prepareEvent","which","mousedown","mouseup","mousemove","cleanupMouse","relatedTarget","DEDUP_TIMEOUT","Array","CLICK_COUNT_TIMEOUT","HYSTERESIS","HAS_TOUCH_ACTION","touchEvents","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","touchActionToScrollType","st","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touch","id","currentTouchEvent","fastPath","touchToPointer","cte","detail","webkitRadiusX","radiusX","webkitRadiusY","radiusY","webkitForce","force","self","processTouches","inFunction","tl","changedTouches","_cancel","cleanUpPointer","shouldScroll","scrollAxis","oa","da","doa","findTouch","inTL","vacuumTouches","touches","value","key","touchstart","dedupSynthMouse","touchmove","dd","sqrt","touchcancel","touchend","lt","HAS_BITMAP_TYPE","MSPointerEvent","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel","pointerEvents","pointerdown","pointermove","pointerup","pointercancel","nav","navigator","PointerEvent","msPointerEnabled","undefined","ontouchstart","isSafari","userAgent","match","body","track","trackx","tracky","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","lastMoveEvent","xDirection","yDirection","gestureProto","trackInfo","ddx","screenX","ddy","screenY","downTarget","tracking","hold","HOLD_DELAY","heldPointer","holdJob","pulse","Date","now","timeStamp","held","fireHold","clearInterval","setInterval","inHoldTime","holdTime","tap","shouldTap","downState","start","altKey","ctrlKey","metaKey","shiftKey","global","assert","condition","message","Error","isDecimalDigit","ch","isWhiteSpace","fromCharCode","isLineTerminator","isIdentifierStart","isIdentifierPart","isKeyword","skipWhitespace","charCodeAt","getIdentifier","slice","scanIdentifier","Token","Identifier","Keyword","NullLiteral","BooleanLiteral","range","scanPunctuator","code2","ch2","code","ch1","Punctuator","throwError","Messages","UnexpectedToken","scanNumericLiteral","number","NumericLiteral","parseFloat","scanStringLiteral","quote","str","octal","StringLiteral","isIdentifierName","token","advance","EOF","lex","lookahead","peek","pos","messageFormat","error","args","arguments","msg","replace","whole","description","throwUnexpected","expect","matchKeyword","keyword","parseArrayInitialiser","elements","parseExpression","delegate","createArrayExpression","parseObjectPropertyKey","createLiteral","createIdentifier","parseObjectProperty","createProperty","parseObjectInitialiser","properties","createObjectExpression","parseGroupExpression","expr","parsePrimaryExpression","createThisExpression","parseArguments","parseNonComputedProperty","parseNonComputedMember","parseComputedMember","parseLeftHandSideExpression","property","createMemberExpression","createCallExpression","parseUnaryExpression","parsePostfixExpression","createUnaryExpression","binaryPrecedence","prec","parseBinaryExpression","stack","operator","pop","createBinaryExpression","parseConditionalExpression","consequent","alternate","createConditionalExpression","parseFilter","createFilter","parseFilters","parseTopLevel","Syntax","parseInExpression","parseAsExpression","createTopLevel","createAsExpression","indexName","createInExpression","parse","inDelegate","state","labelSet","TokenName","ArrayExpression","BinaryExpression","CallExpression","ConditionalExpression","EmptyStatement","ExpressionStatement","Literal","LabeledStatement","LogicalExpression","MemberExpression","ObjectExpression","Program","Property","ThisExpression","UnaryExpression","UnknownLabel","Redeclaration","esprima","prepareBinding","expressionText","filterRegistry","expression","getExpression","scopeIdent","tagName","ex","console","model","oneTime","binding","getBinding","polymerExpressionScopeIdent_","indexIdent","polymerExpressionIndexIdent_","expressionParseCache","ASTDelegate","Expression","valueFn_","IdentPath","Path","object","accessor","computed","dynamicDeps","simplePath","getFn","Filter","notImplemented","arg","valueFn","filters","deps","currentPath","ConstantObservable","value_","convertStylePropertyName","c","findScope","prop","parentScopeName","hasOwnProperty","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","observer","addPath","getValueFrom","setValue","newValue","setValueFrom",{"end":{"file":"polymer.concat.js","comments_before":[],"nlb":false,"endpos":92826,"pos":92818,"col":8,"line":3185,"value":"fullPath","type":"name"},"start":{"file":"polymer.concat.js","comments_before":[],"nlb":false,"endpos":92826,"pos":92818,"col":8,"line":3185,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","parts","context","propName","transform","toModelDirection","initialArgs","toModel","toDOM","apply","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","filter","arr","kind","open","discardChanges","deliver","close","firstTime","firstValue","startReset","getValue","finishReset","setValueFn","CompoundObserver","ObserverTransform","count","random","toString","styleObject","join","tokenList","tokens","prepareInstancePositionChanged","template","templateInstance","valid","PathObserver","prepareInstanceModel","scopeName","parentScope","createScopeObject","__proto__","defineProperty","configurable","writable","Polymer","version","Platform","logFlags","flush","CustomElements","useNative","ready","takeRecords","instanceof","base","HTMLImports","wrap","unwrap","whenImportsReady","doc","mainDoc","whenDocumentReady","watchImportsLoad","isDocumentReady","readyState","requiredReadyState","checkReady","READY_EVENT","markTargetLoaded","event","__loaded","checkDone","loaded","loadedImport","imports","querySelectorAll","imp","isImportLoaded","link","__importParsed","handleImports","nodes","isImport","handleImport","localName","rel","import","hasNative","isIE","hasShadowDOMPolyfill","wrapIfNeeded","currentScriptDescriptor","script","currentScript","scripts","MutationObserver","mxns","addedNodes","observe","childList","readyTime","getTime","whenReady","withDependencies","task","depends","marshal","module","dependsOrFactory","moduleFactory","modules","using","modularize","insertBefore","firstChild","detectObjectObserve","recs","records","deliverChangeRecords","unobserve","detectEval","chrome","app","runtime","getDeviceStorage","f","Function","isIndex","toNumber","isObject","areSameValue","numberIsNaN","getPathCharType","char","noop","parsePath","maybeUnescapeQuote","nextChar","mode","newChar","actions","append","transition","action","typeMap","pathStateMachine","isIdent","identRegExp","privateToken","constructorIsPrivate","hasEval","compiledGetValueFromFn","getPath","pathCache","invalidPath","formatAccessor","dirtyCheck","cycles","MAX_DIRTY_CHECK_CYCLES","check_","testingExposeCycleCount","dirtyCheckCycleCount","objectIsEmpty","diffIsEmpty","diff","added","removed","changed","diffObjectFromOldObject","oldObject","isArray","runEOMTasks","eomTasks","newObservedObject","state_","OPENED","discardRecords","first","obs","arrayObserve","discard","observedObjectCache","getObservedObject","dir","newObservedSet","rootObj","rootObjProps","objects","getPrototypeOf","allRootObjNonObservedProps","rec","observers","iterateObjects_","observerCount","record","Observer","unobservedCount","observedSetCache","getObservedSet","lastObservedSet","UNOPENED","callback_","target_","directObserver_","id_","nextObserverId","addToAll","_allObserversCount","collectObservers","allObservers","removeFromAll","ObjectObserver","oldObject_","ArrayObserver","array","object_","path_","reportChangesOnOpen","reportChangesOnOpen_","observed_","identFn","observable","getValueFn","dontPassThroughSet","observable_","getValueFn_","setValueFn_","dontPassThroughSet_","diffObjectFromChangeRecords","changeRecords","oldValues","expectedRecordTypes","oldValue","newSplice","addedCount","ArraySplice","calcSplices","current","currentStart","currentEnd","old","oldStart","oldEnd","arraySplice","intersect","start1","end1","start2","end2","mergeSplice","splices","inserted","insertionOffset","intersectCount","deleteCount","prepend","offset","createInitialSplices","JSON","stringify","projectArraySplices","concat","hasObserve","createObject","proto","newObject","getOwnPropertyNames","getOwnPropertyDescriptor","identStart","identPart","RegExp","beforePath","ws","[","eof","inPath",".","beforeIdent","inIdent","0","beforeElement","'","\"","afterZero","]","inIndex","inSingleQuote","else","inDoubleQuote","afterElement","iterateObjects","runEOM","eomObj","pingPong","eomRunScheduled","CLOSED","RESETTING","connect_","disconnect_","report_","changes","_errorThrownDuringCallback","runningMicrotaskCheckpoint","hasDebugForceFullDelivery","eval","performMicrotaskCheckpoint","anyChanged","toCheck","clearObservers","copyObject","copy","applySplices","previous","spliceArgs","addIndex","skipChanges","observerSentinel","needsDirectObserver","addObserver","observedCallback_","add","update","EDIT_LEAVE","EDIT_UPDATE","EDIT_ADD","EDIT_DELETE","calcEditDistances","rowCount","columnCount","distances","equals","north","west","spliceOperationsFromEditDistances","edits","min","northWest","reverse","prefixCount","suffixCount","minLength","sharedPrefix","sharedSuffix","ops","oldIndex","searchLength","index1","index2","calculateSplices","currentValue","previousValue","runEOM_","observerSentinel_","hasObjectObserve","getTreeScope","getElementById","updateBindings","bindings","bindings_","returnBinding","sanitizeValue","updateText","data","textBinding","updateAttribute","conditional","removeAttribute","attributeBinding","getEventForInputType","checkboxEventType","updateInput","input","santizeFn","inputBinding","bindInputEvent","postEventFn","eventType","booleanSanitize","getAssociatedRadioButtons","form","treeScope","radios","checkedPostEvent","radio","checkedBinding","checked","updateOption","option","select","selectBinding","HTMLSelectElement","optionBinding","bindFinished","maybeUpdateBindings","enable","Text","Element","div","checkbox","initMouseEvent","HTMLInputElement","HTMLElement","sanitizeFn","HTMLTextAreaElement","HTMLOptionElement","getFragmentRoot","searchRefId","ref","protoContent_","templateCreator_","isSVGTemplate","namespaceURI","isHTMLTemplate","isAttributeTemplate","semanticTemplateElements","isTemplate","isTemplate_","forAllTemplatesFrom","subTemplates","allTemplatesSelectors","bootstrapTemplatesRecursivelyFrom","bootstrap","HTMLTemplateElement","decorate","content","mixin","to","from","getOrCreateTemplateContentsOwner","ownerDocument","defaultView","templateContentsOwner_","implementation","createHTMLDocument","lastChild","getTemplateStagingDocument","stagingDocument_","isStagingDocument","href","baseURI","extractTemplateFromAttributeTemplate","attribs","attributes","attrib","templateAttributeDirectives","extractTemplateFromSVGTemplate","liftNonNativeTemplateChildrenIntoContent","useRoot","child","fixTemplateElementPrototype","hasProto","ensureSetModelScheduled","setModelFn_","setModelFnScheduled_","getBindings","delegate_","processBindings","model_","parseMustaches","prepareBindingFn","startIndex","lastIndex","endIndex","onlyOneTime","oneTimeStart","terminator","trim","delegateFn","hasOnePath","isSimplePath","combinator","processOneTimeBinding","processSinglePathBinding","processBinding","instanceBindings","iter","processBindingDirectives_","parseWithDefault","parseAttributeBindings","attr","substring","IF","BIND","REPEAT","if","repeat","TEXT_NODE","cloneAndBindInstance","parent","stagingDocument","importNode","nextSibling","children","setDelegate_","createInstanceBindingMap","getContentUid","contentUidCounter","getInstanceBindingMap","contentId","bindingMaps","bindingMap_","TemplateIterator","templateElement","closed","templateElement_","instances","iteratedValue","presentValue","arrayObserver","opt_this","Document","documentElement","THEAD","TBODY","TFOOT","TH","TR","TD","COLGROUP","COL","CAPTION","OPTION","OPTGROUP","hasTemplateElement","html","TypeError","templateObserver","refChanged_","opt_instanceRef","templateIsDecorated_","isNativeHTMLTemplate","bootstrapContents","liftContents","liftRoot","content_","createDocumentFragment","instanceRef_","htmlElement","HTMLUnknownElement","contentDescriptor","enumerable","directives","iterator_","closeDeps","updateDependencies","attributeFilter","createInstance","bindingDelegate","newDelegate_","refContent_","ref_","emptyInstance","instance","terminator_","instanceRecord","templateInstance_","firstNode","lastNode","collectTerminator","raw","valueChanged","updateIteratedValue","getUpdatedValue","instancePositionChangedFn_","instanceModelFn_","nextRef","ifOneTime","ifValue","hasIf","updateIfValue","updateValue","observeValue","handleSplices","getLastInstanceNode","subtemplateIterator","getLastTemplateNode","insertInstanceAt","fragment","previousInstanceLast","extractInstanceAt","getDelegateFn","instanceCache","removeDelta","closeInstanceBindings","reportInstancesMoved","reportInstanceMoved","forAllTemplatesFrom_","endOfMicrotask","twiddle","iterations","callbacks","atEndOfMicrotask","shift","createTextNode","JsMutationObserver","characterData","flushing","group","groupEnd","FLUSH_POLL_INTERVAL","flushPoll","originalImportNode","deep","imported","upgradeAll","replaceUrlsInCssText","cssText","baseUrl","keepAbsolute","regexp","pre","url","post","urlPath","resolveRelativeUrl","URL","makeDocumentRelPath","root","port","protocol","makeRelPath","sourceUrl","targetUrl","pathname","split","unshift","search","hash","urlResolver","resolveDom","resolveAttributes","resolveStyles","templates","resolveTemplate","resolveStyle","resolveCssText","CSS_URL_REGEXP","CSS_IMPORT_REGEXP","hasAttributes","resolveElementAttributes","URL_ATTRS_SELECTOR","URL_ATTRS","replacement","URL_TEMPLATE_SEARCH","Loader","regex","cache","requests","extractUrls","text","matched","matches","exec","process","done","fetch","inflight","req","xhr","wait","handleXhr","request","response","responseText","resolve","XMLHttpRequest","send","onerror","onload","pending","StyleResolver","loader","flatten","resolveNode","intermediate","loadStyles","loadedStyle","styleResolver","extend","api","pd","nom","inObj","copyProperty","inName","inSource","inTarget","getPropertyDescriptor","inObject","job","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","createDOM","inTagOrNode","inHTML","inAttrs","dom","cloneNode","innerHTML","registry","tag","getPrototypeForTag","originalStopPropagation","Event","cancelBubble","DOMTokenList","remove","toggle","bool","switch","oldName","newName","ArraySlice","namedNodeMap","NamedNodeMap","MozNamedAttrMap","NodeList","HTMLCollection","$super","arrayOfArgs","caller","_super","nameInThis","warn","memoizeSuper","n$","method","nextSuper","super","noopHandler","deserializeValue","inferredType","typeHandlers","string","date","boolean","parseInt","function","declaration","publish","apis","utils","async","timeout","cancelAsync","fire","onNode","asyncFire","classFollows","anew","className","classList","injectBoundHTML","instanceTemplate","nop","nob","asyncMethod","log","EVENT_PREFIX","addHostListeners","eventDelegates","methodName","getEventHandler","dispatchMethod","copyInstanceAttributes","a$","_instanceAttributes","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","resolveBindingValue","updateRecord","createPropertyObserver","_observeNames","o","_propertyObserver","registerObserver","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","paths","called","ov","nv","invokeMethod","deliverChanges","propertyChanged_","reflect","callbackName","closeNamedObserver","registerNamedObserver","emitPropertyChangeRecord","notifier","notifier_","getNotifier","notify","bindToAccessor","resolveFn","privateName","privateObservable","resolvedValue","createComputedProperties","_computedNames","syntax","bindProperty","_observers","closeObservers","o$","_namedObservers","closeNamedObservers","mdv","enableBindingsReflection","_recordBinding","mixinSuper","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","created","createdCallback","prepareElement","_elementPrepared","shadowRoots","_readied","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","parseDeclaration","elementElement","fetchTemplate","shadowFromTemplate","shadowRootReady","lightFromTemplate","refNode","eventController","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","mutations","disconnect","subtree","constructor","Base","shimCssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","styleCacheForScope","polyfillScopeStyleCache","_scopeStyles","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","consumeDeclarations","declarations","resolveElementPaths","addResolvePathApi","assetPath","resolvePath","importRuleForSheet","sheet","createStyleElement","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","templateContent","convertSheetsToStyles","findLoadableStyles","templateUrl","copySheetAttributes","replaceChild","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","matcher","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","mixedCaseEventTypes","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","prefixLength","findController","controller","prepareEventBinding","bindingValue","inferObservers","explodeObservers","exploded","ni","names","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","propertyInfos","createPropertyAccessor","createPropertyAccessors","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","queue","waitToReady","addReadyCallback","check","__queue","enqueue","shouldAdd","readied","flushable","addToFlushQueue","nextElement","canReady","isEmpty","flushQueue","polyfillWasReady","upgradeDocumentTree","flushReadyCallbacks","readyCallbacks","whenPolymerReady","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","importElements","elementOrFragment","importUrls","urls","frag","makeSyntax"],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n\n/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'html /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  // set of recognizers to run for the currently handled event\n  var currentGestures;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    requiredGestures: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.requiredGestures.set(inEvent.pointerId, currentGestures);\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      var type = inEvent.type;\n\n      // only generate the list of desired events on \"down\"\n      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {\n        if (!inEvent._handledByPG) {\n          currentGestures = {};\n        }\n        // map gesture names to ordered set of recognizers\n        var gesturesWanted = inEvent.currentTarget._pgEvents;\n        if (gesturesWanted) {\n          var gk = Object.keys(gesturesWanted);\n          for (var i = 0, r, ri, g; i < gk.length; i++) {\n            // gesture\n            g = gk[i];\n            if (gesturesWanted[g] > 0) {\n              // lookup gesture recognizer\n              r = this.dependencyMap[g];\n              // recognizer index\n              ri = r ? r.index : -1;\n              currentGestures[ri] = true;\n            }\n          }\n        }\n      }\n\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        rg = e._requiredGestures;\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          // only run recognizer if an element in the source event's path is listening for those gestures\n          if (rg[j]) {\n            g = this.gestures[j];\n            fn = g[e.type];\n            if (fn) {\n              fn.call(g, e);\n            }\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      if (!node._pgEvents) {\n        node._pgEvents = {};\n      }\n      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n      if (node._pgEvents) {\n        if (node._pgEvents[g] > 0) {\n          node._pgEvents[g]--;\n        } else {\n          node._pgEvents[g] = 0;\n        }\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.findTarget(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var target = pointermap.get(this.POINTER_ID);\n        if (target) {\n          var e = this.prepareEvent(inEvent);\n          e.target = target;\n          // handle case where we missed a mouseup\n          if (e.buttons === 0) {\n            dispatcher.cancel(e);\n            this.cleanupMouse();\n          } else {\n            dispatcher.move(e);\n          }\n        }\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.findTarget(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (initial) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: this.currentTouchEvent.target\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var touchAction = scope.targetFinding.findTouchAction(inEvent);\n        var scrollAxis = this.touchActionToScrollType(touchAction);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36\n        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ\n        if (inEvent.cancelable) {\n          this.processTouches(inEvent, this.move);\n        }\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n      /*\n       * NOTE: an empty touch listener on body will reactivate nodes imported from templates with touch listeners\n       * Removing it will re-break the nodes\n       *\n       * Work around for https://bugs.webkit.org/show_bug.cgi?id=135628\n       */\n      var isSafari = nav.userAgent.match('Safari') && !nav.userAgent.match('Chrome');\n      if (isSafari) {\n        document.body.addEventListener('touchstart', function(){});\n      }\n    }\n  }\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     exposes: [\n      'trackstart',\n      'track',\n      'trackx',\n      'tracky',\n      'trackend'\n     ],\n     defaultActions: {\n       'track': 'none',\n       'trackx': 'pan-y',\n       'tracky': 'pan-x'\n     },\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       } else if (inType === 'trackx') {\n         return;\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       } else if (inType === 'tracky') {\n         return;\n       }\n       var gestureProto = {\n         bubbles: true,\n         cancelable: true,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       };\n       if (inType !== 'tracky') {\n         gestureProto.x = inEvent.x;\n         gestureProto.dx = d.x;\n         gestureProto.ddx = dd.x;\n         gestureProto.clientX = inEvent.clientX;\n         gestureProto.pageX = inEvent.pageX;\n         gestureProto.screenX = inEvent.screenX;\n         gestureProto.xDirection = t.xDirection;\n       }\n       if (inType !== 'trackx') {\n         gestureProto.dy = d.y;\n         gestureProto.ddy = dd.y;\n         gestureProto.y = inEvent.y;\n         gestureProto.clientY = inEvent.clientY;\n         gestureProto.pageY = inEvent.pageY;\n         gestureProto.screenY = inEvent.screenY;\n         gestureProto.yDirection = t.yDirection;\n       }\n       var e = eventFactory.makeGestureEvent(inType, gestureProto);\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             p.lastMoveEvent = p.downEvent;\n             this.fireTrack('trackstart', inEvent, p);\n           }\n         }\n         if (p.tracking) {\n           this.fireTrack('track', inEvent, p);\n           this.fireTrack('trackx', inEvent, p);\n           this.fireTrack('tracky', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    exposes: [\n      'hold',\n      'holdpulse',\n      'release'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    exposes: [\n      'tap'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n\n/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n\n// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      switch (op) {\n        case '||':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) ||\n                right(model, observer, filterRegistry);\n          };\n        case '&&':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) &&\n                right(model, observer, filterRegistry);\n          };\n      }\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      this.dynamicDeps = true;\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.4.0-d66a86e'\n};\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n /*\n\tOn supported platforms, platform.js is not needed. To retain compatibility\n\twith the polyfills, we stub out minimal functionality.\n */\nif (!window.Platform) {\n  logFlags = window.logFlags || {};\n\n\n  Platform = {\n  \tflush: function() {}\n  };\n\n  CustomElements = {\n  \tuseNative: true,\n    ready: true,\n    takeRecords: function() {},\n    instanceof: function(obj, base) {\n      return obj instanceof base;\n    }\n  };\n  \n  HTMLImports = {\n  \tuseNative: true\n  };\n\n  \n  addEventListener('HTMLImportsLoaded', function() {\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n\n\n  // ShadowDOM\n  ShadowDOMPolyfill = null;\n  wrap = unwrap = function(n){\n    return n;\n  };\n\n}\n\n/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded : link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n\n// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n\n// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n\n// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      var ifValue = true;\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        ifValue = deps.ifValue;\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !ifValue) {\n          this.valueChanged();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          ifValue = ifValue.open(this.updateIfValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      var value = deps.value;\n      if (!deps.oneTime)\n        value = value.open(this.updateIteratedValue, this);\n\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(value);\n    },\n\n    /**\n     * Gets the updated value of the bind/repeat. This can potentially call\n     * user code (if a bindingDelegate is set up) so we try to avoid it if we\n     * already have the value in hand (from Observer.open).\n     */\n    getUpdatedValue: function() {\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      return value;\n    },\n\n    updateIfValue: function(ifValue) {\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(this.getUpdatedValue());\n    },\n\n    updateIteratedValue: function(value) {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      this.updateValue(value);\n    },\n\n    updateValue: function(value) {\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = Platform.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n\n\n  // mixin\n\n  // copy all properties from inProps (et al) to inObj\n  function mixin(inObj/*, inProps, inMoreProps, ...*/) {\n    var obj = inObj || {};\n    for (var i = 1; i < arguments.length; i++) {\n      var p = arguments[i];\n      try {\n        for (var n in p) {\n          copyProperty(n, p, obj);\n        }\n      } catch(x) {\n      }\n    }\n    return obj;\n  }\n\n  // copy property inName from inSource object to inTarget object\n  function copyProperty(inName, inSource, inTarget) {\n    var pd = getPropertyDescriptor(inSource, inName);\n    Object.defineProperty(inTarget, inName, pd);\n  }\n\n  // get property descriptor for inName on inObject, even if\n  // inName exists on some link in inObject's prototype chain\n  function getPropertyDescriptor(inObject, inName) {\n    if (inObject) {\n      var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n      return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n    }\n  }\n\n  // exports\n\n  scope.extend = extend;\n  scope.mixin = mixin;\n\n  // for bc\n  Platform.mixin = mixin;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  \n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n\n  // exports\n\n  scope.createDOM = createDOM;\n\n})(Polymer);\n\n/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function noopHandler(value) {\n    return value;\n  }\n\n  var typeHandlers = {\n    string: noopHandler,\n    'undefined': noopHandler,\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true\n      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail === null || detail === undefined ? {} : detail;\n      var event = new CustomEvent(type, {\n        bubbles: bubbles !== undefined ? bubbles : true,\n        cancelable: cancelable !== undefined ? cancelable : true,\n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = PolymerGestures.addEventListener;\n  scope.removeEventListener = PolymerGestures.removeEventListener;\n\n})(Polymer);\n\n/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(splices) {\n            this.invokeMethod(callbackName, [splices]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure template is decorated (lets' things like <tr template ...> work)\n      HTMLTemplateElement.decorate(template);\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      if (!this.ownerDocument.isStagingDocument) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (hasShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (hasShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (typeof name !== 'string') {\n      var script = prototype || document._currentScript;\n      prototype = name;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  if (Platform.consumeDeclarations) {\n    Platform.consumeDeclarations(function(declarations) {;\n      if (declarations) {\n        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n          element.apply(null, d);\n        }\n      }\n    });\n  }\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Polymer.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Polymer.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (hasShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        PolymerGestures.addEventListener(node, eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            PolymerGestures.removeEventListener(node, eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute into the 'publish' object\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // create a `publish` object if needed.\n        // the `publish` object is only relevant to this prototype, the \n        // publishing logic in `declaration/properties.js` is responsible for\n        // managing property values on the prototype chain.\n        // TODO(sjmiles): the `publish` object is later chained to it's \n        //                ancestor object, presumably this is only for \n        //                reflection or other non-library uses. \n        var publish = prototype.publish || (prototype.publish = {}); \n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // looks weird, but causes n to exist on `publish` if it does not;\n          // a more careful test would need expensive `in` operator\n          if (n && publish[n] === undefined) {\n            publish[n] = undefined;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && template.content;\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (hasShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      var polyfillWasReady = CustomElements.ready;\n      CustomElements.ready = false;\n      this.flush();\n      if (!CustomElements.useNative) {\n        CustomElements.upgradeDocumentTree(document);\n      }\n      CustomElements.ready = polyfillWasReady;\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  function whenReady(callback) {\n    queue.waitToReady = true;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenReady;\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenReady = scope.whenReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n\n//# sourceMappingURL=polymer.concat.js.map"]}
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index ceeba6c..772d54d 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -87,19 +87,6 @@
 /// * if it has a Dart class, run PolymerDeclaration's register.
 /// * otherwise it is a JS prototype, run polymer-element's normal register.
 void _hookJsPolymer() {
-  // Note: platform.js is not used directly here, but we check that it is loaded
-  // to provide a good error message in Dartium if people forgot to include it.
-  // Otherwise, polymer.js below will fail with a hard to understand error
-  // message.
-  var platform = js.context['Platform'];
-  if (platform == null) {
-    throw new 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>.');
-  }
   var polymerJs = js.context['Polymer'];
   if (polymerJs == null) {
     throw new StateError('polymer.js must be loaded before polymer.dart, please'
@@ -155,6 +142,7 @@
 void _initializeLogging() {
   hierarchicalLoggingEnabled = true;
   var logFlags = js.context['logFlags'];
+  if (logFlags == null) logFlags = {};
   var loggers =
       [_observeLog, _eventsLog, _unbindLog, _bindLog, _watchLog, _readyLog];
   var polymerLogger = new Logger('polymer');
diff --git a/pkg/polymer/lib/transformer.dart b/pkg/polymer/lib/transformer.dart
index 997357a..c367716 100644
--- a/pkg/polymer/lib/transformer.dart
+++ b/pkg/polymer/lib/transformer.dart
@@ -45,7 +45,7 @@
   bool injectBuildLogs =
       !releaseMode && args['inject_build_logs_in_output'] != false;
   return new TransformOptions(
-      entryPoints: _readEntrypoints(args['entry_points']),
+      entryPoints: readEntrypoints(args['entry_points']),
       inlineStylesheets: _readInlineStylesheets(args['inline_stylesheets']),
       directlyIncludeJS: jsOption == null ? releaseMode : jsOption,
       contentSecurityPolicy: csp,
@@ -54,7 +54,7 @@
       injectBuildLogsInOutput: injectBuildLogs);
 }
 
-_readEntrypoints(value) {
+readEntrypoints(value) {
   if (value == null) return null;
   var entryPoints = [];
   bool error;
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index ec9d2e0..790d2a3 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.13.1
+version: 0.14.0+1
 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
@@ -16,12 +16,12 @@
   logging: '>=0.9.2 <0.10.0'
   observe: '>=0.11.0 <0.13.0'
   path: '>=0.9.0 <2.0.0'
-  polymer_expressions: '>=0.12.0 <0.13.0'
+  polymer_expressions: '>=0.12.0 <0.14.0'
   smoke: '>=0.2.0 <0.3.0'
   source_maps: '>=0.9.4 <0.11.0'
   source_span: '>=1.0.0 <2.0.0'
-  template_binding: '>=0.12.0 <0.13.0'
-  web_components: '>=0.5.0+1 <0.7.0'
+  template_binding: '>=0.12.0 <0.14.0'
+  web_components: '>=0.7.0 < 0.8.0'
   yaml: '>=0.9.0 <3.0.0'
 dev_dependencies:
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/polymer/test/bind_mdv_test.html b/pkg/polymer/test/bind_mdv_test.html
index 1f23b31..3992106 100644
--- a/pkg/polymer/test/bind_mdv_test.html
+++ b/pkg/polymer/test/bind_mdv_test.html
@@ -11,6 +11,7 @@
      .unittest-error { background: #a11;}
   </style>
   <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/polymer/src/js/polymer/polymer.concat.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/polymer/test/build/all_phases_test.dart b/pkg/polymer/test/build/all_phases_test.dart
index 80efec7..150913c 100644
--- a/pkg/polymer/test/build/all_phases_test.dart
+++ b/pkg/polymer/test/build/all_phases_test.dart
@@ -177,7 +177,8 @@
       'warning: ${ONLY_ONE_TAG.snippet} (web/test.html 2 0)',
       'warning: ${ONLY_ONE_TAG.snippet} (web/test.html 18 0)',
       'warning: ${ONLY_ONE_TAG.snippet} (web/test.html 34 0)',
-      'warning: Script file at "d.dart" not found. (web/test.html 34 0)',
+      'warning: ${SCRIPT_FILE_NOT_FOUND.create({'url': 'd.dart'}).snippet} '
+          '(web/test.html 34 0)',
     ]);
 
   testPhases('with imports', phases, {
diff --git a/pkg/polymer/test/build/code_extractor.dart b/pkg/polymer/test/build/code_extractor.dart
index f14b235..12b68ca 100644
--- a/pkg/polymer/test/build/code_extractor.dart
+++ b/pkg/polymer/test/build/code_extractor.dart
@@ -251,7 +251,8 @@
     }, {
       'a|web/test.html._data': EMPTY_DATA,
     }, [
-      'warning: Script file at "a.dart" not found. (web/test.html 1 0)',
+      'warning: ${SCRIPT_FILE_NOT_FOUND.create({'url': 'a.dart'}).snippet} '
+          '(web/test.html 1 0)',
     ]);
 
   testPhases('many script src around, valid and invalid', phases, {
@@ -267,7 +268,9 @@
     }, {
       'a|web/test.html._data': expectedData(['web/a.dart', 'web/c.dart']),
     }, [
-      'warning: Script file at "b.dart" not found. (web/test.html 1 0)',
-      'warning: Script file at "d.dart" not found. (web/test.html 3 0)',
+      'warning: ${SCRIPT_FILE_NOT_FOUND.create({'url': 'b.dart'}).snippet} '
+          '(web/test.html 1 0)',
+      'warning: ${SCRIPT_FILE_NOT_FOUND.create({'url': 'd.dart'}).snippet} '
+          '(web/test.html 3 0)',
     ]);
 }
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index 13b4cdf..0602b53 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -7,6 +7,7 @@
 import 'dart:convert';
 import 'package:polymer/src/build/common.dart';
 import 'package:polymer/src/build/import_inliner.dart';
+import 'package:polymer/src/build/messages.dart';
 import 'package:unittest/compact_vm_config.dart';
 import 'package:unittest/unittest.dart';
 import 'common.dart';
@@ -704,8 +705,9 @@
             '}'
           '}]}',
       }, [
-        'error: Failed to inline HTML import: '
-            'Could not find asset a|web/foo.html. (web/test.html 0 27)',
+        'error: ${INLINE_IMPORT_FAIL.create({
+            'error': 'Could not find asset a|web/foo.html.'}).snippet} '
+            '(web/test.html 0 27)',
       ]);
 }
 
diff --git a/pkg/polymer/test/build/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index 088642f..116b9a6 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -164,8 +164,7 @@
             '</script>'
             '<script src="packages/browser/dart.js"></script>',
       }, [
-        'warning: Only one "application/dart" script tag per document is'
-        ' allowed. (web/test.html 1 0)',
+        'warning: ${ONLY_ONE_TAG.snippet} (web/test.html 1 0)',
       ]);
 
     _testLinter('two top-level tags, non entrypoint', {
@@ -176,8 +175,7 @@
             '</script>'
             '<script src="packages/browser/dart.js"></script>'
       }, [
-        'warning: Only one "application/dart" script tag per document is'
-        ' allowed. (lib/test.html 1 0)',
+        'warning: ${ONLY_ONE_TAG.snippet} (lib/test.html 1 0)',
       ]);
 
     _testLinter('tags inside elements', {
@@ -191,8 +189,7 @@
             '</script>'
             '<script src="packages/browser/dart.js"></script>',
       }, [
-        'warning: Only one "application/dart" script tag per document is'
-        ' allowed. (web/test.html 1 0)',
+        'warning: ${ONLY_ONE_TAG.snippet} (web/test.html 1 0)',
       ]);
   });
 
@@ -201,7 +198,7 @@
         'a|web/test.html': '<html></html>',
       }, [
         'warning: (from html5lib) Unexpected start tag (html). '
-        'Expected DOCTYPE. (web/test.html 0 0)',
+            'Expected DOCTYPE. (web/test.html 0 0)',
         'warning: ${MISSING_INIT_POLYMER.snippet}',
       ]);
 
@@ -218,10 +215,11 @@
             <polymer-element name="x-a"></polymer-element>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: duplicate definition for custom tag "x-a". '
-        '(lib/test.html 2 0)',
-        'warning: duplicate definition for custom tag "x-a". '
-        '(second definition). (lib/test.html 3 0)'
+        'warning: ${DUPLICATE_DEFINITION.create(
+            {'name': 'x-a', 'second': ''}).snippet} (lib/test.html 2 0)',
+        'warning: ${DUPLICATE_DEFINITION.create(
+            {'name': 'x-a', 'second': ' (second definition).'}).snippet} '
+            '(lib/test.html 3 0)',
       ]);
 
     _testLinter('other file', {
@@ -234,10 +232,11 @@
             <polymer-element name="x-a"></polymer-element>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: duplicate definition for custom tag "x-a". '
-        '(lib/b.html 2 0)',
-        'warning: duplicate definition for custom tag "x-a". '
-        '(second definition). (lib/test.html 2 0)'
+        'warning: ${DUPLICATE_DEFINITION.create(
+            {'name': 'x-a', 'second': ''}).snippet} (lib/b.html 2 0)',
+        'warning: ${DUPLICATE_DEFINITION.create(
+            {'name': 'x-a', 'second': ' (second definition).'}).snippet} '
+            '(lib/test.html 2 0)',
       ]);
 
     _testLinter('non existing file', {
@@ -247,8 +246,9 @@
             <polymer-element name="x-a"></polymer-element>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: couldn\'t find imported asset "lib/b.html" in package '
-        '"a". (lib/test.html 2 0)'
+        'warning: ${IMPORT_NOT_FOUND.create(
+            {'path': 'lib/b.html', 'package': 'a'}).snippet} '
+            '(lib/test.html 2 0)'
       ]);
 
     _testLinter('other package', {
@@ -261,10 +261,11 @@
             <polymer-element name="x-a"></polymer-element>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: duplicate definition for custom tag "x-a". '
-        '(package:b/b.html 2 0)',
-        'warning: duplicate definition for custom tag "x-a". '
-        '(second definition). (lib/test.html 2 0)'
+        'warning: ${DUPLICATE_DEFINITION.create(
+            {'name': 'x-a', 'second': ''}).snippet} (package:b/b.html 2 0)',
+        'warning: ${DUPLICATE_DEFINITION.create(
+            {'name': 'x-a', 'second': ' (second definition).'}).snippet} '
+            '(lib/test.html 2 0)',
       ]);
   });
 
@@ -276,9 +277,12 @@
           <link rel="import" href="">
           </html>'''.replaceAll('          ', ''),
     }, [
-      'warning: link rel="import" missing href. (lib/test.html 1 0)',
-      'warning: link rel="stylesheet" missing href. (lib/test.html 2 0)',
-      'warning: link rel="import" missing href. (lib/test.html 4 0)'
+      'warning: ${MISSING_HREF.create({'rel': 'import'}).snippet} '
+          '(lib/test.html 1 0)',
+      'warning: ${MISSING_HREF.create({'rel': 'stylesheet'}).snippet} '
+          '(lib/test.html 2 0)',
+      'warning: ${MISSING_HREF.create({'rel': 'import'}).snippet} '
+          '(lib/test.html 4 0)',
     ]);
 
   _testLinter('<element> is not supported', {
@@ -286,8 +290,7 @@
           <element name="x-a"></element>
           </html>'''.replaceAll('          ', ''),
     }, [
-      'warning: <element> elements are not supported, use <polymer-element>'
-      ' instead. (lib/test.html 1 0)'
+      'warning: ${ELEMENT_DEPRECATED_EONS_AGO.snippet} (lib/test.html 1 0)'
     ]);
 
   _testLinter('do not nest <polymer-element>', {
@@ -300,8 +303,7 @@
           </polymer-element>
           </html>'''.replaceAll('          ', ''),
     }, [
-      'error: Nested polymer element definitions are not allowed.'
-      ' (lib/test.html 4 4)'
+      'error: ${NESTED_POLYMER_ELEMENT.snippet} (lib/test.html 4 4)'
     ]);
 
   _testLinter('do put import inside <polymer-element>', {
@@ -324,8 +326,7 @@
           <polymer-element></polymer-element>
           </html>'''.replaceAll('          ', ''),
     }, [
-      'error: Missing tag name of the custom element. Please include an '
-      'attribute like \'name="your-tag-name"\'. (lib/test.html 2 0)'
+      'error: ${MISSING_TAG_NAME.snippet} (lib/test.html 2 0)'
     ]);
 
   _testLinter('name for <polymer-element> should have dashes', {
@@ -334,10 +335,8 @@
           <polymer-element name="a"></polymer-element>
           </html>'''.replaceAll('          ', ''),
     }, [
-      'error: Invalid name "a". Custom element names must have at least one'
-      ' dash (-) and can\'t be any of the following names: annotation-xml, '
-      'color-profile, font-face, font-face-src, font-face-uri, '
-      'font-face-format, font-face-name, missing-glyph. (lib/test.html 2 0)'
+      'error: ${INVALID_TAG_NAME.create({'name': 'a'}).snippet} '
+          '(lib/test.html 2 0)'
     ]);
 
   _testLinter('extend is a valid element or existing tag', {
@@ -353,7 +352,8 @@
           <polymer-element name="x-a" extends="x-b"></polymer-element>
           </html>'''.replaceAll('          ', ''),
     }, [
-      'warning: custom element with name "x-b" not found. (lib/test.html 2 0)'
+      'warning: ${CUSTOM_ELEMENT_NOT_FOUND.create({'tag': 'x-b'}).snippet} '
+          '(lib/test.html 2 0)'
     ]);
 
 
@@ -375,8 +375,7 @@
             </polymer-element>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: Wrong script type, expected type="application/dart".'
-        ' (lib/test.html 3 0)'
+        'warning: ${EXPECTED_DART_MIME_TYPE.snippet} (lib/test.html 3 0)'
       ]);
 
     _testLinter('in polymer-element, .js url', {
@@ -408,8 +407,7 @@
             <script type="application/dart" src="foo.js"></script>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: "application/dart" scripts should use the .dart file '
-        'extension. (lib/test.html 1 0)'
+        'warning: ${EXPECTED_DART_EXTENSION.snippet} (lib/test.html 1 0)'
       ]);
   });
 
@@ -418,8 +416,7 @@
           <script type="application/dart"></script>
           </html>'''.replaceAll('          ', ''),
     }, [
-      'warning: script tag seems empty. '
-      '(lib/test.html 1 0)'
+      'warning: ${SCRIPT_TAG_SEEMS_EMPTY.snippet} (lib/test.html 1 0)'
     ]);
 
   _testLinter('script tags should have only src url or inline code', {
@@ -427,8 +424,7 @@
           <script type="application/dart" src="foo.dart">more</script>
           </html>'''.replaceAll('          ', ''),
     }, [
-      'warning: script tag has "src" attribute and also has script text. '
-      '(lib/test.html 1 0)'
+      'warning: ${FOUND_BOTH_SCRIPT_SRC_AND_TEXT.snippet} (lib/test.html 1 0)'
     ]);
 
   group('event handlers', () {
@@ -438,14 +434,21 @@
             '''.replaceAll('            ', ''),
       }, []);
 
+    _testLinter('no longer warn about on-foo for auto-binding templates', {
+        'a|lib/test.html': '''<html><body>
+            <template is="auto-binding-dart">
+              <div on-foo="{{something}}"></div>
+            </template>
+            '''.replaceAll('            ', ''),
+      }, []);
+
     _testLinter('on-foo is only supported in polymer elements', {
         'a|lib/test.html': '''<html><body>
             <div on-foo="something"></div>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: Inline event handlers are only supported inside '
-        'declarations of <polymer-element>. '
-        '(lib/test.html 1 5)'
+        'warning: ${EVENT_HANDLERS_ONLY_WITHIN_POLYMER.snippet} '
+            '(lib/test.html 1 5)'
       ]);
 
     _testLinter('on-foo uses the {{ binding }} syntax', {
@@ -455,10 +458,8 @@
             </polymer-element>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: Invalid event handler body "bar". Declare a method '
-        'in your custom element "void handlerName(event, detail, target)" '
-        'and use the form on-foo="{{handlerName}}". '
-        '(lib/test.html 2 33)'
+        'warning: ${INVALID_EVENT_HANDLER_BODY.create(
+            {'value': 'bar', 'name': 'on-foo'}).snippet} (lib/test.html 2 33)'
       ]);
 
     _testLinter('on-foo is not an expression', {
@@ -468,10 +469,9 @@
             </polymer-element>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: Invalid event handler body "{{bar()}}". Declare a method '
-        'in your custom element "void handlerName(event, detail, target)" '
-        'and use the form on-foo="{{handlerName}}". '
-        '(lib/test.html 2 33)'
+        'warning: ${INVALID_EVENT_HANDLER_BODY.create(
+            {'value': '{{bar()}}', 'name': 'on-foo'}).snippet} '
+            '(lib/test.html 2 33)'
       ]);
 
     _testLinter('on-foo can\'t be empty', {
@@ -481,10 +481,8 @@
             </polymer-element>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: Invalid event handler body "{{}}". Declare a method '
-        'in your custom element "void handlerName(event, detail, target)" '
-        'and use the form on-foo="{{handlerName}}". '
-        '(lib/test.html 2 33)'
+        'warning: ${INVALID_EVENT_HANDLER_BODY.create(
+            {'value': '{{}}', 'name': 'on-foo'}).snippet} (lib/test.html 2 33)'
       ]);
 
     _testLinter('on-foo can\'t be just space', {
@@ -494,10 +492,8 @@
             </polymer-element>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: Invalid event handler body "{{ }}". Declare a method '
-        'in your custom element "void handlerName(event, detail, target)" '
-        'and use the form on-foo="{{handlerName}}". '
-        '(lib/test.html 2 33)'
+        'warning: ${INVALID_EVENT_HANDLER_BODY.create(
+            {'value': '{{ }}', 'name': 'on-foo'}).snippet} (lib/test.html 2 33)'
       ]);
 
     _testLinter('on-foo-bar is supported as a custom event name', {
@@ -513,15 +509,15 @@
     _testLinter('tag exists (x-tag)', {
         'a|lib/test.html': '<x-foo></x-foo>',
       }, [
-        'warning: custom element with name "x-foo" not found. '
-        '(lib/test.html 0 0)'
+        'warning: ${CUSTOM_ELEMENT_NOT_FOUND.create({'tag': 'x-foo'}).snippet} '
+            '(lib/test.html 0 0)'
       ]);
 
     _testLinter('tag exists (type extension)', {
         'a|lib/test.html': '<div is="x-foo"></div>',
       }, [
-        'warning: custom element with name "x-foo" not found. '
-        '(lib/test.html 0 0)'
+        'warning: ${CUSTOM_ELEMENT_NOT_FOUND.create({'tag': 'x-foo'}).snippet} '
+            '(lib/test.html 0 0)'
       ]);
     
     _testLinter('tag exists (internally defined in code)', {
@@ -543,10 +539,8 @@
             <div is="x-a"></div>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: custom element "x-a" doesn\'t declare any type '
-        'extensions. To fix this, either rewrite this tag as '
-        '<x-a> or add \'extends="div"\' to '
-        'the custom element declaration. (lib/test.html 2 0)'
+        'warning: ${BAD_INSTANTIATION_BOGUS_BASE_TAG.create(
+            {'tag': 'x-a', 'base': 'div'}).snippet} (lib/test.html 2 0)'
       ]);
 
     _testLinter('used incorrectly, imported def (no base tag)', {
@@ -558,10 +552,8 @@
             <div is="x-a"></div>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: custom element "x-a" doesn\'t declare any type '
-        'extensions. To fix this, either rewrite this tag as '
-        '<x-a> or add \'extends="div"\' to '
-        'the custom element declaration. (lib/test.html 1 0)'
+        'warning: ${BAD_INSTANTIATION_BOGUS_BASE_TAG.create(
+            {'tag': 'x-a', 'base': 'div'}).snippet} (lib/test.html 1 0)'
       ]);
 
     _testLinter('used correctly (base tag)', {
@@ -587,10 +579,8 @@
             <x-a></x-a>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: custom element "x-a" extends from "div", but this tag '
-        'will not include the default properties of "div". To fix this, '
-        'either write this tag as <div is="x-a"> or remove the "extends" '
-        'attribute from the custom element declaration. (lib/test.html 1 0)'
+        'warning: ${BAD_INSTANTIATION_MISSING_BASE_TAG.create(
+            {'tag': 'x-a', 'base': 'div'}).snippet} (lib/test.html 1 0)'
       ]);
 
     _testLinter('used incorrectly (wrong base tag)', {
@@ -604,8 +594,8 @@
             <span is="x-a"></span>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: custom element "x-a" extends from "div". Did you mean '
-        'to write <div is="x-a">? (lib/test.html 1 0)'
+        'warning: ${BAD_INSTANTIATION_WRONG_BASE_TAG.create(
+            {'tag': 'x-a', 'base': 'div'}).snippet} (lib/test.html 1 0)'
       ]);
 
     _testLinter('used incorrectly (wrong base tag, transitive)', {
@@ -628,8 +618,8 @@
             <span is="x-a"></span>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: custom element "x-a" extends from "li". Did you mean '
-        'to write <li is="x-a">? (lib/test.html 2 0)'
+        'warning: ${BAD_INSTANTIATION_WRONG_BASE_TAG.create(
+            {'tag': 'x-a', 'base': 'li'}).snippet} (lib/test.html 2 0)'
       ]);
 
     _testLinter('FOUC warning works', {
@@ -702,9 +692,9 @@
             </polymer-element>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: PolymerElement no longer recognizes attribute names with '
-        'dashes such as "foo-bar". Use "fooBar" or "foobar" instead (both '
-        'forms are equivalent in HTML). (lib/test.html 2 28)'
+        'warning: ${NO_DASHES_IN_CUSTOM_ATTRIBUTES.create(
+            {'name': 'foo-bar', 'alternative': '"fooBar" or "foobar"'})
+                .snippet} (lib/test.html 2 28)'
       ]);
   });
 
diff --git a/pkg/polymer/test/build/script_compactor_test.dart b/pkg/polymer/test/build/script_compactor_test.dart
index 9d98deb..3e844d5 100644
--- a/pkg/polymer/test/build/script_compactor_test.dart
+++ b/pkg/polymer/test/build/script_compactor_test.dart
@@ -173,8 +173,8 @@
             '}\n'
             'main(){}',
       }, {}, [
-        'warning: The parameter to @CustomTag seems to be invalid. '
-        '(web/a.dart 2 11)',
+        'warning: ${INVALID_ANNOTATION_ARGUMENT.create(
+            {'name': 'CustomTag'}).snippet} (web/a.dart 2 11)',
       ]);
 
   testPhases(
@@ -503,8 +503,8 @@
             '}\n'
             'main(){}',
       }, {}, [
-        'warning: The parameter to @CustomTag seems to be invalid. '
-        '(web/a.dart 2 11)',
+        'warning: ${INVALID_ANNOTATION_ARGUMENT.create(
+            {'name': 'CustomTag'}).snippet} (web/a.dart 2 11)',
         'warning: ${NO_INITIALIZATION.snippet}',
       ]);
 
diff --git a/pkg/polymer/test/layout_test.dart b/pkg/polymer/test/layout_test.dart
new file mode 100644
index 0000000..8be7ce2
--- /dev/null
+++ b/pkg/polymer/test/layout_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 polymer.test.web.layout_test;
+
+import 'dart:async';
+import 'dart:html';
+import 'dart:js';
+import 'package:polymer/polymer.dart';
+import 'package:unittest/html_config.dart';
+import 'package:unittest/unittest.dart';
+
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+  
+  getTestElements(test) {
+    var t = document.getElementById(test);
+    return {
+        'h1': t.querySelector('[horizontal] > [flex]').getComputedStyle(),
+        'h2': t.querySelector('[horizontal] > [flex][sized]')
+            .getComputedStyle(),
+        'v1': t.querySelector('[vertical] > [flex]').getComputedStyle(),
+        'v2': t.querySelector('[vertical] > [flex][sized]').getComputedStyle()
+    };
+  }
+
+  // no-size container tests
+
+  test('flex-layout-attributies', () {
+    var elements = getTestElements('test1');
+    expect(elements['h1'].width, elements['h2'].width,
+        reason: 'unsized container: horizontal flex items have same width');
+    expect(elements['v1'].height, '0px',
+        reason: 'unsized container: vertical flex items have no intrinsic '
+                'height');
+  });
+  
+  test('flex auto layout attributes', () {
+    var elements = getTestElements('test2');
+    expect(elements['h1'].width, isNot(elements['h2'].width), 
+        reason: 'unsized container: horizontal flex auto items have intrinsic '
+                'width + flex amount');
+    expect(elements['v1'].height, isNot('0px'),
+        reason: 'unsized container: vertical flex auto items have intrinsic '
+                'height');
+  });
+
+  test('flex auto-vertical layout attributes', () {
+    var elements = getTestElements('test3');
+    expect(elements['h1'].width, elements['h2'].width, 
+        reason: 'unsized container: horizontal flex auto-vertical items have '
+                'same width');
+    expect(elements['v1'].height, isNot('0px'),
+        reason: 'unsized container: vertical flex auto-vertical items have '
+                'intrinsic height');
+  });
+
+  // Sized container tests
+
+  test('flex layout attributes', () {
+    var elements = getTestElements('test4');
+    expect(elements['h1'].width, elements['h2'].width,
+        reason: 'sized container: horizontal flex items have same width');
+    expect(elements['v1'].height, elements['v2'].height,
+        reason: 'sized container: vertical flex items have same height');
+  });
+
+  test('flex auto layout attributes', () {
+    var elements = getTestElements('test5');
+    expect(elements['h1'].width, isNot(elements['h2'].width),
+        reason: 'sized container: horizontal flex auto items have intrinsic '
+                'width + flex amount');
+    expect(elements['v1'].height, isNot('0px'),
+        reason: 'sized container: vertical flex auto items have intrinsic '
+                'height');
+    expect(elements['v1'].height, isNot(elements['v2'].height),
+        reason: 'sized container: vertical flex auto items have intrinsic '
+                'width + flex amount');
+  });
+
+  test('flex auto-vertical layout attributes', () {
+    var elements = getTestElements('test3');
+    expect(elements['h1'].width, elements['h2'].width,
+        reason: 'unsized container: horizontal flex auto-vertical items have '
+                'same width');
+    expect(elements['v1'].height, isNot('0px'),
+        reason: 'sized container: vertical flex auto-vertical items have '
+                'intrinsic height');
+    expect(elements['v1'].height, isNot(elements['v2'].height),
+        reason: 'sized container: vertical flex auto-vertical items have '
+                'intrinsic width + flex amount');
+  });
+
+});
diff --git a/pkg/polymer/test/layout_test.html b/pkg/polymer/test/layout_test.html
new file mode 100644
index 0000000..4bf9ef4
--- /dev/null
+++ b/pkg/polymer/test/layout_test.html
@@ -0,0 +1,179 @@
+<!--
+   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.
+-->
+<!doctype html>
+<html>
+<!--polymer-test: this comment is needed for test_suite.dart-->
+<head>
+  <script src="packages/web_components/platform.js"></script>
+  <script src="packages/web_components/dart_support.js"></script>
+  <link rel="import" href="packages/polymer/polymer.html">
+  <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+
+  <style shim-shadowdom>
+    [layout] {
+    border: 1px solid orange;
+    }
+
+    [flex] {
+    background-color: orange;
+    }
+
+    [sized] {
+    background-color: green;
+    border: 1px solid black;
+    height: 200px;
+    width: 200px;
+    }
+
+    [sized-container] [layout] {
+    height: 500px;
+    width: 500px;
+    }
+
+    /* IE10: requires flex items to be display block */
+    span {
+    display: block;
+    }
+
+  </style>
+
+</head>
+<body unresolved>
+<div id="test1">
+  <h2>layout flex</h2>
+    <span horizontal layout>
+      <span>I am not flex</span>
+      <span flex>
+        intrinsix
+      </span>
+      <span flex sized></span>
+      <span>I am not flex</span>
+    </span>
+  <br><br>
+    <span vertical layout>
+      <span>I am not flex</span>
+      <span flex>
+        intrinsix
+      </span>
+      <span flex sized></span>
+      <span>I am not flex</span>
+    </span>
+</div>
+<br><hr><br>
+<div id="test2">
+  <h2>layout flex auto</h2>
+    <span horizontal layout>
+      <span>I am not flex</span>
+      <span flex auto>
+        intrinsix
+      </span>
+      <span flex auto sized></span>
+      <span>I am not flex</span>
+    </span>
+  <br><br>
+    <span vertical layout>
+      <span>I am not flex</span>
+      <span flex auto>
+        intrinsix
+      </span>
+      <span flex auto sized></span>
+      <span>I am not flex</span>
+    </span>
+</div>
+<br><hr><br>
+<div id="test3">
+  <h2>layout flex auto-vertical</h2>
+  <span horizontal layout>
+    <span>I am not flex</span>
+    <span flex auto-vertical>
+      intrinsix
+    </span>
+    <span flex auto-vertical sized></span>
+    <span>I am not flex</span>
+  </span>
+  <br><br>
+  <span vertical layout>
+    <span>I am not flex</span>
+    <span flex auto-vertical>
+      intrinsix
+    </span>
+    <span flex auto-vertical sized></span>
+    <span>I am not flex</span>
+  </span>
+</div>
+<br><hr><hr><br>
+<h1>Sized Container</h1>
+<div sized-container>
+  <div id="test4">
+    <h2>layout flex</h2>
+    <span horizontal layout>
+      <span>I am not flex</span>
+      <span flex>
+        intrinsix
+      </span>
+      <span flex sized></span>
+      <span>I am not flex</span>
+    </span>
+    <br><br>
+    <span vertical layout>
+      <span>I am not flex</span>
+      <span flex>
+        intrinsix
+      </span>
+      <span flex sized></span>
+      <span>I am not flex</span>
+    </span>
+  </div>
+  <br><hr><br>
+  <div id="test5">
+    <h2>layout flex auto</h2>
+    <span horizontal layout>
+      <span>I am not flex</span>
+      <span flex auto>
+        intrinsix
+      </span>
+      <span flex auto sized></span>
+      <span>I am not flex</span>
+    </span>
+    <br><br>
+    <span vertical layout>
+      <span>I am not flex</span>
+      <span flex auto>
+        intrinsix
+      </span>
+      <span flex auto sized></span>
+      <span>I am not flex</span>
+    </span>
+  </div>
+  <br><hr><br>
+  <div id="test6">
+    <h2>layout flex auto-vertical</h2>
+    <span horizontal layout>
+      <span>I am not flex</span>
+      <span flex auto-vertical>
+        intrinsix
+      </span>
+      <span flex auto-vertical sized></span>
+      <span>I am not flex</span>
+    </span>
+    <br><br>
+    <span vertical layout>
+      <span>I am not flex</span>
+      <span flex auto-vertical>
+        intrinsix
+      </span>
+      <span flex auto-vertical sized></span>
+      <span>I am not flex</span>
+    </span>
+  </div>
+</div>
+
+
+<script type="application/dart" src="layout_test.dart">
+</script>
+
+</body>
+</html>
diff --git a/pkg/polymer/test/platform_less_test.dart b/pkg/polymer/test/platform_less_test.dart
new file mode 100644
index 0000000..28a5c0d
--- /dev/null
+++ b/pkg/polymer/test/platform_less_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.
+
+library polymer.test.web.layout_test;
+
+import 'dart:async';
+import 'dart:html';
+import 'dart:js';
+import 'package:polymer/polymer.dart';
+import 'package:unittest/html_config.dart';
+import 'package:unittest/unittest.dart';
+
+int elementsReadied = 0;
+
+@CustomTag('x-import')
+class XImport extends PolymerElement {
+  XImport.created() : super.created();
+
+  ready() {
+    elementsReadied++;
+  }
+}
+
+@CustomTag('x-main')
+class XMain extends PolymerElement {
+  XMain.created() : super.created();
+
+  ready() {
+    elementsReadied++;
+  }
+}
+
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('platform-less configuration', () {
+    var jsDoc = new JsObject.fromBrowserObject(document);
+    var htmlImports = context['HTMLImports'];
+
+    if (!ShadowRoot.supported || !(new LinkElement()).supportsImport) return;
+
+    expect(elementsReadied, 2, reason: 'imported elements upgraded');
+  });
+
+});
diff --git a/pkg/polymer/test/platform_less_test.html b/pkg/polymer/test/platform_less_test.html
new file mode 100644
index 0000000..5f90305
--- /dev/null
+++ b/pkg/polymer/test/platform_less_test.html
@@ -0,0 +1,31 @@
+<!--
+   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.
+-->
+<!doctype html>
+<html>
+<!--polymer-test: this comment is needed for test_suite.dart-->
+<head>
+  <title>platform-less test</title>
+  <script src="packages/web_components/dart_support.js"></script>
+  <link rel="import" href="packages/polymer/polymer.html">
+  <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  <link rel="import" href="platform_less_test_import.html">
+</head>
+<body unresolved>
+
+<polymer-element name="x-main">
+  <template>
+    Hi
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="platform_less_test.dart">
+</script>
+
+<x-main></x-main>
+<x-import></x-import>
+
+</body>
+</html>
diff --git a/pkg/polymer/test/platform_less_test_import.html b/pkg/polymer/test/platform_less_test_import.html
new file mode 100644
index 0000000..38464b6
--- /dev/null
+++ b/pkg/polymer/test/platform_less_test_import.html
@@ -0,0 +1,6 @@
+<link rel="import" href="packages/polymer/polymer.html">
+<polymer-element name="x-import">
+<template>
+  Hi
+</template>
+</polymer-element>
diff --git a/pkg/polymer/test/template_attr_template_test.dart b/pkg/polymer/test/template_attr_template_test.dart
new file mode 100644
index 0000000..a4e0b71
--- /dev/null
+++ b/pkg/polymer/test/template_attr_template_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+
+int testsRun = 0;
+
+@CustomTag('decoration-test')
+class DecorationTest extends PolymerElement {
+  List<int> options = [1, 2, 3, 4];
+
+  DecorationTest.created() : super.created();
+
+  ready() {
+    this.test();
+    testsRun++;
+  }
+
+  test() {
+    expect($['select'].children.length, 5,
+        reason: 'attribute template stamped');
+  }
+}
+
+@CustomTag('decoration-test2')
+class DecorationTest2 extends DecorationTest {
+  List<List<int>> arrs = [ [1,2,3], [4,5,6] ];
+
+  DecorationTest2.created() : super.created();
+
+  test() {
+    expect($['tbody'].children.length, 3,
+        reason: 'attribute template stamped');
+    expect($['tbody'].children[1].children.length, 4,
+        reason: 'attribute sub-template stamped');
+  }
+}
+
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('declaration-tests-ran', () {
+    // TODO(jakemac): Change this to '2' once http://dartbug.com/20197 is fixed.
+    expect(testsRun, 3, reason: 'decoration-tests-ran');
+  });
+});
diff --git a/pkg/polymer/test/template_attr_template_test.html b/pkg/polymer/test/template_attr_template_test.html
new file mode 100644
index 0000000..94689a1
--- /dev/null
+++ b/pkg/polymer/test/template_attr_template_test.html
@@ -0,0 +1,46 @@
+<!--
+   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.
+-->
+<!doctype html>
+<html>
+<!--polymer-test: this comment is needed for test_suite.dart-->
+<head>
+  <title>template attribute test</title>
+  <script src="packages/web_components/platform.js"></script>
+  <script src="packages/web_components/dart_support.js"></script>
+  <link rel="import" href="packages/polymer/polymer.html">
+  <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  <link rel="import" href="template_attr_template_test_import.html">
+</head>
+<body unresolved>
+
+<polymer-element name="decoration-test2" extends="decoration-test">
+  <template>
+    <table>
+      <thead>
+      <th>one</th>
+      <th>two</th>
+      <th>three</th>
+      </thead>
+      <tbody id="tbody">
+      <tr template repeat="{{ arr in arrs }}">
+        <td template repeat="{{ n in arr }}">
+          {{n}}
+        </td>
+      </tr>
+      </tbody>
+    </table>
+  </template>
+</polymer-element>
+
+<decoration-test></decoration-test>
+<br>
+<decoration-test2></decoration-test2>
+
+<script type="application/dart" src="template_attr_template_test.dart">
+</script>
+
+</body>
+</html>
diff --git a/pkg/polymer/test/template_attr_template_test_import.html b/pkg/polymer/test/template_attr_template_test_import.html
new file mode 100644
index 0000000..e05538f
--- /dev/null
+++ b/pkg/polymer/test/template_attr_template_test_import.html
@@ -0,0 +1,13 @@
+<!--
+   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.
+-->
+<link rel="import" href="packages/polymer/polymer.html">
+<polymer-element name="decoration-test">
+  <template>
+    <select id="select">
+      <option template repeat="{{opt in options}}" value="{{opt}}">{{opt}}</option>
+    </select>
+  </template>
+</polymer-element>
diff --git a/pkg/polymer/test/template_distribute_dynamic_test.dart b/pkg/polymer/test/template_distribute_dynamic_test.dart
index d808419d..4b57a19 100644
--- a/pkg/polymer/test/template_distribute_dynamic_test.dart
+++ b/pkg/polymer/test/template_distribute_dynamic_test.dart
@@ -39,15 +39,7 @@
           'shadowDOM dynamic distribution via template');
       expect(children[2].text, 'bar', reason:
           'shadowDOM dynamic distribution via template');
-
-      // TODO(jmesserly): restore this if we get the JS interop capability.
-      /*
-      if (window.ShadowDOMPolyfill) {
-        var actualChildren = this.$.echo.impl.children;
-        chai.assert.equal(actualChildren.length, 4,
-          'shadowDOMPolyfill distributes expected number of actual children.');
-      }
-      */
+      expect(children.length, 3, reason: 'expected number of children');
     });
   }
 }
diff --git a/pkg/polymer/tool/create_message_details_page.dart b/pkg/polymer/tool/create_message_details_page.dart
index 50d8c26..37e72a6 100644
--- a/pkg/polymer/tool/create_message_details_page.dart
+++ b/pkg/polymer/tool/create_message_details_page.dart
@@ -91,9 +91,8 @@
         ..write('\n{: #$hashTag}\n')
         ..write(body);
   } else {
-    var html = markdownToHtml('$title$body')
-        .replaceFirst('<h3>', '<h3 id="$hashTag">');
-    sb.write('\n\n$html');
+    var html = markdownToHtml('$title$body').replaceFirst('<hr', '</div><hr');
+    sb.write('\n\n<div id="$hashTag">$html');
   }
 }
 
@@ -132,6 +131,8 @@
 description: "Details about error messages from polymer and related packages."
 ---
 
+{% include breadcrumbs.html %}
+
 # {{ page.title }}
 
 <style>
@@ -190,6 +191,7 @@
   width: 80vw;
   margin: 20px;
   font-family: Roboto, sans-serif;
+  background-color: #f0f0f0;
 }
 
 h2 {
@@ -202,6 +204,16 @@
   font-weight: normal;
 }
 
+div:target {
+  background-color: #fff;
+  border: 1px solid #888;
+  border-radius: 5px;
+  padding: 0px 10px 2px 10px;
+  box-shadow: 7px 7px 5px #888888;
+  margin-bottom: 15px;
+}
+
+
 h3 {
   font-family: Montserrat, sans-serif;
   box-sizing: border-box;
@@ -212,6 +224,10 @@
   font-weight: normal;
 }
 
+div:target > h3 {
+  font-weight: bold;
+}
+
 pre {
   display: block;
   padding: 9.5px;
diff --git a/pkg/polymer_expressions/CHANGELOG.md b/pkg/polymer_expressions/CHANGELOG.md
index 06f49dd..17cb15c 100644
--- a/pkg/polymer_expressions/CHANGELOG.md
+++ b/pkg/polymer_expressions/CHANGELOG.md
@@ -1,7 +1,9 @@
-# changelog
-
-This file contains highlights of what changes on each version of the
-polymer_expressions package.
+#### Pub version 0.13.0
+  * Move minimum 'template_binding' constraint to 0.13.0.
+  * Additional polyfills are now required when using this package outside of 
+    polymer. All the files in the 'template_binding' package under lib/js should
+    be included at the top of your app in addition to platform.js from the
+    'web_components' package.
 
 #### Pub version 0.12.0+1
   * Widen dependency constraint on `observe`.
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 35170b4..17e8901 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,12 +1,12 @@
 name: polymer_expressions
-version: 0.12.0+1
+version: 0.13.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: An expressive custom binding syntax for HTML templates
 homepage: http://www.dartlang.org/polymer-dart/
 dependencies:
   browser: ">=0.10.0 <0.11.0"
   observe: ">=0.11.0 <0.13.0"
-  template_binding: ">=0.12.0 <0.13.0"
+  template_binding: ">=0.13.0 <0.14.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
   benchmark_harness: ">=1.0.0 <2.0.0"
diff --git a/pkg/polymer_expressions/test/bindings_test.html b/pkg/polymer_expressions/test/bindings_test.html
index 855f892..fee3538 100644
--- a/pkg/polymer_expressions/test/bindings_test.html
+++ b/pkg/polymer_expressions/test/bindings_test.html
@@ -11,6 +11,10 @@
      .unittest-error { background: #a11;}
   </style>
   <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/template_binding/js/observe.js"></script>
+  <script src="/packages/template_binding/js/node_bind.js"></script>
+  <script src="/packages/template_binding/js/microtask.js"></script>
+  <script src="/packages/template_binding/js/patches_mdv.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/polymer_expressions/test/globals_test.html b/pkg/polymer_expressions/test/globals_test.html
index 51f606b..9dbb93d 100644
--- a/pkg/polymer_expressions/test/globals_test.html
+++ b/pkg/polymer_expressions/test/globals_test.html
@@ -11,6 +11,10 @@
      .unittest-error { background: #a11;}
   </style>
   <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/template_binding/js/observe.js"></script>
+  <script src="/packages/template_binding/js/node_bind.js"></script>
+  <script src="/packages/template_binding/js/microtask.js"></script>
+  <script src="/packages/template_binding/js/patches_mdv.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/polymer_expressions/test/syntax_test.html b/pkg/polymer_expressions/test/syntax_test.html
index 9413dd3..e5533055 100644
--- a/pkg/polymer_expressions/test/syntax_test.html
+++ b/pkg/polymer_expressions/test/syntax_test.html
@@ -11,6 +11,10 @@
      .unittest-error { background: #a11;}
   </style>
   <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/template_binding/js/observe.js"></script>
+  <script src="/packages/template_binding/js/node_bind.js"></script>
+  <script src="/packages/template_binding/js/microtask.js"></script>
+  <script src="/packages/template_binding/js/patches_mdv.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
index 21bf6e4..a3a27c4 100644
--- a/pkg/template_binding/CHANGELOG.md
+++ b/pkg/template_binding/CHANGELOG.md
@@ -1,10 +1,11 @@
-# changelog
-
-This file contains highlights of what changes on each version of the
-template_binding package.
+#### Pub version 0.13.0
+  * Up to date with [TemplateBinding#41e95ea][41e95ea] (release 0.4.0)
+  * Using this package now requires some additional javascript polyfills, that
+    were moved out of platform.js. These files are listed under lib/js, and all
+    are required in addition to platform.js from the web_components package.
 
 #### Pub version 0.12.1
-  * Up to date with [TemplateBinding#6a2808][6a2808] (release 0.3.5)
+  * Up to date with [TemplateBinding#6a2808c][6a2808c] (release 0.3.5)
 
 #### Pub version 0.12.0+4
   * Widen the dependency constraint on `observe`.
diff --git a/pkg/template_binding/lib/js/microtask.js b/pkg/template_binding/lib/js/microtask.js
new file mode 100644
index 0000000..827f2fe
--- /dev/null
+++ b/pkg/template_binding/lib/js/microtask.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+(function(scope) {
+
+var iterations = 0;
+var callbacks = [];
+var twiddle = document.createTextNode('');
+
+function endOfMicrotask(callback) {
+  twiddle.textContent = iterations++;
+  callbacks.push(callback);
+}
+
+function atEndOfMicrotask() {
+  while (callbacks.length) {
+    callbacks.shift()();
+  }
+}
+
+new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)
+  .observe(twiddle, {characterData: true})
+  ;
+
+// exports
+
+scope.endOfMicrotask = endOfMicrotask;
+
+})(Platform);
+
diff --git a/pkg/template_binding/lib/js/node_bind.js b/pkg/template_binding/lib/js/node_bind.js
new file mode 100644
index 0000000..270c557
--- /dev/null
+++ b/pkg/template_binding/lib/js/node_bind.js
@@ -0,0 +1,343 @@
+// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+// Code distributed by Google as part of the polymer project is also
+// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+
+(function(global) {
+  'use strict';
+
+  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
+
+  function getTreeScope(node) {
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+
+    return typeof node.getElementById === 'function' ? node : null;
+  }
+
+  Node.prototype.bind = function(name, observable) {
+    console.error('Unhandled binding to Node: ', this, name, observable);
+  };
+
+  Node.prototype.bindFinished = function() {};
+
+  function updateBindings(node, name, binding) {
+    var bindings = node.bindings_;
+    if (!bindings)
+      bindings = node.bindings_ = {};
+
+    if (bindings[name])
+      binding[name].close();
+
+    return bindings[name] = binding;
+  }
+
+  function returnBinding(node, name, binding) {
+    return binding;
+  }
+
+  function sanitizeValue(value) {
+    return value == null ? '' : value;
+  }
+
+  function updateText(node, value) {
+    node.data = sanitizeValue(value);
+  }
+
+  function textBinding(node) {
+    return function(value) {
+      return updateText(node, value);
+    };
+  }
+
+  var maybeUpdateBindings = returnBinding;
+
+  Object.defineProperty(Platform, 'enableBindingsReflection', {
+    get: function() {
+      return maybeUpdateBindings === updateBindings;
+    },
+    set: function(enable) {
+      maybeUpdateBindings = enable ? updateBindings : returnBinding;
+      return enable;
+    },
+    configurable: true
+  });
+
+  Text.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'textContent')
+      return Node.prototype.bind.call(this, name, value, oneTime);
+
+    if (oneTime)
+      return updateText(this, value);
+
+    var observable = value;
+    updateText(this, observable.open(textBinding(this)));
+    return maybeUpdateBindings(this, name, observable);
+  }
+
+  function updateAttribute(el, name, conditional, value) {
+    if (conditional) {
+      if (value)
+        el.setAttribute(name, '');
+      else
+        el.removeAttribute(name);
+      return;
+    }
+
+    el.setAttribute(name, sanitizeValue(value));
+  }
+
+  function attributeBinding(el, name, conditional) {
+    return function(value) {
+      updateAttribute(el, name, conditional, value);
+    };
+  }
+
+  Element.prototype.bind = function(name, value, oneTime) {
+    var conditional = name[name.length - 1] == '?';
+    if (conditional) {
+      this.removeAttribute(name);
+      name = name.slice(0, -1);
+    }
+
+    if (oneTime)
+      return updateAttribute(this, name, conditional, value);
+
+
+    var observable = value;
+    updateAttribute(this, name, conditional,
+        observable.open(attributeBinding(this, name, conditional)));
+
+    return maybeUpdateBindings(this, name, observable);
+  };
+
+  var checkboxEventType;
+  (function() {
+    // Attempt to feature-detect which event (change or click) is fired first
+    // for checkboxes.
+    var div = document.createElement('div');
+    var checkbox = div.appendChild(document.createElement('input'));
+    checkbox.setAttribute('type', 'checkbox');
+    var first;
+    var count = 0;
+    checkbox.addEventListener('click', function(e) {
+      count++;
+      first = first || 'click';
+    });
+    checkbox.addEventListener('change', function() {
+      count++;
+      first = first || 'change';
+    });
+
+    var event = document.createEvent('MouseEvent');
+    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
+        false, false, false, 0, null);
+    checkbox.dispatchEvent(event);
+    // WebKit/Blink don't fire the change event if the element is outside the
+    // document, so assume 'change' for that case.
+    checkboxEventType = count == 1 ? 'change' : first;
+  })();
+
+  function getEventForInputType(element) {
+    switch (element.type) {
+      case 'checkbox':
+        return checkboxEventType;
+      case 'radio':
+      case 'select-multiple':
+      case 'select-one':
+        return 'change';
+      case 'range':
+        if (/Trident|MSIE/.test(navigator.userAgent))
+          return 'change';
+      default:
+        return 'input';
+    }
+  }
+
+  function updateInput(input, property, value, santizeFn) {
+    input[property] = (santizeFn || sanitizeValue)(value);
+  }
+
+  function inputBinding(input, property, santizeFn) {
+    return function(value) {
+      return updateInput(input, property, value, santizeFn);
+    }
+  }
+
+  function noop() {}
+
+  function bindInputEvent(input, property, observable, postEventFn) {
+    var eventType = getEventForInputType(input);
+
+    function eventHandler() {
+      observable.setValue(input[property]);
+      observable.discardChanges();
+      (postEventFn || noop)(input);
+      Platform.performMicrotaskCheckpoint();
+    }
+    input.addEventListener(eventType, eventHandler);
+
+    return {
+      close: function() {
+        input.removeEventListener(eventType, eventHandler);
+        observable.close();
+      },
+
+      observable_: observable
+    }
+  }
+
+  function booleanSanitize(value) {
+    return Boolean(value);
+  }
+
+  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
+  // Returns an array containing all radio buttons other than |element| that
+  // have the same |name|, either in the form that |element| belongs to or,
+  // if no form, in the document tree to which |element| belongs.
+  //
+  // This implementation is based upon the HTML spec definition of a
+  // "radio button group":
+  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
+  //
+  function getAssociatedRadioButtons(element) {
+    if (element.form) {
+      return filter(element.form.elements, function(el) {
+        return el != element &&
+            el.tagName == 'INPUT' &&
+            el.type == 'radio' &&
+            el.name == element.name;
+      });
+    } else {
+      var treeScope = getTreeScope(element);
+      if (!treeScope)
+        return [];
+      var radios = treeScope.querySelectorAll(
+          'input[type="radio"][name="' + element.name + '"]');
+      return filter(radios, function(el) {
+        return el != element && !el.form;
+      });
+    }
+  }
+
+  function checkedPostEvent(input) {
+    // Only the radio button that is getting checked gets an event. We
+    // therefore find all the associated radio buttons and update their
+    // check binding manually.
+    if (input.tagName === 'INPUT' &&
+        input.type === 'radio') {
+      getAssociatedRadioButtons(input).forEach(function(radio) {
+        var checkedBinding = radio.bindings_.checked;
+        if (checkedBinding) {
+          // Set the value directly to avoid an infinite call stack.
+          checkedBinding.observable_.setValue(false);
+        }
+      });
+    }
+  }
+
+  HTMLInputElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value' && name !== 'checked')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
+    var postEventFn = name == 'checked' ? checkedPostEvent : noop;
+
+    if (oneTime)
+      return updateInput(this, name, value, sanitizeFn);
+
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable, postEventFn);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name, sanitizeFn)),
+                sanitizeFn);
+
+    // Checkboxes may need to update bindings of other checkboxes.
+    return updateBindings(this, name, binding);
+  }
+
+  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateInput(this, 'value', value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateInput(this, 'value',
+                observable.open(inputBinding(this, 'value', sanitizeValue)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  function updateOption(option, value) {
+    var parentNode = option.parentNode;;
+    var select;
+    var selectBinding;
+    var oldValue;
+    if (parentNode instanceof HTMLSelectElement &&
+        parentNode.bindings_ &&
+        parentNode.bindings_.value) {
+      select = parentNode;
+      selectBinding = select.bindings_.value;
+      oldValue = select.value;
+    }
+
+    option.value = sanitizeValue(value);
+
+    if (select && select.value != oldValue) {
+      selectBinding.observable_.setValue(select.value);
+      selectBinding.observable_.discardChanges();
+      Platform.performMicrotaskCheckpoint();
+    }
+  }
+
+  function optionBinding(option) {
+    return function(value) {
+      updateOption(option, value);
+    }
+  }
+
+  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateOption(this, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateOption(this, observable.open(optionBinding(this)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
+    if (name === 'selectedindex')
+      name = 'selectedIndex';
+
+    if (name !== 'selectedIndex' && name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+
+    if (oneTime)
+      return updateInput(this, name, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name)));
+
+    // Option update events may need to access select bindings.
+    return updateBindings(this, name, binding);
+  }
+})(this);
diff --git a/pkg/template_binding/lib/js/observe.js b/pkg/template_binding/lib/js/observe.js
new file mode 100644
index 0000000..240e25d
--- /dev/null
+++ b/pkg/template_binding/lib/js/observe.js
@@ -0,0 +1,1727 @@
+// 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';
+
+  var testingExposeCycleCount = global.testingExposeCycleCount;
+
+  // Detect and do basic sanity checking on Object/Array.observe.
+  function detectObjectObserve() {
+    if (typeof Object.observe !== 'function' ||
+        typeof Array.observe !== 'function') {
+      return false;
+    }
+
+    var records = [];
+
+    function callback(recs) {
+      records = recs;
+    }
+
+    var test = {};
+    var arr = [];
+    Object.observe(test, callback);
+    Array.observe(arr, callback);
+    test.id = 1;
+    test.id = 2;
+    delete test.id;
+    arr.push(1, 2);
+    arr.length = 0;
+
+    Object.deliverChangeRecords(callback);
+    if (records.length !== 5)
+      return false;
+
+    if (records[0].type != 'add' ||
+        records[1].type != 'update' ||
+        records[2].type != 'delete' ||
+        records[3].type != 'splice' ||
+        records[4].type != 'splice') {
+      return false;
+    }
+
+    Object.unobserve(test, callback);
+    Array.unobserve(arr, callback);
+
+    return true;
+  }
+
+  var hasObserve = detectObjectObserve();
+
+  function detectEval() {
+    // Don't test for eval if we're running in a Chrome App environment.
+    // We check for APIs set that only exist in a Chrome App context.
+    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
+      return false;
+    }
+
+    // Firefox OS Apps do not allow eval. This feature detection is very hacky
+    // but even if some other platform adds support for this function this code
+    // will continue to work.
+    if (navigator.getDeviceStorage) {
+      return false;
+    }
+
+    try {
+      var f = new Function('', 'return true;');
+      return f();
+    } catch (ex) {
+      return false;
+    }
+  }
+
+  var hasEval = detectEval();
+
+  function isIndex(s) {
+    return +s === s >>> 0;
+  }
+
+  function toNumber(s) {
+    return +s;
+  }
+
+  function isObject(obj) {
+    return obj === Object(obj);
+  }
+
+  var numberIsNaN = global.Number.isNaN || function(value) {
+    return typeof value === 'number' && global.isNaN(value);
+  }
+
+  function areSameValue(left, right) {
+    if (left === right)
+      return left !== 0 || 1 / left === 1 / right;
+    if (numberIsNaN(left) && numberIsNaN(right))
+      return true;
+
+    return left !== left && right !== right;
+  }
+
+  var createObject = ('__proto__' in {}) ?
+    function(obj) { return obj; } :
+    function(obj) {
+      var proto = obj.__proto__;
+      if (!proto)
+        return obj;
+      var newObject = Object.create(proto);
+      Object.getOwnPropertyNames(obj).forEach(function(name) {
+        Object.defineProperty(newObject, name,
+                             Object.getOwnPropertyDescriptor(obj, name));
+      });
+      return newObject;
+    };
+
+  var identStart = '[\$_a-zA-Z]';
+  var identPart = '[\$_a-zA-Z0-9]';
+  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');
+
+  function getPathCharType(char) {
+    if (char === undefined)
+      return 'eof';
+
+    var code = char.charCodeAt(0);
+
+    switch(code) {
+      case 0x5B: // [
+      case 0x5D: // ]
+      case 0x2E: // .
+      case 0x22: // "
+      case 0x27: // '
+      case 0x30: // 0
+        return char;
+
+      case 0x5F: // _
+      case 0x24: // $
+        return 'ident';
+
+      case 0x20: // Space
+      case 0x09: // Tab
+      case 0x0A: // Newline
+      case 0x0D: // Return
+      case 0xA0:  // No-break space
+      case 0xFEFF:  // Byte Order Mark
+      case 0x2028:  // Line Separator
+      case 0x2029:  // Paragraph Separator
+        return 'ws';
+    }
+
+    // a-z, A-Z
+    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
+      return 'ident';
+
+    // 1-9
+    if (0x31 <= code && code <= 0x39)
+      return 'number';
+
+    return 'else';
+  }
+
+  var pathStateMachine = {
+    'beforePath': {
+      'ws': ['beforePath'],
+      'ident': ['inIdent', 'append'],
+      '[': ['beforeElement'],
+      'eof': ['afterPath']
+    },
+
+    'inPath': {
+      'ws': ['inPath'],
+      '.': ['beforeIdent'],
+      '[': ['beforeElement'],
+      'eof': ['afterPath']
+    },
+
+    'beforeIdent': {
+      'ws': ['beforeIdent'],
+      'ident': ['inIdent', 'append']
+    },
+
+    'inIdent': {
+      'ident': ['inIdent', 'append'],
+      '0': ['inIdent', 'append'],
+      'number': ['inIdent', 'append'],
+      'ws': ['inPath', 'push'],
+      '.': ['beforeIdent', 'push'],
+      '[': ['beforeElement', 'push'],
+      'eof': ['afterPath', 'push']
+    },
+
+    'beforeElement': {
+      'ws': ['beforeElement'],
+      '0': ['afterZero', 'append'],
+      'number': ['inIndex', 'append'],
+      "'": ['inSingleQuote', 'append', ''],
+      '"': ['inDoubleQuote', 'append', '']
+    },
+
+    'afterZero': {
+      'ws': ['afterElement', 'push'],
+      ']': ['inPath', 'push']
+    },
+
+    'inIndex': {
+      '0': ['inIndex', 'append'],
+      'number': ['inIndex', 'append'],
+      'ws': ['afterElement'],
+      ']': ['inPath', 'push']
+    },
+
+    'inSingleQuote': {
+      "'": ['afterElement'],
+      'eof': ['error'],
+      'else': ['inSingleQuote', 'append']
+    },
+
+    'inDoubleQuote': {
+      '"': ['afterElement'],
+      'eof': ['error'],
+      'else': ['inDoubleQuote', 'append']
+    },
+
+    'afterElement': {
+      'ws': ['afterElement'],
+      ']': ['inPath', 'push']
+    }
+  }
+
+  function noop() {}
+
+  function parsePath(path) {
+    var keys = [];
+    var index = -1;
+    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';
+
+    var actions = {
+      push: function() {
+        if (key === undefined)
+          return;
+
+        keys.push(key);
+        key = undefined;
+      },
+
+      append: function() {
+        if (key === undefined)
+          key = newChar
+        else
+          key += newChar;
+      }
+    };
+
+    function maybeUnescapeQuote() {
+      if (index >= path.length)
+        return;
+
+      var nextChar = path[index + 1];
+      if ((mode == 'inSingleQuote' && nextChar == "'") ||
+          (mode == 'inDoubleQuote' && nextChar == '"')) {
+        index++;
+        newChar = nextChar;
+        actions.append();
+        return true;
+      }
+    }
+
+    while (mode) {
+      index++;
+      c = path[index];
+
+      if (c == '\\' && maybeUnescapeQuote(mode))
+        continue;
+
+      type = getPathCharType(c);
+      typeMap = pathStateMachine[mode];
+      transition = typeMap[type] || typeMap['else'] || 'error';
+
+      if (transition == 'error')
+        return; // parse error;
+
+      mode = transition[0];
+      action = actions[transition[1]] || noop;
+      newChar = transition[2] === undefined ? c : transition[2];
+      action();
+
+      if (mode === 'afterPath') {
+        return keys;
+      }
+    }
+
+    return; // parse error
+  }
+
+  function isIdent(s) {
+    return identRegExp.test(s);
+  }
+
+  var constructorIsPrivate = {};
+
+  function Path(parts, privateToken) {
+    if (privateToken !== constructorIsPrivate)
+      throw Error('Use Path.get to retrieve path objects');
+
+    for (var i = 0; i < parts.length; i++) {
+      this.push(String(parts[i]));
+    }
+
+    if (hasEval && this.length) {
+      this.getValueFrom = this.compiledGetValueFromFn();
+    }
+  }
+
+  // TODO(rafaelw): Make simple LRU cache
+  var pathCache = {};
+
+  function getPath(pathString) {
+    if (pathString instanceof Path)
+      return pathString;
+
+    if (pathString == null || pathString.length == 0)
+      pathString = '';
+
+    if (typeof pathString != 'string') {
+      if (isIndex(pathString.length)) {
+        // Constructed with array-like (pre-parsed) keys
+        return new Path(pathString, constructorIsPrivate);
+      }
+
+      pathString = String(pathString);
+    }
+
+    var path = pathCache[pathString];
+    if (path)
+      return path;
+
+    var parts = parsePath(pathString);
+    if (!parts)
+      return invalidPath;
+
+    var path = new Path(parts, constructorIsPrivate);
+    pathCache[pathString] = path;
+    return path;
+  }
+
+  Path.get = getPath;
+
+  function formatAccessor(key) {
+    if (isIndex(key)) {
+      return '[' + key + ']';
+    } else {
+      return '["' + key.replace(/"/g, '\\"') + '"]';
+    }
+  }
+
+  Path.prototype = createObject({
+    __proto__: [],
+    valid: true,
+
+    toString: function() {
+      var pathString = '';
+      for (var i = 0; i < this.length; i++) {
+        var key = this[i];
+        if (isIdent(key)) {
+          pathString += i ? '.' + key : key;
+        } else {
+          pathString += formatAccessor(key);
+        }
+      }
+
+      return pathString;
+    },
+
+    getValueFrom: function(obj, directObserver) {
+      for (var i = 0; i < this.length; i++) {
+        if (obj == null)
+          return;
+        obj = obj[this[i]];
+      }
+      return obj;
+    },
+
+    iterateObjects: function(obj, observe) {
+      for (var i = 0; i < this.length; i++) {
+        if (i)
+          obj = obj[this[i - 1]];
+        if (!isObject(obj))
+          return;
+        observe(obj, this[0]);
+      }
+    },
+
+    compiledGetValueFromFn: function() {
+      var str = '';
+      var pathString = 'obj';
+      str += 'if (obj != null';
+      var i = 0;
+      var key;
+      for (; i < (this.length - 1); i++) {
+        key = this[i];
+        pathString += isIdent(key) ? '.' + key : formatAccessor(key);
+        str += ' &&\n     ' + pathString + ' != null';
+      }
+      str += ')\n';
+
+      var key = this[i];
+      pathString += isIdent(key) ? '.' + key : formatAccessor(key);
+
+      str += '  return ' + pathString + ';\nelse\n  return undefined;';
+      return new Function('obj', str);
+    },
+
+    setValueFrom: function(obj, value) {
+      if (!this.length)
+        return false;
+
+      for (var i = 0; i < this.length - 1; i++) {
+        if (!isObject(obj))
+          return false;
+        obj = obj[this[i]];
+      }
+
+      if (!isObject(obj))
+        return false;
+
+      obj[this[i]] = value;
+      return true;
+    }
+  });
+
+  var invalidPath = new Path('', constructorIsPrivate);
+  invalidPath.valid = false;
+  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
+
+  var MAX_DIRTY_CHECK_CYCLES = 1000;
+
+  function dirtyCheck(observer) {
+    var cycles = 0;
+    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
+      cycles++;
+    }
+    if (testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    return cycles > 0;
+  }
+
+  function objectIsEmpty(object) {
+    for (var prop in object)
+      return false;
+    return true;
+  }
+
+  function diffIsEmpty(diff) {
+    return objectIsEmpty(diff.added) &&
+           objectIsEmpty(diff.removed) &&
+           objectIsEmpty(diff.changed);
+  }
+
+  function diffObjectFromOldObject(object, oldObject) {
+    var added = {};
+    var removed = {};
+    var changed = {};
+
+    for (var prop in oldObject) {
+      var newValue = object[prop];
+
+      if (newValue !== undefined && newValue === oldObject[prop])
+        continue;
+
+      if (!(prop in object)) {
+        removed[prop] = undefined;
+        continue;
+      }
+
+      if (newValue !== oldObject[prop])
+        changed[prop] = newValue;
+    }
+
+    for (var prop in object) {
+      if (prop in oldObject)
+        continue;
+
+      added[prop] = object[prop];
+    }
+
+    if (Array.isArray(object) && object.length !== oldObject.length)
+      changed.length = object.length;
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  var eomTasks = [];
+  function runEOMTasks() {
+    if (!eomTasks.length)
+      return false;
+
+    for (var i = 0; i < eomTasks.length; i++) {
+      eomTasks[i]();
+    }
+    eomTasks.length = 0;
+    return true;
+  }
+
+  var runEOM = hasObserve ? (function(){
+    var eomObj = { pingPong: true };
+    var eomRunScheduled = false;
+
+    Object.observe(eomObj, function() {
+      runEOMTasks();
+      eomRunScheduled = false;
+    });
+
+    return function(fn) {
+      eomTasks.push(fn);
+      if (!eomRunScheduled) {
+        eomRunScheduled = true;
+        eomObj.pingPong = !eomObj.pingPong;
+      }
+    };
+  })() :
+  (function() {
+    return function(fn) {
+      eomTasks.push(fn);
+    };
+  })();
+
+  var observedObjectCache = [];
+
+  function newObservedObject() {
+    var observer;
+    var object;
+    var discardRecords = false;
+    var first = true;
+
+    function callback(records) {
+      if (observer && observer.state_ === OPENED && !discardRecords)
+        observer.check_(records);
+    }
+
+    return {
+      open: function(obs) {
+        if (observer)
+          throw Error('ObservedObject in use');
+
+        if (!first)
+          Object.deliverChangeRecords(callback);
+
+        observer = obs;
+        first = false;
+      },
+      observe: function(obj, arrayObserve) {
+        object = obj;
+        if (arrayObserve)
+          Array.observe(object, callback);
+        else
+          Object.observe(object, callback);
+      },
+      deliver: function(discard) {
+        discardRecords = discard;
+        Object.deliverChangeRecords(callback);
+        discardRecords = false;
+      },
+      close: function() {
+        observer = undefined;
+        Object.unobserve(object, callback);
+        observedObjectCache.push(this);
+      }
+    };
+  }
+
+  /*
+   * The observedSet abstraction is a perf optimization which reduces the total
+   * number of Object.observe observations of a set of objects. The idea is that
+   * groups of Observers will have some object dependencies in common and this
+   * observed set ensures that each object in the transitive closure of
+   * dependencies is only observed once. The observedSet acts as a write barrier
+   * such that whenever any change comes through, all Observers are checked for
+   * changed values.
+   *
+   * Note that this optimization is explicitly moving work from setup-time to
+   * change-time.
+   *
+   * TODO(rafaelw): Implement "garbage collection". In order to move work off
+   * the critical path, when Observers are closed, their observed objects are
+   * not Object.unobserve(d). As a result, it's possible that if the observedSet
+   * is kept open, but some Observers have been closed, it could cause "leaks"
+   * (prevent otherwise collectable objects from being collected). At some
+   * point, we should implement incremental "gc" which keeps a list of
+   * observedSets which may need clean-up and does small amounts of cleanup on a
+   * timeout until all is clean.
+   */
+
+  function getObservedObject(observer, object, arrayObserve) {
+    var dir = observedObjectCache.pop() || newObservedObject();
+    dir.open(observer);
+    dir.observe(object, arrayObserve);
+    return dir;
+  }
+
+  var observedSetCache = [];
+
+  function newObservedSet() {
+    var observerCount = 0;
+    var observers = [];
+    var objects = [];
+    var rootObj;
+    var rootObjProps;
+
+    function observe(obj, prop) {
+      if (!obj)
+        return;
+
+      if (obj === rootObj)
+        rootObjProps[prop] = true;
+
+      if (objects.indexOf(obj) < 0) {
+        objects.push(obj);
+        Object.observe(obj, callback);
+      }
+
+      observe(Object.getPrototypeOf(obj), prop);
+    }
+
+    function allRootObjNonObservedProps(recs) {
+      for (var i = 0; i < recs.length; i++) {
+        var rec = recs[i];
+        if (rec.object !== rootObj ||
+            rootObjProps[rec.name] ||
+            rec.type === 'setPrototype') {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    function callback(recs) {
+      if (allRootObjNonObservedProps(recs))
+        return;
+
+      var observer;
+      for (var i = 0; i < observers.length; i++) {
+        observer = observers[i];
+        if (observer.state_ == OPENED) {
+          observer.iterateObjects_(observe);
+        }
+      }
+
+      for (var i = 0; i < observers.length; i++) {
+        observer = observers[i];
+        if (observer.state_ == OPENED) {
+          observer.check_();
+        }
+      }
+    }
+
+    var record = {
+      object: undefined,
+      objects: objects,
+      open: function(obs, object) {
+        if (!rootObj) {
+          rootObj = object;
+          rootObjProps = {};
+        }
+
+        observers.push(obs);
+        observerCount++;
+        obs.iterateObjects_(observe);
+      },
+      close: function(obs) {
+        observerCount--;
+        if (observerCount > 0) {
+          return;
+        }
+
+        for (var i = 0; i < objects.length; i++) {
+          Object.unobserve(objects[i], callback);
+          Observer.unobservedCount++;
+        }
+
+        observers.length = 0;
+        objects.length = 0;
+        rootObj = undefined;
+        rootObjProps = undefined;
+        observedSetCache.push(this);
+      }
+    };
+
+    return record;
+  }
+
+  var lastObservedSet;
+
+  function getObservedSet(observer, obj) {
+    if (!lastObservedSet || lastObservedSet.object !== obj) {
+      lastObservedSet = observedSetCache.pop() || newObservedSet();
+      lastObservedSet.object = obj;
+    }
+    lastObservedSet.open(observer, obj);
+    return lastObservedSet;
+  }
+
+  var UNOPENED = 0;
+  var OPENED = 1;
+  var CLOSED = 2;
+  var RESETTING = 3;
+
+  var nextObserverId = 1;
+
+  function Observer() {
+    this.state_ = UNOPENED;
+    this.callback_ = undefined;
+    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef
+    this.directObserver_ = undefined;
+    this.value_ = undefined;
+    this.id_ = nextObserverId++;
+  }
+
+  Observer.prototype = {
+    open: function(callback, target) {
+      if (this.state_ != UNOPENED)
+        throw Error('Observer has already been opened.');
+
+      addToAll(this);
+      this.callback_ = callback;
+      this.target_ = target;
+      this.connect_();
+      this.state_ = OPENED;
+      return this.value_;
+    },
+
+    close: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      removeFromAll(this);
+      this.disconnect_();
+      this.value_ = undefined;
+      this.callback_ = undefined;
+      this.target_ = undefined;
+      this.state_ = CLOSED;
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      dirtyCheck(this);
+    },
+
+    report_: function(changes) {
+      try {
+        this.callback_.apply(this.target_, changes);
+      } catch (ex) {
+        Observer._errorThrownDuringCallback = true;
+        console.error('Exception caught during observer callback: ' +
+                       (ex.stack || ex));
+      }
+    },
+
+    discardChanges: function() {
+      this.check_(undefined, true);
+      return this.value_;
+    }
+  }
+
+  var collectObservers = !hasObserve;
+  var allObservers;
+  Observer._allObserversCount = 0;
+
+  if (collectObservers) {
+    allObservers = [];
+  }
+
+  function addToAll(observer) {
+    Observer._allObserversCount++;
+    if (!collectObservers)
+      return;
+
+    allObservers.push(observer);
+  }
+
+  function removeFromAll(observer) {
+    Observer._allObserversCount--;
+  }
+
+  var runningMicrotaskCheckpoint = false;
+
+  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {
+    try {
+      eval('%RunMicrotasks()');
+      return true;
+    } catch (ex) {
+      return false;
+    }
+  })();
+
+  global.Platform = global.Platform || {};
+
+  global.Platform.performMicrotaskCheckpoint = function() {
+    if (runningMicrotaskCheckpoint)
+      return;
+
+    if (hasDebugForceFullDelivery) {
+      eval('%RunMicrotasks()');
+      return;
+    }
+
+    if (!collectObservers)
+      return;
+
+    runningMicrotaskCheckpoint = true;
+
+    var cycles = 0;
+    var anyChanged, toCheck;
+
+    do {
+      cycles++;
+      toCheck = allObservers;
+      allObservers = [];
+      anyChanged = false;
+
+      for (var i = 0; i < toCheck.length; i++) {
+        var observer = toCheck[i];
+        if (observer.state_ != OPENED)
+          continue;
+
+        if (observer.check_())
+          anyChanged = true;
+
+        allObservers.push(observer);
+      }
+      if (runEOMTasks())
+        anyChanged = true;
+    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
+
+    if (testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    runningMicrotaskCheckpoint = false;
+  };
+
+  if (collectObservers) {
+    global.Platform.clearObservers = function() {
+      allObservers = [];
+    };
+  }
+
+  function ObjectObserver(object) {
+    Observer.call(this);
+    this.value_ = object;
+    this.oldObject_ = undefined;
+  }
+
+  ObjectObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    arrayObserve: false,
+
+    connect_: function(callback, target) {
+      if (hasObserve) {
+        this.directObserver_ = getObservedObject(this, this.value_,
+                                                 this.arrayObserve);
+      } else {
+        this.oldObject_ = this.copyObject(this.value_);
+      }
+
+    },
+
+    copyObject: function(object) {
+      var copy = Array.isArray(object) ? [] : {};
+      for (var prop in object) {
+        copy[prop] = object[prop];
+      };
+      if (Array.isArray(object))
+        copy.length = object.length;
+      return copy;
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var diff;
+      var oldValues;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+
+        oldValues = {};
+        diff = diffObjectFromChangeRecords(this.value_, changeRecords,
+                                           oldValues);
+      } else {
+        oldValues = this.oldObject_;
+        diff = diffObjectFromOldObject(this.value_, this.oldObject_);
+      }
+
+      if (diffIsEmpty(diff))
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([
+        diff.added || {},
+        diff.removed || {},
+        diff.changed || {},
+        function(property) {
+          return oldValues[property];
+        }
+      ]);
+
+      return true;
+    },
+
+    disconnect_: function() {
+      if (hasObserve) {
+        this.directObserver_.close();
+        this.directObserver_ = undefined;
+      } else {
+        this.oldObject_ = undefined;
+      }
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      if (hasObserve)
+        this.directObserver_.deliver(false);
+      else
+        dirtyCheck(this);
+    },
+
+    discardChanges: function() {
+      if (this.directObserver_)
+        this.directObserver_.deliver(true);
+      else
+        this.oldObject_ = this.copyObject(this.value_);
+
+      return this.value_;
+    }
+  });
+
+  function ArrayObserver(array) {
+    if (!Array.isArray(array))
+      throw Error('Provided object is not an Array');
+    ObjectObserver.call(this, array);
+  }
+
+  ArrayObserver.prototype = createObject({
+
+    __proto__: ObjectObserver.prototype,
+
+    arrayObserve: true,
+
+    copyObject: function(arr) {
+      return arr.slice();
+    },
+
+    check_: function(changeRecords) {
+      var splices;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+        splices = projectArraySplices(this.value_, changeRecords);
+      } else {
+        splices = calcSplices(this.value_, 0, this.value_.length,
+                              this.oldObject_, 0, this.oldObject_.length);
+      }
+
+      if (!splices || !splices.length)
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([splices]);
+      return true;
+    }
+  });
+
+  ArrayObserver.applySplices = function(previous, current, splices) {
+    splices.forEach(function(splice) {
+      var spliceArgs = [splice.index, splice.removed.length];
+      var addIndex = splice.index;
+      while (addIndex < splice.index + splice.addedCount) {
+        spliceArgs.push(current[addIndex]);
+        addIndex++;
+      }
+
+      Array.prototype.splice.apply(previous, spliceArgs);
+    });
+  };
+
+  function PathObserver(object, path) {
+    Observer.call(this);
+
+    this.object_ = object;
+    this.path_ = getPath(path);
+    this.directObserver_ = undefined;
+  }
+
+  PathObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    get path() {
+      return this.path_;
+    },
+
+    connect_: function() {
+      if (hasObserve)
+        this.directObserver_ = getObservedSet(this, this.object_);
+
+      this.check_(undefined, true);
+    },
+
+    disconnect_: function() {
+      this.value_ = undefined;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+    },
+
+    iterateObjects_: function(observe) {
+      this.path_.iterateObjects(this.object_, observe);
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValue = this.value_;
+      this.value_ = this.path_.getValueFrom(this.object_);
+      if (skipChanges || areSameValue(this.value_, oldValue))
+        return false;
+
+      this.report_([this.value_, oldValue, this]);
+      return true;
+    },
+
+    setValue: function(newValue) {
+      if (this.path_)
+        this.path_.setValueFrom(this.object_, newValue);
+    }
+  });
+
+  function CompoundObserver(reportChangesOnOpen) {
+    Observer.call(this);
+
+    this.reportChangesOnOpen_ = reportChangesOnOpen;
+    this.value_ = [];
+    this.directObserver_ = undefined;
+    this.observed_ = [];
+  }
+
+  var observerSentinel = {};
+
+  CompoundObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    connect_: function() {
+      if (hasObserve) {
+        var object;
+        var needsDirectObserver = false;
+        for (var i = 0; i < this.observed_.length; i += 2) {
+          object = this.observed_[i]
+          if (object !== observerSentinel) {
+            needsDirectObserver = true;
+            break;
+          }
+        }
+
+        if (needsDirectObserver)
+          this.directObserver_ = getObservedSet(this, object);
+      }
+
+      this.check_(undefined, !this.reportChangesOnOpen_);
+    },
+
+    disconnect_: function() {
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        if (this.observed_[i] === observerSentinel)
+          this.observed_[i + 1].close();
+      }
+      this.observed_.length = 0;
+      this.value_.length = 0;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+    },
+
+    addPath: function(object, path) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add paths once started.');
+
+      var path = getPath(path);
+      this.observed_.push(object, path);
+      if (!this.reportChangesOnOpen_)
+        return;
+      var index = this.observed_.length / 2 - 1;
+      this.value_[index] = path.getValueFrom(object);
+    },
+
+    addObserver: function(observer) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add observers once started.');
+
+      this.observed_.push(observerSentinel, observer);
+      if (!this.reportChangesOnOpen_)
+        return;
+      var index = this.observed_.length / 2 - 1;
+      this.value_[index] = observer.open(this.deliver, this);
+    },
+
+    startReset: function() {
+      if (this.state_ != OPENED)
+        throw Error('Can only reset while open');
+
+      this.state_ = RESETTING;
+      this.disconnect_();
+    },
+
+    finishReset: function() {
+      if (this.state_ != RESETTING)
+        throw Error('Can only finishReset after startReset');
+      this.state_ = OPENED;
+      this.connect_();
+
+      return this.value_;
+    },
+
+    iterateObjects_: function(observe) {
+      var object;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        object = this.observed_[i]
+        if (object !== observerSentinel)
+          this.observed_[i + 1].iterateObjects(object, observe)
+      }
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValues;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        var object = this.observed_[i];
+        var path = this.observed_[i+1];
+        var value;
+        if (object === observerSentinel) {
+          var observable = path;
+          value = this.state_ === UNOPENED ?
+              observable.open(this.deliver, this) :
+              observable.discardChanges();
+        } else {
+          value = path.getValueFrom(object);
+        }
+
+        if (skipChanges) {
+          this.value_[i / 2] = value;
+          continue;
+        }
+
+        if (areSameValue(value, this.value_[i / 2]))
+          continue;
+
+        oldValues = oldValues || [];
+        oldValues[i / 2] = this.value_[i / 2];
+        this.value_[i / 2] = value;
+      }
+
+      if (!oldValues)
+        return false;
+
+      // TODO(rafaelw): Having observed_ as the third callback arg here is
+      // pretty lame API. Fix.
+      this.report_([this.value_, oldValues, this.observed_]);
+      return true;
+    }
+  });
+
+  function identFn(value) { return value; }
+
+  function ObserverTransform(observable, getValueFn, setValueFn,
+                             dontPassThroughSet) {
+    this.callback_ = undefined;
+    this.target_ = undefined;
+    this.value_ = undefined;
+    this.observable_ = observable;
+    this.getValueFn_ = getValueFn || identFn;
+    this.setValueFn_ = setValueFn || identFn;
+    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this
+    // at the moment because of a bug in it's dependency tracking.
+    this.dontPassThroughSet_ = dontPassThroughSet;
+  }
+
+  ObserverTransform.prototype = {
+    open: function(callback, target) {
+      this.callback_ = callback;
+      this.target_ = target;
+      this.value_ =
+          this.getValueFn_(this.observable_.open(this.observedCallback_, this));
+      return this.value_;
+    },
+
+    observedCallback_: function(value) {
+      value = this.getValueFn_(value);
+      if (areSameValue(value, this.value_))
+        return;
+      var oldValue = this.value_;
+      this.value_ = value;
+      this.callback_.call(this.target_, this.value_, oldValue);
+    },
+
+    discardChanges: function() {
+      this.value_ = this.getValueFn_(this.observable_.discardChanges());
+      return this.value_;
+    },
+
+    deliver: function() {
+      return this.observable_.deliver();
+    },
+
+    setValue: function(value) {
+      value = this.setValueFn_(value);
+      if (!this.dontPassThroughSet_ && this.observable_.setValue)
+        return this.observable_.setValue(value);
+    },
+
+    close: function() {
+      if (this.observable_)
+        this.observable_.close();
+      this.callback_ = undefined;
+      this.target_ = undefined;
+      this.observable_ = undefined;
+      this.value_ = undefined;
+      this.getValueFn_ = undefined;
+      this.setValueFn_ = undefined;
+    }
+  }
+
+  var expectedRecordTypes = {
+    add: true,
+    update: true,
+    delete: true
+  };
+
+  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
+    var added = {};
+    var removed = {};
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      if (!expectedRecordTypes[record.type]) {
+        console.error('Unknown changeRecord type: ' + record.type);
+        console.error(record);
+        continue;
+      }
+
+      if (!(record.name in oldValues))
+        oldValues[record.name] = record.oldValue;
+
+      if (record.type == 'update')
+        continue;
+
+      if (record.type == 'add') {
+        if (record.name in removed)
+          delete removed[record.name];
+        else
+          added[record.name] = true;
+
+        continue;
+      }
+
+      // type = 'delete'
+      if (record.name in added) {
+        delete added[record.name];
+        delete oldValues[record.name];
+      } else {
+        removed[record.name] = true;
+      }
+    }
+
+    for (var prop in added)
+      added[prop] = object[prop];
+
+    for (var prop in removed)
+      removed[prop] = undefined;
+
+    var changed = {};
+    for (var prop in oldValues) {
+      if (prop in added || prop in removed)
+        continue;
+
+      var newValue = object[prop];
+      if (oldValues[prop] !== newValue)
+        changed[prop] = newValue;
+    }
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  function newSplice(index, removed, addedCount) {
+    return {
+      index: index,
+      removed: removed,
+      addedCount: addedCount
+    };
+  }
+
+  var EDIT_LEAVE = 0;
+  var EDIT_UPDATE = 1;
+  var EDIT_ADD = 2;
+  var EDIT_DELETE = 3;
+
+  function ArraySplice() {}
+
+  ArraySplice.prototype = {
+
+    // Note: This function is *based* on the computation of the Levenshtein
+    // "edit" distance. The one change is that "updates" are treated as two
+    // edits - not one. With Array splices, an update is really a delete
+    // followed by an add. By retaining this, we optimize for "keeping" the
+    // maximum array items in the original array. For example:
+    //
+    //   'xxxx123' -> '123yyyy'
+    //
+    // With 1-edit updates, the shortest path would be just to update all seven
+    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
+    // leaves the substring '123' intact.
+    calcEditDistances: function(current, currentStart, currentEnd,
+                                old, oldStart, oldEnd) {
+      // "Deletion" columns
+      var rowCount = oldEnd - oldStart + 1;
+      var columnCount = currentEnd - currentStart + 1;
+      var distances = new Array(rowCount);
+
+      // "Addition" rows. Initialize null column.
+      for (var i = 0; i < rowCount; i++) {
+        distances[i] = new Array(columnCount);
+        distances[i][0] = i;
+      }
+
+      // Initialize null row
+      for (var j = 0; j < columnCount; j++)
+        distances[0][j] = j;
+
+      for (var i = 1; i < rowCount; i++) {
+        for (var j = 1; j < columnCount; j++) {
+          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
+            distances[i][j] = distances[i - 1][j - 1];
+          else {
+            var north = distances[i - 1][j] + 1;
+            var west = distances[i][j - 1] + 1;
+            distances[i][j] = north < west ? north : west;
+          }
+        }
+      }
+
+      return distances;
+    },
+
+    // This starts at the final weight, and walks "backward" by finding
+    // the minimum previous weight recursively until the origin of the weight
+    // matrix.
+    spliceOperationsFromEditDistances: function(distances) {
+      var i = distances.length - 1;
+      var j = distances[0].length - 1;
+      var current = distances[i][j];
+      var edits = [];
+      while (i > 0 || j > 0) {
+        if (i == 0) {
+          edits.push(EDIT_ADD);
+          j--;
+          continue;
+        }
+        if (j == 0) {
+          edits.push(EDIT_DELETE);
+          i--;
+          continue;
+        }
+        var northWest = distances[i - 1][j - 1];
+        var west = distances[i - 1][j];
+        var north = distances[i][j - 1];
+
+        var min;
+        if (west < north)
+          min = west < northWest ? west : northWest;
+        else
+          min = north < northWest ? north : northWest;
+
+        if (min == northWest) {
+          if (northWest == current) {
+            edits.push(EDIT_LEAVE);
+          } else {
+            edits.push(EDIT_UPDATE);
+            current = northWest;
+          }
+          i--;
+          j--;
+        } else if (min == west) {
+          edits.push(EDIT_DELETE);
+          i--;
+          current = west;
+        } else {
+          edits.push(EDIT_ADD);
+          j--;
+          current = north;
+        }
+      }
+
+      edits.reverse();
+      return edits;
+    },
+
+    /**
+     * Splice Projection functions:
+     *
+     * A splice map is a representation of how a previous array of items
+     * was transformed into a new array of items. Conceptually it is a list of
+     * tuples of
+     *
+     *   <index, removed, addedCount>
+     *
+     * which are kept in ascending index order of. The tuple represents that at
+     * the |index|, |removed| sequence of items were removed, and counting forward
+     * from |index|, |addedCount| items were added.
+     */
+
+    /**
+     * Lacking individual splice mutation information, the minimal set of
+     * splices can be synthesized given the previous state and final state of an
+     * array. The basic approach is to calculate the edit distance matrix and
+     * choose the shortest path through it.
+     *
+     * Complexity: O(l * p)
+     *   l: The length of the current array
+     *   p: The length of the old array
+     */
+    calcSplices: function(current, currentStart, currentEnd,
+                          old, oldStart, oldEnd) {
+      var prefixCount = 0;
+      var suffixCount = 0;
+
+      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+      if (currentStart == 0 && oldStart == 0)
+        prefixCount = this.sharedPrefix(current, old, minLength);
+
+      if (currentEnd == current.length && oldEnd == old.length)
+        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
+
+      currentStart += prefixCount;
+      oldStart += prefixCount;
+      currentEnd -= suffixCount;
+      oldEnd -= suffixCount;
+
+      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
+        return [];
+
+      if (currentStart == currentEnd) {
+        var splice = newSplice(currentStart, [], 0);
+        while (oldStart < oldEnd)
+          splice.removed.push(old[oldStart++]);
+
+        return [ splice ];
+      } else if (oldStart == oldEnd)
+        return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+
+      var ops = this.spliceOperationsFromEditDistances(
+          this.calcEditDistances(current, currentStart, currentEnd,
+                                 old, oldStart, oldEnd));
+
+      var splice = undefined;
+      var splices = [];
+      var index = currentStart;
+      var oldIndex = oldStart;
+      for (var i = 0; i < ops.length; i++) {
+        switch(ops[i]) {
+          case EDIT_LEAVE:
+            if (splice) {
+              splices.push(splice);
+              splice = undefined;
+            }
+
+            index++;
+            oldIndex++;
+            break;
+          case EDIT_UPDATE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+          case EDIT_ADD:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+            break;
+          case EDIT_DELETE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+        }
+      }
+
+      if (splice) {
+        splices.push(splice);
+      }
+      return splices;
+    },
+
+    sharedPrefix: function(current, old, searchLength) {
+      for (var i = 0; i < searchLength; i++)
+        if (!this.equals(current[i], old[i]))
+          return i;
+      return searchLength;
+    },
+
+    sharedSuffix: function(current, old, searchLength) {
+      var index1 = current.length;
+      var index2 = old.length;
+      var count = 0;
+      while (count < searchLength && this.equals(current[--index1], old[--index2]))
+        count++;
+
+      return count;
+    },
+
+    calculateSplices: function(current, previous) {
+      return this.calcSplices(current, 0, current.length, previous, 0,
+                              previous.length);
+    },
+
+    equals: function(currentValue, previousValue) {
+      return currentValue === previousValue;
+    }
+  };
+
+  var arraySplice = new ArraySplice();
+
+  function calcSplices(current, currentStart, currentEnd,
+                       old, oldStart, oldEnd) {
+    return arraySplice.calcSplices(current, currentStart, currentEnd,
+                                   old, oldStart, oldEnd);
+  }
+
+  function intersect(start1, end1, start2, end2) {
+    // Disjoint
+    if (end1 < start2 || end2 < start1)
+      return -1;
+
+    // Adjacent
+    if (end1 == start2 || end2 == start1)
+      return 0;
+
+    // Non-zero intersect, span1 first
+    if (start1 < start2) {
+      if (end1 < end2)
+        return end1 - start2; // Overlap
+      else
+        return end2 - start2; // Contained
+    } else {
+      // Non-zero intersect, span2 first
+      if (end2 < end1)
+        return end2 - start1; // Overlap
+      else
+        return end1 - start1; // Contained
+    }
+  }
+
+  function mergeSplice(splices, index, removed, addedCount) {
+
+    var splice = newSplice(index, removed, addedCount);
+
+    var inserted = false;
+    var insertionOffset = 0;
+
+    for (var i = 0; i < splices.length; i++) {
+      var current = splices[i];
+      current.index += insertionOffset;
+
+      if (inserted)
+        continue;
+
+      var intersectCount = intersect(splice.index,
+                                     splice.index + splice.removed.length,
+                                     current.index,
+                                     current.index + current.addedCount);
+
+      if (intersectCount >= 0) {
+        // Merge the two splices
+
+        splices.splice(i, 1);
+        i--;
+
+        insertionOffset -= current.addedCount - current.removed.length;
+
+        splice.addedCount += current.addedCount - intersectCount;
+        var deleteCount = splice.removed.length +
+                          current.removed.length - intersectCount;
+
+        if (!splice.addedCount && !deleteCount) {
+          // merged splice is a noop. discard.
+          inserted = true;
+        } else {
+          var removed = current.removed;
+
+          if (splice.index < current.index) {
+            // some prefix of splice.removed is prepended to current.removed.
+            var prepend = splice.removed.slice(0, current.index - splice.index);
+            Array.prototype.push.apply(prepend, removed);
+            removed = prepend;
+          }
+
+          if (splice.index + splice.removed.length > current.index + current.addedCount) {
+            // some suffix of splice.removed is appended to current.removed.
+            var append = splice.removed.slice(current.index + current.addedCount - splice.index);
+            Array.prototype.push.apply(removed, append);
+          }
+
+          splice.removed = removed;
+          if (current.index < splice.index) {
+            splice.index = current.index;
+          }
+        }
+      } else if (splice.index < current.index) {
+        // Insert splice here.
+
+        inserted = true;
+
+        splices.splice(i, 0, splice);
+        i++;
+
+        var offset = splice.addedCount - splice.removed.length
+        current.index += offset;
+        insertionOffset += offset;
+      }
+    }
+
+    if (!inserted)
+      splices.push(splice);
+  }
+
+  function createInitialSplices(array, changeRecords) {
+    var splices = [];
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      switch(record.type) {
+        case 'splice':
+          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
+          break;
+        case 'add':
+        case 'update':
+        case 'delete':
+          if (!isIndex(record.name))
+            continue;
+          var index = toNumber(record.name);
+          if (index < 0)
+            continue;
+          mergeSplice(splices, index, [record.oldValue], 1);
+          break;
+        default:
+          console.error('Unexpected record type: ' + JSON.stringify(record));
+          break;
+      }
+    }
+
+    return splices;
+  }
+
+  function projectArraySplices(array, changeRecords) {
+    var splices = [];
+
+    createInitialSplices(array, changeRecords).forEach(function(splice) {
+      if (splice.addedCount == 1 && splice.removed.length == 1) {
+        if (splice.removed[0] !== array[splice.index])
+          splices.push(splice);
+
+        return
+      };
+
+      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,
+                                           splice.removed, 0, splice.removed.length));
+    });
+
+    return splices;
+  }
+
+  global.Observer = Observer;
+  global.Observer.runEOM_ = runEOM;
+  global.Observer.observerSentinel_ = observerSentinel; // for testing.
+  global.Observer.hasObjectObserve = hasObserve;
+  global.ArrayObserver = ArrayObserver;
+  global.ArrayObserver.calculateSplices = function(current, previous) {
+    return arraySplice.calculateSplices(current, previous);
+  };
+
+  global.ArraySplice = ArraySplice;
+  global.ObjectObserver = ObjectObserver;
+  global.PathObserver = PathObserver;
+  global.CompoundObserver = CompoundObserver;
+  global.Path = Path;
+  global.ObserverTransform = ObserverTransform;
+})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
diff --git a/pkg/template_binding/lib/js/patches_mdv.js b/pkg/template_binding/lib/js/patches_mdv.js
new file mode 100644
index 0000000..0c49bfb
--- /dev/null
+++ b/pkg/template_binding/lib/js/patches_mdv.js
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+(function(scope) {
+
+// inject style sheet
+var style = document.createElement('style');
+style.textContent = 'template {display: none !important;} /* injected by platform.js */';
+var head = document.querySelector('head');
+head.insertBefore(style, head.firstChild);
+
+// flush (with logging)
+var flushing;
+function flush() {
+  if (!flushing) {
+    flushing = true;
+    scope.endOfMicrotask(function() {
+      flushing = false;
+      logFlags.data && console.group('Platform.flush()');
+      scope.performMicrotaskCheckpoint();
+      logFlags.data && console.groupEnd();
+    });
+  }
+};
+
+// polling dirty checker
+// flush periodically if platform does not have object observe.
+if (!Observer.hasObjectObserve) {
+  var FLUSH_POLL_INTERVAL = 125;
+  window.addEventListener('WebComponentsReady', function() {
+    flush();
+    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
+  });
+} else {
+  // make flush a no-op when we have Object.observe
+  flush = function() {};
+}
+
+if (window.CustomElements && !CustomElements.useNative) {
+  var originalImportNode = Document.prototype.importNode;
+  Document.prototype.importNode = function(node, deep) {
+    var imported = originalImportNode.call(this, node, deep);
+    CustomElements.upgradeAll(imported);
+    return imported;
+  }
+}
+
+// exports
+scope.flush = flush;
+
+})(window.Platform);
+
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index 745f8c4..9edbd16 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,5 +1,5 @@
 name: template_binding
-version: 0.12.1
+version: 0.13.0
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: >
   Extends the capabilities of the HTML Template Element by enabling it to
@@ -7,8 +7,8 @@
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
   observe: ">=0.11.0 <0.13.0"
+  web_components: ">=0.7.0 <0.8.0"
 dev_dependencies:
-  web_components: ">=0.3.1 <0.4.0"
   unittest: ">=0.10.0 <0.11.0"
 environment:
   sdk: ">=1.2.0 <2.0.0"
diff --git a/pkg/template_binding/test/custom_element_bindings_test.html b/pkg/template_binding/test/custom_element_bindings_test.html
index cbaa772..6ba536a 100644
--- a/pkg/template_binding/test/custom_element_bindings_test.html
+++ b/pkg/template_binding/test/custom_element_bindings_test.html
@@ -11,6 +11,11 @@
      .unittest-error { background: #a11;}
   </style>
   <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/template_binding/js/observe.js"></script>
+  <script src="/packages/template_binding/js/node_bind.js"></script>
+  <script src="/packages/template_binding/js/microtask.js"></script>
+  <script src="/packages/template_binding/js/patches_mdv.js"></script>
+
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/template_binding/test/node_bind_test.html b/pkg/template_binding/test/node_bind_test.html
index da39fb8a..2123ee7 100644
--- a/pkg/template_binding/test/node_bind_test.html
+++ b/pkg/template_binding/test/node_bind_test.html
@@ -11,6 +11,10 @@
      .unittest-error { background: #a11;}
   </style>
   <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/template_binding/js/observe.js"></script>
+  <script src="/packages/template_binding/js/node_bind.js"></script>
+  <script src="/packages/template_binding/js/microtask.js"></script>
+  <script src="/packages/template_binding/js/patches_mdv.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/template_binding/test/template_binding_test.dart b/pkg/template_binding/test/template_binding_test.dart
index de7e8c3..fde463b 100644
--- a/pkg/template_binding/test/template_binding_test.dart
+++ b/pkg/template_binding/test/template_binding_test.dart
@@ -1369,14 +1369,22 @@
       expect(div.nodes.length, 4);
       expect('Hi, Fry', div.nodes[3].text);
 
-      div.nodes[2].attributes['ref'] = 'B';
+      // In IE 11, MutationObservers do not fire before setTimeout.
+      // So rather than using "then" to queue up the next test, we use a
+      // MutationObserver here to detect the change to "ref".
+      var done = new Completer();
+      new MutationObserver((mutations, observer) {
+        expect(div.nodes.length, 5);
+
+        expect('Hola, Fry', div.nodes[3].text);
+        expect('Hola, Leela', div.nodes[4].text);
+        done.complete();
+      }).observe(template, attributes: true, attributeFilter: ['ref']);
+
+      template.setAttribute('ref', 'B');
       model.add('Leela');
 
-    }).then(nextMicrotask).then((x) {
-      expect(div.nodes.length, 5);
-
-      expect('Hola, Fry', div.nodes[3].text);
-      expect('Hola, Leela', div.nodes[4].text);
+      return done.future;
     });
   });
 
diff --git a/pkg/template_binding/test/template_binding_test.html b/pkg/template_binding/test/template_binding_test.html
index 4c302c18..3aa899c 100644
--- a/pkg/template_binding/test/template_binding_test.html
+++ b/pkg/template_binding/test/template_binding_test.html
@@ -11,6 +11,10 @@
      .unittest-error { background: #a11;}
   </style>
   <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/template_binding/js/observe.js"></script>
+  <script src="/packages/template_binding/js/node_bind.js"></script>
+  <script src="/packages/template_binding/js/microtask.js"></script>
+  <script src="/packages/template_binding/js/patches_mdv.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/web_components/CHANGELOG.md b/pkg/web_components/CHANGELOG.md
index a79f7a0..837de65 100644
--- a/pkg/web_components/CHANGELOG.md
+++ b/pkg/web_components/CHANGELOG.md
@@ -1,6 +1,10 @@
-# changelog
-
-This file contains highlights of what changes on each version of this package.
+#### Pub version 0.7.0
+  * Updated to 0.4.0-5a7353d release, with same cherry pick as 0.6.0+1.
+  * Many features were moved into the polymer package, this package is now
+    purely focused on polyfills.
+  * Change Platform.deliverDeclarations to 
+    Platform.consumeDeclarations(callback).
+  * Cherry pick https://github.com/Polymer/ShadowDOM/pull/505 to fix mem leak.
 
 #### Pub version 0.6.0+1
   * Cherry pick https://github.com/Polymer/ShadowDOM/pull/500 to fix
diff --git a/pkg/web_components/lib/build.log b/pkg/web_components/lib/build.log
index 5cf5f42..62346a0 100644
--- a/pkg/web_components/lib/build.log
+++ b/pkg/web_components/lib/build.log
@@ -1,12 +1,12 @@
 BUILD LOG
 ---------
-Build Time: 2014-08-28T12:39:13
+Build Time: 2014-09-10T15:36:06
 
 NODEJS INFORMATION
 ==================
 nodejs: v0.10.29
-chai: 1.9.1
 grunt: 0.4.5
+chai: 1.9.1
 grunt-audit: 0.0.3
 grunt-concat-sourcemap: 0.4.3
 grunt-contrib-concat: 0.4.0
@@ -14,23 +14,20 @@
 grunt-karma: 0.8.3
 karma: 0.12.22
 karma-crbot-reporter: 0.0.4
-karma-safari-launcher: 0.1.1
-mocha: 1.21.4
+karma-firefox-launcher: 0.1.3
 karma-ie-launcher: 0.1.5
 karma-mocha: 0.1.9
-karma-firefox-launcher: 0.1.3
+karma-safari-launcher: 0.1.1
+mocha: 1.21.4
 
 REPO REVISIONS
 ==============
-CustomElements: 65bb151f33891864b28eee305bdf299653ef351c
-HTMLImports: 0d3133d19b35d899ef3e33fbd65ad62e0571d1d5
-NodeBind: f41e84f3deb2cad22eef89ded1072060f7b1b183
-ShadowDOM: 57232dc6d07dd921009679dfbab622b52174df80
-TemplateBinding: f15094216a6b3f64a6d6b0f017b6bd7576b8b44e
-WeakMap: 6662df5cb7146707238b08e7a65cf70056ae516a
-observe-js: ca7b6ba385006f200c7ec3537c7730710e428c60
-platform-dev: fe549bc7f05ec668bc496108958eaee0bd174a06
+CustomElements: c2605585e079b042e5c0fba84bc1d25f7b530ae9
+HTMLImports: d0c8d08f23ed407288bcac385e19747a3fbeba96
+ShadowDOM: 481f9adb761c2226ccd94a35140a7d6f3830257d
+URL: 35e0e6aaab5979d277afa4822a2776a7fb7562ba
+platform-dev: 5a7353db53048b8ab4caa6279a56de7d1097d824
 
 BUILD HASHES
 ============
-build/platform.js: a15f487ef6424420af4d2e64f0f5d5740306b691
\ No newline at end of file
+build/platform.js: f590b5e657640112e98eb5d428885f429789d913
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
index 6eea868..c4009c6 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -112,6 +112,9 @@
   })();
 }
 
+// select ShadowDOM impl

+if (Platform.flags.shadow) {

+
 // Copyright 2012 Google Inc.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
@@ -1840,9 +1843,6 @@
   global.ObserverTransform = ObserverTransform;
 })(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
 
-// 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.
@@ -2327,7 +2327,7 @@
   var globalMutationObservers = [];
   var isScheduled = false;
 
-  function scheduleCallback(observer) {
+  function scheduleCallback() {
     if (isScheduled)
       return;
     setEndOfMicrotask(notifyObservers);
@@ -2338,21 +2338,25 @@
   function notifyObservers() {
     isScheduled = false;
 
-    do {
-      var notifyList = globalMutationObservers.slice();
-      var anyNonEmpty = false;
+    while (globalMutationObservers.length) {
+      var notifyList = globalMutationObservers;
+      globalMutationObservers = [];
+
+      // Deliver changes in birth order of the MutationObservers.
+      notifyList.sort(function(x, y) { return x.uid_ - y.uid_; });
+
       for (var i = 0; i < notifyList.length; i++) {
         var mo = notifyList[i];
         var queue = mo.takeRecords();
         removeTransientObserversFor(mo);
         if (queue.length) {
           mo.callback_(queue, mo);
-          anyNonEmpty = true;
         }
       }
-    } while (anyNonEmpty);
+    }
   }
 
+
   /**
    * @param {string} type
    * @param {Node} target
@@ -2458,7 +2462,7 @@
       }
     }
 
-    var anyRecordsEnqueued = false;
+    var anyObserversEnqueued = false;
 
     // 4.
     for (var uid in interestedObservers) {
@@ -2492,12 +2496,14 @@
         record.oldValue = associatedStrings[uid];
 
       // 8.
+      if (!observer.records_.length) {
+        globalMutationObservers.push(observer);
+        anyObserversEnqueued = true;
+      }
       observer.records_.push(record);
-
-      anyRecordsEnqueued = true;
     }
 
-    if (anyRecordsEnqueued)
+    if (anyObserversEnqueued)
       scheduleCallback();
   }
 
@@ -2561,9 +2567,6 @@
     this.nodes_ = [];
     this.records_ = [];
     this.uid_ = ++uidCounter;
-
-    // This will leak. There is no way to implement this without WeakRefs :'(
-    globalMutationObservers.push(this);
   }
 
   MutationObserver.prototype = {
@@ -8512,27 +8515,33 @@
           cssText += this.scopeRules(rule.cssRules, scopeSelector);
           cssText += '\n}\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.
+          // KEYFRAMES_RULE in IE throws when we query cssText
+          // when it contains a -webkit- property.
+          // if this happens, we fallback to constructing the rule
+          // from the CSSRuleSet
+          // https://connect.microsoft.com/IE/feedbackdetail/view/955703/accessing-csstext-of-a-keyframe-rule-that-contains-a-webkit-property-via-cssom-generates-exception
           try {
             if (rule.cssText) {
               cssText += rule.cssText + '\n\n';
             }
           } catch(x) {
-            // squelch
+            if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {
+              cssText += this.ieSafeCssTextFromKeyFrameRule(rule);
+            }
           }
         }
       }, this);
     }
     return cssText;
   },
+  ieSafeCssTextFromKeyFrameRule: function(rule) {
+    var cssText = '@keyframes ' + rule.name + ' {';
+    Array.prototype.forEach.call(rule.cssRules, function(rule) {
+      cssText += ' ' + rule.keyText + ' {' + rule.style.cssText + '}';
+    });
+    cssText += ' }';
+    return cssText;
+  },
   scopeSelector: function(selector, scopeSelector, strict) {
     var r = [], parts = selector.split(',');
     parts.forEach(function(p) {
@@ -8755,7 +8764,7 @@
     var style = cssTextToStyle(cssText);
     inFrame(function(doc) {
       doc.head.appendChild(style.impl);
-      rules = style.sheet.cssRules;
+      rules = Array.prototype.slice.call(style.sheet.cssRules, 0);
       callback(rules);
     });
   } else {
@@ -8836,11 +8845,10 @@
         }
         if (elt.__resource) {
           style = elt.ownerDocument.createElement('style');
-          style.textContent = urlResolver.resolveCssText(
-              elt.__resource, elt.href);
-        } else {
-          urlResolver.resolveStyle(style);  
+          style.textContent = elt.__resource;
         }
+        // relay on HTMLImports for path fixup
+        HTMLImports.path.resolveUrlsInStyle(style);
         style.textContent = ShadowCSS.shimStyle(style);
         style.removeAttribute(SHIM_ATTRIBUTE, '');
         style.setAttribute(SHIMMED_ATTRIBUTE, '');
@@ -8906,23 +8914,6 @@
     }
   });
 
-  Platform.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;
-  };
-
 })(window.Platform);
 
 }
@@ -9530,42 +9521,6 @@
   };
 }
 
-// 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);
 
 /*
@@ -9581,46 +9536,6 @@
 
   '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) {
@@ -9658,19 +9573,6 @@
     })();
   }
 
-  // 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
@@ -9680,17 +9582,21 @@
   var elementDeclarations = [];
 
   var polymerStub = function(name, dictionary) {
+    Array.prototype.push.call(arguments, document._currentScript);
     elementDeclarations.push(arguments);
-  }
+  };
   window.Polymer = polymerStub;
 
   // deliver queued delcarations
-  scope.deliverDeclarations = function() {
-    scope.deliverDeclarations = function() {
+  scope.consumeDeclarations = function(callback) {
+    scope.consumeDeclarations = function() {
      throw 'Possible attempt to load Polymer twice';
     };
-    return elementDeclarations;
-  }
+    if (callback) {
+      callback(elementDeclarations);
+    }
+    elementDeclarations = null;
+  };
 
   // Once DOMContent has loaded, any main document scripts that depend on
   // Polymer() should have run. Calling Polymer() now is an error until
@@ -9705,485 +9611,9 @@
     }
   });
 
-  // exports
-  scope.createDOM = createDOM;
-
 })(window.Platform);
 
 /*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-// poor man's adapter for template.content on various platform scenarios
-(function(scope) {
-  scope.templateContent = scope.templateContent || function(inTemplate) {
-    return inTemplate.content;
-  };
-})(window.Platform);
-
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-  
-  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 (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-
-  // TODO(sorvell): It's desireable to provide a default stylesheet 
-  // that's convenient for styling unresolved elements, but
-  // it's cumbersome to have to include this manually in every page.
-  // It would make sense to put inside some HTMLImport but 
-  // the HTMLImports polyfill does not allow loading of stylesheets 
-  // that block rendering. Therefore this injection is tolerated here.
-
-  var style = document.createElement('style');
-  style.textContent = ''
-      + 'body {'
-      + 'transition: opacity ease-in 0.2s;' 
-      + ' } \n'
-      + 'body[unresolved] {'
-      + 'opacity: 0; display: block; overflow: hidden;' 
-      + ' } \n'
-      ;
-  var head = document.querySelector('head');
-  head.insertBefore(style, head.firstChild);
-
-})(Platform);
-
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-
-  function withDependencies(task, depends) {
-    depends = depends || [];
-    if (!depends.map) {
-      depends = [depends];
-    }
-    return task.apply(this, depends.map(marshal));
-  }
-
-  function module(name, dependsOrFactory, moduleFactory) {
-    var module;
-    switch (arguments.length) {
-      case 0:
-        return;
-      case 1:
-        module = null;
-        break;
-      case 2:
-        // dependsOrFactory is `factory` in this case
-        module = dependsOrFactory.apply(this);
-        break;
-      default:
-        // dependsOrFactory is `depends` in this case
-        module = withDependencies(moduleFactory, dependsOrFactory);
-        break;
-    }
-    modules[name] = module;
-  };
-
-  function marshal(name) {
-    return modules[name];
-  }
-
-  var modules = {};
-
-  function using(depends, task) {
-    HTMLImports.whenImportsReady(function() {
-      withDependencies(task, depends);
-    });
-  };
-
-  // exports
-
-  scope.marshal = marshal;
-  // `module` confuses commonjs detectors
-  scope.modularize = module;
-  scope.using = using;
-
-})(window);
-
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-
-var iterations = 0;
-var callbacks = [];
-var twiddle = document.createTextNode('');
-
-function endOfMicrotask(callback) {
-  twiddle.textContent = iterations++;
-  callbacks.push(callback);
-}
-
-function atEndOfMicrotask() {
-  while (callbacks.length) {
-    callbacks.shift()();
-  }
-}
-
-new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)
-  .observe(twiddle, {characterData: true})
-  ;
-
-// exports
-
-scope.endOfMicrotask = endOfMicrotask;
-
-})(Platform);
-
-
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-
-var urlResolver = {
-  resolveDom: function(root, url) {
-    url = url || root.ownerDocument.baseURI;
-    this.resolveAttributes(root, url);
-    this.resolveStyles(root, url);
-    // handle template.content
-    var templates = root.querySelectorAll('template');
-    if (templates) {
-      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {
-        if (t.content) {
-          this.resolveDom(t.content, url);
-        }
-      }
-    }
-  },
-  resolveTemplate: function(template) {
-    this.resolveDom(template.content, template.ownerDocument.baseURI);
-  },
-  resolveStyles: function(root, url) {
-    var styles = root.querySelectorAll('style');
-    if (styles) {
-      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {
-        this.resolveStyle(s, url);
-      }
-    }
-  },
-  resolveStyle: function(style, url) {
-    url = url || style.ownerDocument.baseURI;
-    style.textContent = this.resolveCssText(style.textContent, url);
-  },
-  resolveCssText: function(cssText, baseUrl, keepAbsolute) {
-    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);
-    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);
-  },
-  resolveAttributes: function(root, url) {
-    if (root.hasAttributes && root.hasAttributes()) {
-      this.resolveElementAttributes(root, url);
-    }
-    // search for attributes that host urls
-    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);
-    if (nodes) {
-      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {
-        this.resolveElementAttributes(n, url);
-      }
-    }
-  },
-  resolveElementAttributes: function(node, url) {
-    url = url || node.ownerDocument.baseURI;
-    URL_ATTRS.forEach(function(v) {
-      var attr = node.attributes[v];
-      var value = attr && attr.value;
-      var replacement;
-      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {
-        if (v === 'style') {
-          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);
-        } else {
-          replacement = resolveRelativeUrl(url, value);
-        }
-        attr.value = replacement;
-      }
-    });
-  }
-};
-
-var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
-var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-var URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];
-var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
-var URL_TEMPLATE_SEARCH = '{{.*}}';
-
-function replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {
-  return cssText.replace(regexp, function(m, pre, url, post) {
-    var urlPath = url.replace(/["']/g, '');
-    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);
-    return pre + '\'' + urlPath + '\'' + post;
-  });
-}
-
-function resolveRelativeUrl(baseUrl, url, keepAbsolute) {
-  // do not resolve '/' absolute urls
-  if (url && url[0] === '/') {
-    return url;
-  }
-  var u = new URL(url, baseUrl);
-  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);
-}
-
-function makeDocumentRelPath(url) {
-  var root = new URL(document.baseURI);
-  var u = new URL(url, root);
-  if (u.host === root.host && u.port === root.port &&
-      u.protocol === root.protocol) {
-    return makeRelPath(root, u);
-  } else {
-    return url;
-  }
-}
-
-// make a relative path from source to target
-function makeRelPath(sourceUrl, targetUrl) {
-  var source = sourceUrl.pathname;
-  var target = targetUrl.pathname;
-  var s = source.split('/');
-  var t = target.split('/');
-  while (s.length && s[0] === t[0]){
-    s.shift();
-    t.shift();
-  }
-  for (var i = 0, l = s.length - 1; i < l; i++) {
-    t.unshift('..');
-  }
-  return t.join('/') + targetUrl.search + targetUrl.hash;
-}
-
-// exports
-scope.urlResolver = urlResolver;
-
-})(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.
@@ -10739,179 +10169,200 @@
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 window.HTMLImports = window.HTMLImports || {flags:{}};
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */(function(scope) {
-
-var hasNative = ('import' in document.createElement('link'));
-var useNative = hasNative;
-
-isIE = /Trident/.test(navigator.userAgent);
-
-// TODO(sorvell): SD polyfill intrusion
-var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
-var wrap = function(node) {
-  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
-};
-var mainDoc = wrap(document);
-    
-// NOTE: We cannot polyfill document.currentScript because it's not possible
-// both to override and maintain the ability to capture the native value;
-// therefore we choose to expose _currentScript both when native imports
-// and the polyfill are in use.
-var currentScriptDescriptor = {
-  get: function() {
-    var script = HTMLImports.currentScript || document.currentScript ||
-        // NOTE: only works when called in synchronously executing code.
-        // readyState should check if `loading` but IE10 is 
-        // interactive when scripts run so we cheat.
-        (document.readyState !== 'complete' ? 
-        document.scripts[document.scripts.length - 1] : null);
-    return wrap(script);
-  },
-  configurable: true
-};
-
-Object.defineProperty(document, '_currentScript', currentScriptDescriptor);
-Object.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);
-
-// call a callback when all HTMLImports in the document at call (or at least
-//  document ready) time have loaded.
-// 1. ensure the document is in a ready state (has dom), then 
-// 2. watch for loading of imports and call callback when done
-function 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 = 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) {
-      callback && 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();
-  }
-}
-
-// NOTE: test for native imports loading is based on explicitly watching
-// all imports (see below).
-function isImportLoaded(link) {
-  return useNative ? link.__loaded : link.__importParsed;
-}
-
-// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded
-// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007
-// and should be removed when this bug is addressed.
-if (useNative) {
-  new MutationObserver(function(mxns) {
-    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {
-      if (m.addedNodes) {
-        handleImports(m.addedNodes);
-      }
-    }
-  }).observe(document.head, {childList: true});
-
-  function handleImports(nodes) {
-    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
-      if (isImport(n)) {
-        handleImport(n);  
-      }
-    }
-  }
-
-  function isImport(element) {
-    return element.localName === 'link' && element.rel === 'import';
-  }
-
-  function handleImport(element) {
-    var loaded = element.import;
-    if (loaded) {
-      markTargetLoaded({target: element});
-    } else {
-      element.addEventListener('load', markTargetLoaded);
-      element.addEventListener('error', markTargetLoaded);
-    }
-  }
-
-  function markTargetLoaded(event) {
-    event.target.__loaded = true;
-  }
-
-}
-
-// 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.
-whenImportsReady(function() {
-  HTMLImports.ready = true;
-  HTMLImports.readyTime = new Date().getTime();
-  mainDoc.dispatchEvent(
-    new CustomEvent('HTMLImportsLoaded', {bubbles: true})
-  );
-});
-
-// exports
-scope.useNative = useNative;
-scope.isImportLoaded = isImportLoaded;
-scope.whenReady = whenImportsReady;
-scope.isIE = isIE;
-
-// deprecated
-scope.whenImportsReady = whenImportsReady;
-
+/*

+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.

+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt

+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt

+ * Code distributed by Google as part of the polymer project is also

+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt

+ */

+

+(function(scope) {

+

+var hasNative = ('import' in document.createElement('link'));

+var useNative = hasNative;

+

+isIE = /Trident/.test(navigator.userAgent);

+

+// TODO(sorvell): SD polyfill intrusion

+var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);

+var wrap = function(node) {

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

+};

+var mainDoc = wrap(document);

+    

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

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

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

+// and the polyfill are in use.

+var currentScriptDescriptor = {

+  get: function() {

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

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

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

+        // interactive when scripts run so we cheat.

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

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

+    return wrap(script);

+  },

+  configurable: true

+};

+

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

+Object.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);

+

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

+//  document ready) time have loaded.

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

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

+function 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 = isIE ? 'complete' : 'interactive';

+var READY_EVENT = 'readystatechange';

+function isDocumentReady(doc) {

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

+      doc.readyState === requiredReadyState);

+}

+

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

+function whenDocumentReady(callback, doc) {

+  if (!isDocumentReady(doc)) {

+    var checkReady = function() {

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

+          doc.readyState === requiredReadyState) {

+        doc.removeEventListener(READY_EVENT, checkReady);

+        whenDocumentReady(callback, doc);

+      }

+    };

+    doc.addEventListener(READY_EVENT, checkReady);

+  } else if (callback) {

+    callback();

+  }

+}

+

+function markTargetLoaded(event) {

+  event.target.__loaded = true;

+}

+

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

+function watchImportsLoad(callback, doc) {

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

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

+  function checkDone(d) { 

+    if (loaded == l) {

+      callback && callback();

+    }

+  }

+  function loadedImport(e) {

+    markTargetLoaded(e);

+    loaded++;

+    checkDone();

+  }

+  if (l) {

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

+      if (isImportLoaded(imp)) {

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

+      } else {

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

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

+      }

+    }

+  } else {

+    checkDone();

+  }

+}

+

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

+// all imports (see below).

+function isImportLoaded(link) {

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

+}

+

+// TODO(sorvell): Workaround for 

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

+// this bug is addressed.

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

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

+// imports for loading.

+//

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

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

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

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

+if (useNative) {

+  new MutationObserver(function(mxns) {

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

+      if (m.addedNodes) {

+        handleImports(m.addedNodes);

+      }

+    }

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

+

+  function handleImports(nodes) {

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

+      if (isImport(n)) {

+        handleImport(n);  

+      }

+    }

+  }

+

+  function isImport(element) {

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

+  }

+

+  function handleImport(element) {

+    var loaded = element.import;

+    if (loaded) {

+      markTargetLoaded({target: element});

+    } else {

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

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

+    }

+  }

+

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

+  // when this script is run.

+  (function() {

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

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

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

+        handleImport(imp);

+      }

+    }

+  })();

+

+}

+

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

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

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

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

+whenImportsReady(function() {

+  HTMLImports.ready = true;

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

+  mainDoc.dispatchEvent(

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

+  );

+});

+

+// exports

+scope.useNative = useNative;

+scope.isImportLoaded = isImportLoaded;

+scope.whenReady = whenImportsReady;

+scope.isIE = isIE;

+

+// deprecated

+scope.whenImportsReady = whenImportsReady;

+

 })(window.HTMLImports);
-
 /*
  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
  * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
@@ -12730,110 +12181,27 @@
  */
 
 (function(scope) {
-  var endOfMicrotask = scope.endOfMicrotask;
 
-  // Generic url loader
-  function Loader(regex) {
-    this.cache = Object.create(null);
-    this.map = Object.create(null);
-    this.requests = 0;
-    this.regex = regex;
-  }
-  Loader.prototype = {
+  // TODO(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.
 
-    // 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);
+  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);
 
-      // every call to process returns all the text this loader has ever received
-      var done = callback.bind(null, this.map);
-      this.fetch(matches, done);
-    },
-    // build a mapping of url -> text from matches
-    fetch: function(matches, callback) {
-      var inflight = matches.length;
-
-      // return early if there is no fetching to be done
-      if (!inflight) {
-        return callback();
-      }
-
-      // wait for all subrequests to return
-      var done = function() {
-        if (--inflight === 0) {
-          callback();
-        }
-      };
-
-      // start fetching all subrequests
-      var m, req, url;
-      for (var i = 0; i < inflight; i++) {
-        m = matches[i];
-        url = m.url;
-        req = this.cache[url];
-        // if this url has already been requested, skip requesting it again
-        if (!req) {
-          req = this.xhr(url);
-          req.match = m;
-          this.cache[url] = req;
-        }
-        // wait for the request to process its subrequests
-        req.wait(done);
-      }
-    },
-    handleXhr: function(request) {
-      var match = request.match;
-      var url = match.url;
-
-      // handle errors with an empty string
-      var response = request.response || request.responseText || '';
-      this.map[url] = response;
-      this.fetch(this.extractUrls(response, url), request.resolve);
-    },
-    xhr: function(url) {
-      this.requests++;
-      var request = new XMLHttpRequest();
-      request.open('GET', url, true);
-      request.send();
-      request.onerror = request.onload = this.handleXhr.bind(this, request);
-
-      // queue of tasks to run after XHR returns
-      request.pending = [];
-      request.resolve = function() {
-        var pending = request.pending;
-        for(var i = 0; i < pending.length; i++) {
-          pending[i]();
-        }
-        request.pending = null;
-      };
-
-      // if we have already resolved, pending is null, async call the callback
-      request.wait = function(fn) {
-        if (request.pending) {
-          request.pending.push(fn);
-        } else {
-          endOfMicrotask(fn);
-        }
-      };
-
-      return request;
-    }
-  };
-
-  scope.Loader = Loader;
-})(window.Platform);
+})(Platform);
 
 /*
  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
@@ -12846,1755 +12214,53 @@
 
 (function(scope) {
 
-var urlResolver = scope.urlResolver;
-var Loader = scope.Loader;
-
-function StyleResolver() {
-  this.loader = new Loader(this.regex);
-}
-StyleResolver.prototype = {
-  regex: /@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,
-  // Recursively replace @imports with the text at that url
-  resolve: function(text, url, callback) {
-    var done = function(map) {
-      callback(this.flatten(text, url, map));
-    }.bind(this);
-    this.loader.process(text, url, done);
-  },
-  // resolve the textContent of a style node
-  resolveNode: function(style, url, callback) {
-    var text = style.textContent;
-    var done = function(text) {
-      style.textContent = text;
-      callback(style);
-    };
-    this.resolve(text, url, done);
-  },
-  // flatten all the @imports to text
-  flatten: function(text, base, map) {
-    var matches = this.loader.extractUrls(text, base);
-    var match, url, intermediate;
-    for (var i = 0; i < matches.length; i++) {
-      match = matches[i];
-      url = match.url;
-      // resolve any css text to be relative to the importer, keep absolute url
-      intermediate = urlResolver.resolveCssText(map[url], url, true);
-      // flatten intermediate @imports
-      intermediate = this.flatten(intermediate, base, map);
-      text = text.replace(match.matched, intermediate);
+  function withDependencies(task, depends) {
+    depends = depends || [];
+    if (!depends.map) {
+      depends = [depends];
     }
-    return text;
-  },
-  loadStyles: function(styles, base, callback) {
-    var loaded=0, l = styles.length;
-    // called in the context of the style
-    function loadedStyle(style) {
-      loaded++;
-      if (loaded === l && callback) {
-        callback();
-      }
-    }
-    for (var i=0, s; (i<l) && (s=styles[i]); i++) {
-      this.resolveNode(s, base, loadedStyle);
-    }
-  }
-};
-
-var styleResolver = new StyleResolver();
-
-// exports
-scope.styleResolver = styleResolver;
-
-})(window.Platform);
-
-// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-// Code distributed by Google as part of the polymer project is also
-// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-
-(function(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;
+    return task.apply(this, depends.map(marshal));
   }
 
-  Node.prototype.bind = function(name, observable) {
-    console.error('Unhandled binding to Node: ', this, name, observable);
-  };
-
-  Node.prototype.bindFinished = function() {};
-
-  function updateBindings(node, name, binding) {
-    var bindings = node.bindings_;
-    if (!bindings)
-      bindings = node.bindings_ = {};
-
-    if (bindings[name])
-      binding[name].close();
-
-    return bindings[name] = binding;
-  }
-
-  function returnBinding(node, name, binding) {
-    return binding;
-  }
-
-  function sanitizeValue(value) {
-    return value == null ? '' : value;
-  }
-
-  function updateText(node, value) {
-    node.data = sanitizeValue(value);
-  }
-
-  function textBinding(node) {
-    return function(value) {
-      return updateText(node, value);
-    };
-  }
-
-  var maybeUpdateBindings = returnBinding;
-
-  Object.defineProperty(Platform, 'enableBindingsReflection', {
-    get: function() {
-      return maybeUpdateBindings === updateBindings;
-    },
-    set: function(enable) {
-      maybeUpdateBindings = enable ? updateBindings : returnBinding;
-      return enable;
-    },
-    configurable: true
-  });
-
-  Text.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'textContent')
-      return Node.prototype.bind.call(this, name, value, oneTime);
-
-    if (oneTime)
-      return updateText(this, value);
-
-    var observable = value;
-    updateText(this, observable.open(textBinding(this)));
-    return maybeUpdateBindings(this, name, observable);
-  }
-
-  function updateAttribute(el, name, conditional, value) {
-    if (conditional) {
-      if (value)
-        el.setAttribute(name, '');
-      else
-        el.removeAttribute(name);
-      return;
-    }
-
-    el.setAttribute(name, sanitizeValue(value));
-  }
-
-  function attributeBinding(el, name, conditional) {
-    return function(value) {
-      updateAttribute(el, name, conditional, value);
-    };
-  }
-
-  Element.prototype.bind = function(name, value, oneTime) {
-    var conditional = name[name.length - 1] == '?';
-    if (conditional) {
-      this.removeAttribute(name);
-      name = name.slice(0, -1);
-    }
-
-    if (oneTime)
-      return updateAttribute(this, name, conditional, value);
-
-
-    var observable = value;
-    updateAttribute(this, name, conditional,
-        observable.open(attributeBinding(this, name, conditional)));
-
-    return maybeUpdateBindings(this, name, observable);
-  };
-
-  var checkboxEventType;
-  (function() {
-    // Attempt to feature-detect which event (change or click) is fired first
-    // for checkboxes.
-    var div = document.createElement('div');
-    var checkbox = div.appendChild(document.createElement('input'));
-    checkbox.setAttribute('type', 'checkbox');
-    var first;
-    var count = 0;
-    checkbox.addEventListener('click', function(e) {
-      count++;
-      first = first || 'click';
-    });
-    checkbox.addEventListener('change', function() {
-      count++;
-      first = first || 'change';
-    });
-
-    var event = document.createEvent('MouseEvent');
-    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
-        false, false, false, 0, null);
-    checkbox.dispatchEvent(event);
-    // WebKit/Blink don't fire the change event if the element is outside the
-    // document, so assume 'change' for that case.
-    checkboxEventType = count == 1 ? 'change' : first;
-  })();
-
-  function getEventForInputType(element) {
-    switch (element.type) {
-      case 'checkbox':
-        return checkboxEventType;
-      case 'radio':
-      case 'select-multiple':
-      case 'select-one':
-        return 'change';
-      case 'range':
-        if (/Trident|MSIE/.test(navigator.userAgent))
-          return 'change';
-      default:
-        return 'input';
-    }
-  }
-
-  function updateInput(input, property, value, santizeFn) {
-    input[property] = (santizeFn || sanitizeValue)(value);
-  }
-
-  function inputBinding(input, property, santizeFn) {
-    return function(value) {
-      return updateInput(input, property, value, santizeFn);
-    }
-  }
-
-  function noop() {}
-
-  function bindInputEvent(input, property, observable, postEventFn) {
-    var eventType = getEventForInputType(input);
-
-    function eventHandler() {
-      observable.setValue(input[property]);
-      observable.discardChanges();
-      (postEventFn || noop)(input);
-      Platform.performMicrotaskCheckpoint();
-    }
-    input.addEventListener(eventType, eventHandler);
-
-    return {
-      close: function() {
-        input.removeEventListener(eventType, eventHandler);
-        observable.close();
-      },
-
-      observable_: observable
-    }
-  }
-
-  function booleanSanitize(value) {
-    return Boolean(value);
-  }
-
-  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
-  // Returns an array containing all radio buttons other than |element| that
-  // have the same |name|, either in the form that |element| belongs to or,
-  // if no form, in the document tree to which |element| belongs.
-  //
-  // This implementation is based upon the HTML spec definition of a
-  // "radio button group":
-  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
-  //
-  function getAssociatedRadioButtons(element) {
-    if (element.form) {
-      return filter(element.form.elements, function(el) {
-        return el != element &&
-            el.tagName == 'INPUT' &&
-            el.type == 'radio' &&
-            el.name == element.name;
-      });
-    } else {
-      var treeScope = getTreeScope(element);
-      if (!treeScope)
-        return [];
-      var radios = treeScope.querySelectorAll(
-          'input[type="radio"][name="' + element.name + '"]');
-      return filter(radios, function(el) {
-        return el != element && !el.form;
-      });
-    }
-  }
-
-  function checkedPostEvent(input) {
-    // Only the radio button that is getting checked gets an event. We
-    // therefore find all the associated radio buttons and update their
-    // check binding manually.
-    if (input.tagName === 'INPUT' &&
-        input.type === 'radio') {
-      getAssociatedRadioButtons(input).forEach(function(radio) {
-        var checkedBinding = radio.bindings_.checked;
-        if (checkedBinding) {
-          // Set the value directly to avoid an infinite call stack.
-          checkedBinding.observable_.setValue(false);
-        }
-      });
-    }
-  }
-
-  HTMLInputElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value' && name !== 'checked')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute(name);
-    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
-    var postEventFn = name == 'checked' ? checkedPostEvent : noop;
-
-    if (oneTime)
-      return updateInput(this, name, value, sanitizeFn);
-
-
-    var observable = value;
-    var binding = bindInputEvent(this, name, observable, postEventFn);
-    updateInput(this, name,
-                observable.open(inputBinding(this, name, sanitizeFn)),
-                sanitizeFn);
-
-    // Checkboxes may need to update bindings of other checkboxes.
-    return updateBindings(this, name, binding);
-  }
-
-  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute('value');
-
-    if (oneTime)
-      return updateInput(this, 'value', value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, 'value', observable);
-    updateInput(this, 'value',
-                observable.open(inputBinding(this, 'value', sanitizeValue)));
-    return maybeUpdateBindings(this, name, binding);
-  }
-
-  function updateOption(option, value) {
-    var parentNode = option.parentNode;;
-    var select;
-    var selectBinding;
-    var oldValue;
-    if (parentNode instanceof HTMLSelectElement &&
-        parentNode.bindings_ &&
-        parentNode.bindings_.value) {
-      select = parentNode;
-      selectBinding = select.bindings_.value;
-      oldValue = select.value;
-    }
-
-    option.value = sanitizeValue(value);
-
-    if (select && select.value != oldValue) {
-      selectBinding.observable_.setValue(select.value);
-      selectBinding.observable_.discardChanges();
-      Platform.performMicrotaskCheckpoint();
-    }
-  }
-
-  function optionBinding(option) {
-    return function(value) {
-      updateOption(option, value);
-    }
-  }
-
-  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute('value');
-
-    if (oneTime)
-      return updateOption(this, value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, 'value', observable);
-    updateOption(this, observable.open(optionBinding(this)));
-    return maybeUpdateBindings(this, name, binding);
-  }
-
-  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
-    if (name === 'selectedindex')
-      name = 'selectedIndex';
-
-    if (name !== 'selectedIndex' && name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute(name);
-
-    if (oneTime)
-      return updateInput(this, name, value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, name, observable);
-    updateInput(this, name,
-                observable.open(inputBinding(this, name)));
-
-    // Option update events may need to access select bindings.
-    return updateBindings(this, name, binding);
-  }
-})(this);
-
-// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-// Code distributed by Google as part of the polymer project is also
-// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-
-(function(global) {
-  'use strict';
-
-  function assert(v) {
-    if (!v)
-      throw new Error('Assertion failed');
-  }
-
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-
-  function getFragmentRoot(node) {
-    var p;
-    while (p = node.parentNode) {
-      node = p;
-    }
-
-    return node;
-  }
-
-  function searchRefId(node, id) {
-    if (!id)
-      return;
-
-    var ref;
-    var selector = '#' + id;
-    while (!ref) {
-      node = getFragmentRoot(node);
-
-      if (node.protoContent_)
-        ref = node.protoContent_.querySelector(selector);
-      else if (node.getElementById)
-        ref = node.getElementById(id);
-
-      if (ref || !node.templateCreator_)
-        break
-
-      node = node.templateCreator_;
-    }
-
-    return ref;
-  }
-
-  function getInstanceRoot(node) {
-    while (node.parentNode) {
-      node = node.parentNode;
-    }
-    return node.templateCreator_ ? node : null;
-  }
-
-  var Map;
-  if (global.Map && typeof global.Map.prototype.forEach === 'function') {
-    Map = global.Map;
-  } else {
-    Map = function() {
-      this.keys = [];
-      this.values = [];
-    };
-
-    Map.prototype = {
-      set: function(key, value) {
-        var index = this.keys.indexOf(key);
-        if (index < 0) {
-          this.keys.push(key);
-          this.values.push(value);
-        } else {
-          this.values[index] = value;
-        }
-      },
-
-      get: function(key) {
-        var index = this.keys.indexOf(key);
-        if (index < 0)
-          return;
-
-        return this.values[index];
-      },
-
-      delete: function(key, value) {
-        var index = this.keys.indexOf(key);
-        if (index < 0)
-          return false;
-
-        this.keys.splice(index, 1);
-        this.values.splice(index, 1);
-        return true;
-      },
-
-      forEach: function(f, opt_this) {
-        for (var i = 0; i < this.keys.length; i++)
-          f.call(opt_this || this, this.values[i], this.keys[i], this);
-      }
-    };
-  }
-
-  // JScript does not have __proto__. We wrap all object literals with
-  // createObject which uses Object.create, Object.defineProperty and
-  // Object.getOwnPropertyDescriptor to create a new object that does the exact
-  // same thing. The main downside to this solution is that we have to extract
-  // all those property descriptors for IE.
-  var createObject = ('__proto__' in {}) ?
-      function(obj) { return obj; } :
-      function(obj) {
-        var proto = obj.__proto__;
-        if (!proto)
-          return obj;
-        var newObject = Object.create(proto);
-        Object.getOwnPropertyNames(obj).forEach(function(name) {
-          Object.defineProperty(newObject, name,
-                               Object.getOwnPropertyDescriptor(obj, name));
-        });
-        return newObject;
-      };
-
-  // IE does not support have Document.prototype.contains.
-  if (typeof document.contains != 'function') {
-    Document.prototype.contains = function(node) {
-      if (node === this || node.parentNode === this)
-        return true;
-      return this.documentElement.contains(node);
-    }
-  }
-
-  var BIND = 'bind';
-  var REPEAT = 'repeat';
-  var IF = 'if';
-
-  var templateAttributeDirectives = {
-    'template': true,
-    'repeat': true,
-    'bind': true,
-    'ref': true
-  };
-
-  var semanticTemplateElements = {
-    'THEAD': true,
-    'TBODY': true,
-    'TFOOT': true,
-    'TH': true,
-    'TR': true,
-    'TD': true,
-    'COLGROUP': true,
-    'COL': true,
-    'CAPTION': true,
-    'OPTION': true,
-    'OPTGROUP': true
-  };
-
-  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';
-  if (hasTemplateElement) {
-    // TODO(rafaelw): Remove when fix for
-    // https://codereview.chromium.org/164803002/
-    // makes it to Chrome release.
-    (function() {
-      var t = document.createElement('template');
-      var d = t.content.ownerDocument;
-      var html = d.appendChild(d.createElement('html'));
-      var head = html.appendChild(d.createElement('head'));
-      var base = d.createElement('base');
-      base.href = document.baseURI;
-      head.appendChild(base);
-    })();
-  }
-
-  var allTemplatesSelectors = 'template, ' +
-      Object.keys(semanticTemplateElements).map(function(tagName) {
-        return tagName.toLowerCase() + '[template]';
-      }).join(', ');
-
-  function isSVGTemplate(el) {
-    return el.tagName == 'template' &&
-           el.namespaceURI == 'http://www.w3.org/2000/svg';
-  }
-
-  function isHTMLTemplate(el) {
-    return el.tagName == 'TEMPLATE' &&
-           el.namespaceURI == 'http://www.w3.org/1999/xhtml';
-  }
-
-  function isAttributeTemplate(el) {
-    return Boolean(semanticTemplateElements[el.tagName] &&
-                   el.hasAttribute('template'));
-  }
-
-  function isTemplate(el) {
-    if (el.isTemplate_ === undefined)
-      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);
-
-    return el.isTemplate_;
-  }
-
-  // FIXME: Observe templates being added/removed from documents
-  // FIXME: Expose imperative API to decorate and observe templates in
-  // "disconnected tress" (e.g. ShadowRoot)
-  document.addEventListener('DOMContentLoaded', function(e) {
-    bootstrapTemplatesRecursivelyFrom(document);
-    // FIXME: Is this needed? Seems like it shouldn't be.
-    Platform.performMicrotaskCheckpoint();
-  }, false);
-
-  function forAllTemplatesFrom(node, fn) {
-    var subTemplates = node.querySelectorAll(allTemplatesSelectors);
-
-    if (isTemplate(node))
-      fn(node)
-    forEach(subTemplates, fn);
-  }
-
-  function bootstrapTemplatesRecursivelyFrom(node) {
-    function bootstrap(template) {
-      if (!HTMLTemplateElement.decorate(template))
-        bootstrapTemplatesRecursivelyFrom(template.content);
-    }
-
-    forAllTemplatesFrom(node, bootstrap);
-  }
-
-  if (!hasTemplateElement) {
-    /**
-     * This represents a <template> element.
-     * @constructor
-     * @extends {HTMLElement}
-     */
-    global.HTMLTemplateElement = function() {
-      throw TypeError('Illegal constructor');
-    };
-  }
-
-  var hasProto = '__proto__' in {};
-
-  function mixin(to, from) {
-    Object.getOwnPropertyNames(from).forEach(function(name) {
-      Object.defineProperty(to, name,
-                            Object.getOwnPropertyDescriptor(from, name));
-    });
-  }
-
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
-  function getOrCreateTemplateContentsOwner(template) {
-    var doc = template.ownerDocument
-    if (!doc.defaultView)
-      return doc;
-    var d = doc.templateContentsOwner_;
-    if (!d) {
-      // TODO(arv): This should either be a Document or HTMLDocument depending
-      // on doc.
-      d = doc.implementation.createHTMLDocument('');
-      while (d.lastChild) {
-        d.removeChild(d.lastChild);
-      }
-      doc.templateContentsOwner_ = d;
-    }
-    return d;
-  }
-
-  function getTemplateStagingDocument(template) {
-    if (!template.stagingDocument_) {
-      var owner = template.ownerDocument;
-      if (!owner.stagingDocument_) {
-        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');
-        owner.stagingDocument_.isStagingDocument = true;
-        // TODO(rafaelw): Remove when fix for
-        // https://codereview.chromium.org/164803002/
-        // makes it to Chrome release.
-        var base = owner.stagingDocument_.createElement('base');
-        base.href = document.baseURI;
-        owner.stagingDocument_.head.appendChild(base);
-
-        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;
-      }
-
-      template.stagingDocument_ = owner.stagingDocument_;
-    }
-
-    return template.stagingDocument_;
-  }
-
-  // For non-template browsers, the parser will disallow <template> in certain
-  // locations, so we allow "attribute templates" which combine the template
-  // element with the top-level container node of the content, e.g.
-  //
-  //   <tr template repeat="{{ foo }}"" class="bar"><td>Bar</td></tr>
-  //
-  // becomes
-  //
-  //   <template repeat="{{ foo }}">
-  //   + #document-fragment
-  //     + <tr class="bar">
-  //       + <td>Bar</td>
-  //
-  function extractTemplateFromAttributeTemplate(el) {
-    var template = el.ownerDocument.createElement('template');
-    el.parentNode.insertBefore(template, el);
-
-    var attribs = el.attributes;
-    var count = attribs.length;
-    while (count-- > 0) {
-      var attrib = attribs[count];
-      if (templateAttributeDirectives[attrib.name]) {
-        if (attrib.name !== 'template')
-          template.setAttribute(attrib.name, attrib.value);
-        el.removeAttribute(attrib.name);
-      }
-    }
-
-    return template;
-  }
-
-  function extractTemplateFromSVGTemplate(el) {
-    var template = el.ownerDocument.createElement('template');
-    el.parentNode.insertBefore(template, el);
-
-    var attribs = el.attributes;
-    var count = attribs.length;
-    while (count-- > 0) {
-      var attrib = attribs[count];
-      template.setAttribute(attrib.name, attrib.value);
-      el.removeAttribute(attrib.name);
-    }
-
-    el.parentNode.removeChild(el);
-    return template;
-  }
-
-  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {
-    var content = template.content;
-    if (useRoot) {
-      content.appendChild(el);
-      return;
-    }
-
-    var child;
-    while (child = el.firstChild) {
-      content.appendChild(child);
-    }
-  }
-
-  var templateObserver;
-  if (typeof MutationObserver == 'function') {
-    templateObserver = new MutationObserver(function(records) {
-      for (var i = 0; i < records.length; i++) {
-        records[i].target.refChanged_();
-      }
-    });
-  }
-
-  /**
-   * Ensures proper API and content model for template elements.
-   * @param {HTMLTemplateElement} opt_instanceRef The template element which
-   *     |el| template element will return as the value of its ref(), and whose
-   *     content will be used as source when createInstance() is invoked.
-   */
-  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {
-    if (el.templateIsDecorated_)
-      return false;
-
-    var templateElement = el;
-    templateElement.templateIsDecorated_ = true;
-
-    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&
-                               hasTemplateElement;
-    var bootstrapContents = isNativeHTMLTemplate;
-    var liftContents = !isNativeHTMLTemplate;
-    var liftRoot = false;
-
-    if (!isNativeHTMLTemplate) {
-      if (isAttributeTemplate(templateElement)) {
-        assert(!opt_instanceRef);
-        templateElement = extractTemplateFromAttributeTemplate(el);
-        templateElement.templateIsDecorated_ = true;
-        isNativeHTMLTemplate = hasTemplateElement;
-        liftRoot = true;
-      } else if (isSVGTemplate(templateElement)) {
-        templateElement = extractTemplateFromSVGTemplate(el);
-        templateElement.templateIsDecorated_ = true;
-        isNativeHTMLTemplate = hasTemplateElement;
-      }
-    }
-
-    if (!isNativeHTMLTemplate) {
-      fixTemplateElementPrototype(templateElement);
-      var doc = getOrCreateTemplateContentsOwner(templateElement);
-      templateElement.content_ = doc.createDocumentFragment();
-    }
-
-    if (opt_instanceRef) {
-      // template is contained within an instance, its direct content must be
-      // empty
-      templateElement.instanceRef_ = opt_instanceRef;
-    } else if (liftContents) {
-      liftNonNativeTemplateChildrenIntoContent(templateElement,
-                                               el,
-                                               liftRoot);
-    } else if (bootstrapContents) {
-      bootstrapTemplatesRecursivelyFrom(templateElement.content);
-    }
-
-    return true;
-  };
-
-  // TODO(rafaelw): This used to decorate recursively all templates from a given
-  // node. This happens by default on 'DOMContentLoaded', but may be needed
-  // in subtrees not descendent from document (e.g. ShadowRoot).
-  // Review whether this is the right public API.
-  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;
-
-  var htmlElement = global.HTMLUnknownElement || HTMLElement;
-
-  var contentDescriptor = {
-    get: function() {
-      return this.content_;
-    },
-    enumerable: true,
-    configurable: true
-  };
-
-  if (!hasTemplateElement) {
-    // Gecko is more picky with the prototype than WebKit. Make sure to use the
-    // same prototype as created in the constructor.
-    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);
-
-    Object.defineProperty(HTMLTemplateElement.prototype, 'content',
-                          contentDescriptor);
-  }
-
-  function fixTemplateElementPrototype(el) {
-    if (hasProto)
-      el.__proto__ = HTMLTemplateElement.prototype;
-    else
-      mixin(el, HTMLTemplateElement.prototype);
-  }
-
-  function ensureSetModelScheduled(template) {
-    if (!template.setModelFn_) {
-      template.setModelFn_ = function() {
-        template.setModelFnScheduled_ = false;
-        var map = getBindings(template,
-            template.delegate_ && template.delegate_.prepareBinding);
-        processBindings(template, map, template.model_);
-      };
-    }
-
-    if (!template.setModelFnScheduled_) {
-      template.setModelFnScheduled_ = true;
-      Observer.runEOM_(template.setModelFn_);
-    }
-  }
-
-  mixin(HTMLTemplateElement.prototype, {
-    bind: function(name, value, oneTime) {
-      if (name != 'ref')
-        return Element.prototype.bind.call(this, name, value, oneTime);
-
-      var self = this;
-      var ref = oneTime ? value : value.open(function(ref) {
-        self.setAttribute('ref', ref);
-        self.refChanged_();
-      });
-
-      this.setAttribute('ref', ref);
-      this.refChanged_();
-      if (oneTime)
+  function module(name, dependsOrFactory, moduleFactory) {
+    var module;
+    switch (arguments.length) {
+      case 0:
         return;
-
-      if (!this.bindings_) {
-        this.bindings_ = { ref: value };
-      } else {
-        this.bindings_.ref = value;
-      }
-
-      return value;
-    },
-
-    processBindingDirectives_: function(directives) {
-      if (this.iterator_)
-        this.iterator_.closeDeps();
-
-      if (!directives.if && !directives.bind && !directives.repeat) {
-        if (this.iterator_) {
-          this.iterator_.close();
-          this.iterator_ = undefined;
-        }
-
-        return;
-      }
-
-      if (!this.iterator_) {
-        this.iterator_ = new TemplateIterator(this);
-      }
-
-      this.iterator_.updateDependencies(directives, this.model_);
-
-      if (templateObserver) {
-        templateObserver.observe(this, { attributes: true,
-                                         attributeFilter: ['ref'] });
-      }
-
-      return this.iterator_;
-    },
-
-    createInstance: function(model, bindingDelegate, delegate_) {
-      if (bindingDelegate)
-        delegate_ = this.newDelegate_(bindingDelegate);
-      else if (!delegate_)
-        delegate_ = this.delegate_;
-
-      if (!this.refContent_)
-        this.refContent_ = this.ref_.content;
-      var content = this.refContent_;
-      if (content.firstChild === null)
-        return emptyInstance;
-
-      var map = getInstanceBindingMap(content, delegate_);
-      var stagingDocument = getTemplateStagingDocument(this);
-      var instance = stagingDocument.createDocumentFragment();
-      instance.templateCreator_ = this;
-      instance.protoContent_ = content;
-      instance.bindings_ = [];
-      instance.terminator_ = null;
-      var instanceRecord = instance.templateInstance_ = {
-        firstNode: null,
-        lastNode: null,
-        model: model
-      };
-
-      var i = 0;
-      var collectTerminator = false;
-      for (var child = content.firstChild; child; child = child.nextSibling) {
-        // The terminator of the instance is the clone of the last child of the
-        // content. If the last child is an active template, it may produce
-        // instances as a result of production, so simply collecting the last
-        // child of the instance after it has finished producing may be wrong.
-        if (child.nextSibling === null)
-          collectTerminator = true;
-
-        var clone = cloneAndBindInstance(child, instance, stagingDocument,
-                                         map.children[i++],
-                                         model,
-                                         delegate_,
-                                         instance.bindings_);
-        clone.templateInstance_ = instanceRecord;
-        if (collectTerminator)
-          instance.terminator_ = clone;
-      }
-
-      instanceRecord.firstNode = instance.firstChild;
-      instanceRecord.lastNode = instance.lastChild;
-      instance.templateCreator_ = undefined;
-      instance.protoContent_ = undefined;
-      return instance;
-    },
-
-    get model() {
-      return this.model_;
-    },
-
-    set model(model) {
-      this.model_ = model;
-      ensureSetModelScheduled(this);
-    },
-
-    get bindingDelegate() {
-      return this.delegate_ && this.delegate_.raw;
-    },
-
-    refChanged_: function() {
-      if (!this.iterator_ || this.refContent_ === this.ref_.content)
-        return;
-
-      this.refContent_ = undefined;
-      this.iterator_.valueChanged();
-      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());
-    },
-
-    clear: function() {
-      this.model_ = undefined;
-      this.delegate_ = undefined;
-      if (this.bindings_ && this.bindings_.ref)
-        this.bindings_.ref.close()
-      this.refContent_ = undefined;
-      if (!this.iterator_)
-        return;
-      this.iterator_.valueChanged();
-      this.iterator_.close()
-      this.iterator_ = undefined;
-    },
-
-    setDelegate_: function(delegate) {
-      this.delegate_ = delegate;
-      this.bindingMap_ = undefined;
-      if (this.iterator_) {
-        this.iterator_.instancePositionChangedFn_ = undefined;
-        this.iterator_.instanceModelFn_ = undefined;
-      }
-    },
-
-    newDelegate_: function(bindingDelegate) {
-      if (!bindingDelegate)
-        return;
-
-      function delegateFn(name) {
-        var fn = bindingDelegate && bindingDelegate[name];
-        if (typeof fn != 'function')
-          return;
-
-        return function() {
-          return fn.apply(bindingDelegate, arguments);
-        };
-      }
-
-      return {
-        bindingMaps: {},
-        raw: bindingDelegate,
-        prepareBinding: delegateFn('prepareBinding'),
-        prepareInstanceModel: delegateFn('prepareInstanceModel'),
-        prepareInstancePositionChanged:
-            delegateFn('prepareInstancePositionChanged')
-      };
-    },
-
-    set bindingDelegate(bindingDelegate) {
-      if (this.delegate_) {
-        throw Error('Template must be cleared before a new bindingDelegate ' +
-                    'can be assigned');
-      }
-
-      this.setDelegate_(this.newDelegate_(bindingDelegate));
-    },
-
-    get ref_() {
-      var ref = searchRefId(this, this.getAttribute('ref'));
-      if (!ref)
-        ref = this.instanceRef_;
-
-      if (!ref)
-        return this;
-
-      var nextRef = ref.ref_;
-      return nextRef ? nextRef : ref;
-    }
-  });
-
-  // Returns
-  //   a) undefined if there are no mustaches.
-  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.
-  function parseMustaches(s, name, node, prepareBindingFn) {
-    if (!s || !s.length)
-      return;
-
-    var tokens;
-    var length = s.length;
-    var startIndex = 0, lastIndex = 0, endIndex = 0;
-    var onlyOneTime = true;
-    while (lastIndex < length) {
-      var startIndex = s.indexOf('{{', lastIndex);
-      var oneTimeStart = s.indexOf('[[', lastIndex);
-      var oneTime = false;
-      var terminator = '}}';
-
-      if (oneTimeStart >= 0 &&
-          (startIndex < 0 || oneTimeStart < startIndex)) {
-        startIndex = oneTimeStart;
-        oneTime = true;
-        terminator = ']]';
-      }
-
-      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);
-
-      if (endIndex < 0) {
-        if (!tokens)
-          return;
-
-        tokens.push(s.slice(lastIndex)); // TEXT
+      case 1:
+        module = null;
         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;
+      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;
     }
-
-    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;
+    modules[name] = module;
   };
 
-  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 marshal(name) {
+    return modules[name];
   }
 
-  function processSinglePathBinding(name, tokens, node, model) {
-    var delegateFn = tokens[3];
-    var observer = delegateFn ? delegateFn(model, node, false) :
-        new PathObserver(model, tokens[2]);
+  var modules = {};
 
-    return tokens.isSimplePath ? observer :
-        new ObserverTransform(observer, tokens.combinator);
-  }
-
-  function processBinding(name, tokens, node, model) {
-    if (tokens.onlyOneTime)
-      return processOneTimeBinding(name, tokens, node, model);
-
-    if (tokens.hasOnePath)
-      return processSinglePathBinding(name, tokens, node, model);
-
-    var observer = new CompoundObserver();
-
-    for (var i = 1; i < tokens.length; i += 4) {
-      var oneTime = tokens[i];
-      var delegateFn = tokens[i + 2];
-
-      if (delegateFn) {
-        var value = delegateFn(model, node, oneTime);
-        if (oneTime)
-          observer.addPath(value)
-        else
-          observer.addObserver(value);
-        continue;
-      }
-
-      var path = tokens[i + 1];
-      if (oneTime)
-        observer.addPath(path.getValueFrom(model))
-      else
-        observer.addPath(model, path);
-    }
-
-    return new ObserverTransform(observer, tokens.combinator);
-  }
-
-  function processBindings(node, bindings, model, instanceBindings) {
-    for (var i = 0; i < bindings.length; i += 2) {
-      var name = bindings[i]
-      var tokens = bindings[i + 1];
-      var value = processBinding(name, tokens, node, model);
-      var binding = node.bind(name, value, tokens.onlyOneTime);
-      if (binding && instanceBindings)
-        instanceBindings.push(binding);
-    }
-
-    node.bindFinished();
-    if (!bindings.isTemplate)
-      return;
-
-    node.model_ = model;
-    var iter = node.processBindingDirectives_(bindings);
-    if (instanceBindings && iter)
-      instanceBindings.push(iter);
-  }
-
-  function parseWithDefault(el, name, prepareBindingFn) {
-    var v = el.getAttribute(name);
-    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);
-  }
-
-  function parseAttributeBindings(element, prepareBindingFn) {
-    assert(element);
-
-    var bindings = [];
-    var ifFound = false;
-    var bindFound = false;
-
-    for (var i = 0; i < element.attributes.length; i++) {
-      var attr = element.attributes[i];
-      var name = attr.name;
-      var value = attr.value;
-
-      // Allow bindings expressed in attributes to be prefixed with underbars.
-      // We do this to allow correct semantics for browsers that don't implement
-      // <template> where certain attributes might trigger side-effects -- and
-      // for IE which sanitizes certain attributes, disallowing mustache
-      // replacements in their text.
-      while (name[0] === '_') {
-        name = name.substring(1);
-      }
-
-      if (isTemplate(element) &&
-          (name === IF || name === BIND || name === REPEAT)) {
-        continue;
-      }
-
-      var tokens = parseMustaches(value, name, element,
-                                  prepareBindingFn);
-      if (!tokens)
-        continue;
-
-      bindings.push(name, tokens);
-    }
-
-    if (isTemplate(element)) {
-      bindings.isTemplate = true;
-      bindings.if = parseWithDefault(element, IF, prepareBindingFn);
-      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);
-      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);
-
-      if (bindings.if && !bindings.bind && !bindings.repeat)
-        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);
-    }
-
-    return bindings;
-  }
-
-  function getBindings(node, prepareBindingFn) {
-    if (node.nodeType === Node.ELEMENT_NODE)
-      return parseAttributeBindings(node, prepareBindingFn);
-
-    if (node.nodeType === Node.TEXT_NODE) {
-      var tokens = parseMustaches(node.data, 'textContent', node,
-                                  prepareBindingFn);
-      if (tokens)
-        return ['textContent', tokens];
-    }
-
-    return [];
-  }
-
-  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,
-                                delegate,
-                                instanceBindings,
-                                instanceRecord) {
-    var clone = parent.appendChild(stagingDocument.importNode(node, false));
-
-    var i = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      cloneAndBindInstance(child, clone, stagingDocument,
-                            bindings.children[i++],
-                            model,
-                            delegate,
-                            instanceBindings);
-    }
-
-    if (bindings.isTemplate) {
-      HTMLTemplateElement.decorate(clone, node);
-      if (delegate)
-        clone.setDelegate_(delegate);
-    }
-
-    processBindings(clone, bindings, model, instanceBindings);
-    return clone;
-  }
-
-  function createInstanceBindingMap(node, prepareBindingFn) {
-    var map = getBindings(node, prepareBindingFn);
-    map.children = {};
-    var index = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);
-    }
-
-    return map;
-  }
-
-  var contentUidCounter = 1;
-
-  // TODO(rafaelw): Setup a MutationObserver on content which clears the id
-  // so that bindingMaps regenerate when the template.content changes.
-  function getContentUid(content) {
-    var id = content.id_;
-    if (!id)
-      id = content.id_ = contentUidCounter++;
-    return id;
-  }
-
-  // Each delegate is associated with a set of bindingMaps, one for each
-  // content which may be used by a template. The intent is that each binding
-  // delegate gets the opportunity to prepare the instance (via the prepare*
-  // delegate calls) once across all uses.
-  // TODO(rafaelw): Separate out the parse map from the binding map. In the
-  // current implementation, if two delegates need a binding map for the same
-  // content, the second will have to reparse.
-  function getInstanceBindingMap(content, delegate_) {
-    var contentId = getContentUid(content);
-    if (delegate_) {
-      var map = delegate_.bindingMaps[contentId];
-      if (!map) {
-        map = delegate_.bindingMaps[contentId] =
-            createInstanceBindingMap(content, delegate_.prepareBinding) || [];
-      }
-      return map;
-    }
-
-    var map = content.bindingMap_;
-    if (!map) {
-      map = content.bindingMap_ =
-          createInstanceBindingMap(content, undefined) || [];
-    }
-    return map;
-  }
-
-  Object.defineProperty(Node.prototype, 'templateInstance', {
-    get: function() {
-      var instance = this.templateInstance_;
-      return instance ? instance :
-          (this.parentNode ? this.parentNode.templateInstance : undefined);
-    }
-  });
-
-  var emptyInstance = document.createDocumentFragment();
-  emptyInstance.bindings_ = [];
-  emptyInstance.terminator_ = null;
-
-  function TemplateIterator(templateElement) {
-    this.closed = false;
-    this.templateElement_ = templateElement;
-    this.instances = [];
-    this.deps = undefined;
-    this.iteratedValue = [];
-    this.presentValue = undefined;
-    this.arrayObserver = undefined;
-  }
-
-  TemplateIterator.prototype = {
-    closeDeps: function() {
-      var deps = this.deps;
-      if (deps) {
-        if (deps.ifOneTime === false)
-          deps.ifValue.close();
-        if (deps.oneTime === false)
-          deps.value.close();
-      }
-    },
-
-    updateDependencies: function(directives, model) {
-      this.closeDeps();
-
-      var deps = this.deps = {};
-      var template = this.templateElement_;
-
-      var ifValue = true;
-      if (directives.if) {
-        deps.hasIf = true;
-        deps.ifOneTime = directives.if.onlyOneTime;
-        deps.ifValue = processBinding(IF, directives.if, template, model);
-
-        ifValue = deps.ifValue;
-
-        // oneTime if & predicate is false. nothing else to do.
-        if (deps.ifOneTime && !ifValue) {
-          this.valueChanged();
-          return;
-        }
-
-        if (!deps.ifOneTime)
-          ifValue = ifValue.open(this.updateIfValue, this);
-      }
-
-      if (directives.repeat) {
-        deps.repeat = true;
-        deps.oneTime = directives.repeat.onlyOneTime;
-        deps.value = processBinding(REPEAT, directives.repeat, template, model);
-      } else {
-        deps.repeat = false;
-        deps.oneTime = directives.bind.onlyOneTime;
-        deps.value = processBinding(BIND, directives.bind, template, model);
-      }
-
-      var value = deps.value;
-      if (!deps.oneTime)
-        value = value.open(this.updateIteratedValue, this);
-
-      if (!ifValue) {
-        this.valueChanged();
-        return;
-      }
-
-      this.updateValue(value);
-    },
-
-    /**
-     * Gets the updated value of the bind/repeat. This can potentially call
-     * user code (if a bindingDelegate is set up) so we try to avoid it if we
-     * already have the value in hand (from Observer.open).
-     */
-    getUpdatedValue: function() {
-      var value = this.deps.value;
-      if (!this.deps.oneTime)
-        value = value.discardChanges();
-      return value;
-    },
-
-    updateIfValue: function(ifValue) {
-      if (!ifValue) {
-        this.valueChanged();
-        return;
-      }
-
-      this.updateValue(this.getUpdatedValue());
-    },
-
-    updateIteratedValue: function(value) {
-      if (this.deps.hasIf) {
-        var ifValue = this.deps.ifValue;
-        if (!this.deps.ifOneTime)
-          ifValue = ifValue.discardChanges();
-        if (!ifValue) {
-          this.valueChanged();
-          return;
-        }
-      }
-
-      this.updateValue(value);
-    },
-
-    updateValue: function(value) {
-      if (!this.deps.repeat)
-        value = [value];
-      var observe = this.deps.repeat &&
-                    !this.deps.oneTime &&
-                    Array.isArray(value);
-      this.valueChanged(value, observe);
-    },
-
-    valueChanged: function(value, observeValue) {
-      if (!Array.isArray(value))
-        value = [];
-
-      if (value === this.iteratedValue)
-        return;
-
-      this.unobserve();
-      this.presentValue = value;
-      if (observeValue) {
-        this.arrayObserver = new ArrayObserver(this.presentValue);
-        this.arrayObserver.open(this.handleSplices, this);
-      }
-
-      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,
-                                                        this.iteratedValue));
-    },
-
-    getLastInstanceNode: function(index) {
-      if (index == -1)
-        return this.templateElement_;
-      var instance = this.instances[index];
-      var terminator = instance.terminator_;
-      if (!terminator)
-        return this.getLastInstanceNode(index - 1);
-
-      if (terminator.nodeType !== Node.ELEMENT_NODE ||
-          this.templateElement_ === terminator) {
-        return terminator;
-      }
-
-      var subtemplateIterator = terminator.iterator_;
-      if (!subtemplateIterator)
-        return terminator;
-
-      return subtemplateIterator.getLastTemplateNode();
-    },
-
-    getLastTemplateNode: function() {
-      return this.getLastInstanceNode(this.instances.length - 1);
-    },
-
-    insertInstanceAt: function(index, fragment) {
-      var previousInstanceLast = this.getLastInstanceNode(index - 1);
-      var parent = this.templateElement_.parentNode;
-      this.instances.splice(index, 0, fragment);
-
-      parent.insertBefore(fragment, previousInstanceLast.nextSibling);
-    },
-
-    extractInstanceAt: function(index) {
-      var previousInstanceLast = this.getLastInstanceNode(index - 1);
-      var lastNode = this.getLastInstanceNode(index);
-      var parent = this.templateElement_.parentNode;
-      var instance = this.instances.splice(index, 1)[0];
-
-      while (lastNode !== previousInstanceLast) {
-        var node = previousInstanceLast.nextSibling;
-        if (node == lastNode)
-          lastNode = previousInstanceLast;
-
-        instance.appendChild(parent.removeChild(node));
-      }
-
-      return instance;
-    },
-
-    getDelegateFn: function(fn) {
-      fn = fn && fn(this.templateElement_);
-      return typeof fn === 'function' ? fn : null;
-    },
-
-    handleSplices: function(splices) {
-      if (this.closed || !splices.length)
-        return;
-
-      var template = this.templateElement_;
-
-      if (!template.parentNode) {
-        this.close();
-        return;
-      }
-
-      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,
-                                 splices);
-
-      var delegate = template.delegate_;
-      if (this.instanceModelFn_ === undefined) {
-        this.instanceModelFn_ =
-            this.getDelegateFn(delegate && delegate.prepareInstanceModel);
-      }
-
-      if (this.instancePositionChangedFn_ === undefined) {
-        this.instancePositionChangedFn_ =
-            this.getDelegateFn(delegate &&
-                               delegate.prepareInstancePositionChanged);
-      }
-
-      // Instance Removals
-      var instanceCache = new Map;
-      var removeDelta = 0;
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        var removed = splice.removed;
-        for (var j = 0; j < removed.length; j++) {
-          var model = removed[j];
-          var instance = this.extractInstanceAt(splice.index + removeDelta);
-          if (instance !== emptyInstance) {
-            instanceCache.set(model, instance);
-          }
-        }
-
-        removeDelta -= splice.addedCount;
-      }
-
-      // Instance Insertions
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        var addIndex = splice.index;
-        for (; addIndex < splice.index + splice.addedCount; addIndex++) {
-          var model = this.iteratedValue[addIndex];
-          var instance = instanceCache.get(model);
-          if (instance) {
-            instanceCache.delete(model);
-          } else {
-            if (this.instanceModelFn_) {
-              model = this.instanceModelFn_(model);
-            }
-
-            if (model === undefined) {
-              instance = emptyInstance;
-            } else {
-              instance = template.createInstance(model, undefined, delegate);
-            }
-          }
-
-          this.insertInstanceAt(addIndex, instance);
-        }
-      }
-
-      instanceCache.forEach(function(instance) {
-        this.closeInstanceBindings(instance);
-      }, this);
-
-      if (this.instancePositionChangedFn_)
-        this.reportInstancesMoved(splices);
-    },
-
-    reportInstanceMoved: function(index) {
-      var instance = this.instances[index];
-      if (instance === emptyInstance)
-        return;
-
-      this.instancePositionChangedFn_(instance.templateInstance_, index);
-    },
-
-    reportInstancesMoved: function(splices) {
-      var index = 0;
-      var offset = 0;
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        if (offset != 0) {
-          while (index < splice.index) {
-            this.reportInstanceMoved(index);
-            index++;
-          }
-        } else {
-          index = splice.index;
-        }
-
-        while (index < splice.index + splice.addedCount) {
-          this.reportInstanceMoved(index);
-          index++;
-        }
-
-        offset += splice.addedCount - splice.removed.length;
-      }
-
-      if (offset == 0)
-        return;
-
-      var length = this.instances.length;
-      while (index < length) {
-        this.reportInstanceMoved(index);
-        index++;
-      }
-    },
-
-    closeInstanceBindings: function(instance) {
-      var bindings = instance.bindings_;
-      for (var i = 0; i < bindings.length; i++) {
-        bindings[i].close();
-      }
-    },
-
-    unobserve: function() {
-      if (!this.arrayObserver)
-        return;
-
-      this.arrayObserver.close();
-      this.arrayObserver = undefined;
-    },
-
-    close: function() {
-      if (this.closed)
-        return;
-      this.unobserve();
-      for (var i = 0; i < this.instances.length; i++) {
-        this.closeInstanceBindings(this.instances[i]);
-      }
-
-      this.instances.length = 0;
-      this.closeDeps();
-      this.templateElement_.iterator_ = undefined;
-      this.closed = true;
-    }
-  };
-
-  // Polyfill-specific API.
-  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;
-})(this);
-
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-
-// 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();
+  function using(depends, task) {
+    HTMLImports.whenImportsReady(function() {
+      withDependencies(task, depends);
     });
-  }
-};
+  };
 
-// 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() {};
-}
+  // exports
 
-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;
-  }
-}
+  scope.marshal = marshal;
+  // `module` confuses commonjs detectors
+  scope.modularize = module;
+  scope.using = using;
 
-// exports
-scope.flush = flush;
-
-})(window.Platform);
-
+})(window);
 
 //# sourceMappingURL=platform.concat.js.map
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index 8b2fbc1..fda9673 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -4,8 +4,8 @@
   "sources": [
     "build/boot.js",
     "../WeakMap/weakmap.js",
-    "../observe-js/src/observe.js",
     "build/if-poly.js",
+    "../observe-js/src/observe.js",
     "../ShadowDOM/src/wrappers.js",
     "../ShadowDOM/src/microtask.js",
     "../ShadowDOM/src/MutationObserver.js",
@@ -60,12 +60,6 @@
     "../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/base.js",
@@ -80,22 +74,19 @@
     "../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"
+    "src/unresolved.js",
+    "src/module.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9rDA;AACA;A;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACv4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtwBA,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;A;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sD;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4D;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrwCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;A;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9rDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACv4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3wBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA,C;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sD;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uB;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4D;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
   "sourcesContent": [
     "/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        var hasValue = entry[0] === key;\n        entry[0] = entry[1] = undefined;\n        return hasValue;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n",
-    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
     "// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n",
+    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
     "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  // The name of the implementation property is intentionally hard to\n  // remember. Unfortunately, browsers are slower doing obj[expr] than\n  // obj.foo so we resort to repeat this ugly name. This ugly name is never\n  // used outside of this file though.\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name) :\n        function() { return this.__impl4cf1e782hg__[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :\n        function(v) { this.__impl4cf1e782hg__[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name +\n                     '.apply(this.__impl4cf1e782hg__, arguments)') :\n        function() {\n          return this.__impl4cf1e782hg__[name].apply(\n              this.__impl4cf1e782hg__, arguments);\n        };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ ||\n        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.setWrapper = setWrapper;\n  scope.unsafeUnwrap = unsafeUnwrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(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    constructor: MutationObserver,\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback() {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    while (globalMutationObservers.length) {\n      var notifyList = globalMutationObservers;\n      globalMutationObservers = [];\n\n      // Deliver changes in birth order of the MutationObservers.\n      notifyList.sort(function(x, y) { return x.uid_ - y.uid_; });\n\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n        }\n      }\n    }\n  }\n\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyObserversEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      if (!observer.records_.length) {\n        globalMutationObservers.push(observer);\n        anyObserversEnqueued = true;\n      }\n      observer.records_.push(record);\n    }\n\n    if (anyObserversEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  MutationObserver.prototype = {\n    constructor: MutationObserver,\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n",
     "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        setWrapper(type, this);\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return unsafeUnwrap(this).returnValue;\n    },\n    set returnValue(v) {\n      unsafeUnwrap(this).returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element =\n        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n",
@@ -140,22 +131,16 @@
     "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    var impl;\n    if (formElement instanceof OriginalFormData) {\n      impl = formElement;\n    } else {\n      impl = new OriginalFormData(formElement && unwrap(formElement));\n    }\n    setWrapper(impl, this);\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // 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]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim,  \n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = 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            this.addElementToDocument(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // KEYFRAMES_RULE in IE throws when we query cssText\n          // when it contains a -webkit- property.\n          // if this happens, we fallback to constructing the rule\n          // from the CSSRuleSet\n          // https://connect.microsoft.com/IE/feedbackdetail/view/955703/accessing-csstext-of-a-keyframe-rule-that-contains-a-webkit-property-via-cssom-generates-exception\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {\n              cssText += this.ieSafeCssTextFromKeyFrameRule(rule);\n            }\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  ieSafeCssTextFromKeyFrameRule: function(rule) {\n    var cssText = '@keyframes ' + rule.name + ' {';\n    Array.prototype.forEach.call(rule.cssRules, function(rule) {\n      cssText += ' ' + rule.keyText + ' {' + rule.style.cssText + '}';\n    });\n    cssText += ' }';\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim,  \n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = Array.prototype.slice.call(style.sheet.cssRules, 0);\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = elt.__resource;\n        }\n        // relay on HTMLImports for path fixup\n        HTMLImports.path.resolveUrlsInStyle(style);\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            this.addElementToDocument(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n",
     "} else {",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  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",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n})(window.Platform);\n",
     "}",
     "/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// 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        // 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, 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 (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n})(window.Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    Array.prototype.push.call(arguments, document._currentScript);\n    elementDeclarations.push(arguments);\n  };\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.consumeDeclarations = function(callback) {\n    scope.consumeDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    if (callback) {\n      callback(elementDeclarations);\n    }\n    elementDeclarations = null;\n  };\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n})(window.Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\n\nisIE = /Trident/.test(navigator.userAgent);\n\n// TODO(sorvell): SD polyfill intrusion\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\nvar wrap = function(node) {\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n};\nvar mainDoc = wrap(document);\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    var script = HTMLImports.currentScript || document.currentScript ||\n        // NOTE: only works when called in synchronously executing code.\n        // readyState should check if `loading` but IE10 is \n        // interactive when scripts run so we cheat.\n        (document.readyState !== 'complete' ? \n        document.scripts[document.scripts.length - 1] : null);\n    return wrap(script);\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\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 = 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\n// NOTE: test for native imports loading is based on explicitly watching\n// all imports (see below).\nfunction isImportLoaded(link) {\n  return useNative ? link.__loaded : 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// 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.\nwhenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  mainDoc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n// exports\nscope.useNative = useNative;\nscope.isImportLoaded = isImportLoaded;\nscope.whenReady = whenImportsReady;\nscope.isIE = isIE;\n\n// deprecated\nscope.whenImportsReady = whenImportsReady;\n\n})(window.HTMLImports);\n",
+    "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded : link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        // If url was redirected, use the redirected location so paths are\n        // calculated relative to that.\n        this.onload(url, p, resource, err, redirectedUrl);\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : locationHeader;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIE = scope.isIE;\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    if (elt.import) {\n      elt.import.__importParsed = true;\n    }\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource && !elt.__error) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\n  rootImportForElement: function(elt) {\n    var n = elt;\n    while (n.ownerDocument.__importLink) {\n      n = n.ownerDocument.__importLink;\n    }\n    return n;\n  },\n  addElementToDocument: function(elt) {\n    var port = this.rootImportForElement(elt.__importElement || elt);\n    var l = port.__insertedElements = port.__insertedElements || 0;\n    var refNode = port.nextElementSibling;\n    for (var i=0; i < l; i++) {\n      refNode = refNode && refNode.nextElementSibling;\n    }\n    port.parentNode.insertBefore(elt, refNode);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIE && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    this.addElementToDocument(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    if (doc) {\n      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n        if (!this.isParsed(n)) {\n          if (this.hasResource(n)) {\n            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n          } else {\n            return;\n          }\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\n\n})(HTMLImports);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n (function(scope) {\n\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (doc === undefined) {\n          // generate an HTMLDocument from data\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            // note, we cannot use MO to detect parsed nodes because\n            // SD polyfill does not report these as mutations.\n            this.bootDocument(doc);\n          }\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n\n  // Polyfill document.baseURI for browsers without it.\n  if (!document.baseURI) {\n    var baseURIDescriptor = {\n      get: function() {\n        var base = document.querySelector('base');\n        return base ? base.href : window.location.href;\n      },\n      configurable: true\n    };\n\n    Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n    Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n  }\n\n  // IE shim for CustomEvent\n  if (typeof window.CustomEvent !== 'function') {\n    window.CustomEvent = function(inType, dictionary) {\n       var e = document.createEvent('HTMLEvents');\n       e.initEvent(inType,\n          dictionary.bubbles === false ? false : true,\n          dictionary.cancelable === false ? false : true,\n          dictionary.detail);\n       return e;\n    };\n  }\n\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// exports\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.importLoader = importLoader;\n\n\n})(window.HTMLImports);\n",
@@ -167,10 +152,7 @@
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // install upgrade hook if HTMLImports are available\n  if (window.HTMLImports) {\n    HTMLImports.__importsParsingHook = function(elt) {\n      CustomElements.parser.parse(elt.import);\n    }\n  }\n  // set internal 'ready' flag, now document.registerElement will trigger \n  // synchronous upgrades\n  CustomElements.ready = true;\n  // async to ensure *native* custom elements upgrade prior to this\n  // DOMContentLoaded can fire before elements upgrade (e.g. when there's\n  // an external script)\n  setTimeout(function() {\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, params) {\n    params = params || {};\n    var e = document.createEvent('CustomEvent');\n    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n    return e;\n  };\n  window.CustomEvent.prototype = window.Event.prototype;\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  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(this.iterator_.getUpdatedValue());\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      var ifValue = true;\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        ifValue = deps.ifValue;\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !ifValue) {\n          this.valueChanged();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          ifValue = ifValue.open(this.updateIfValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      var value = deps.value;\n      if (!deps.oneTime)\n        value = value.open(this.updateIteratedValue, this);\n\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(value);\n    },\n\n    /**\n     * Gets the updated value of the bind/repeat. This can potentially call\n     * user code (if a bindingDelegate is set up) so we try to avoid it if we\n     * already have the value in hand (from Observer.open).\n     */\n    getUpdatedValue: function() {\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      return value;\n    },\n\n    updateIfValue: function(ifValue) {\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(this.getUpdatedValue());\n    },\n\n    updateIteratedValue: function(value) {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      this.updateValue(value);\n    },\n\n    updateValue: function(value) {\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n"
   ]
 }
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js b/pkg/web_components/lib/platform.js
index c6ae161..d7e6fb8 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.3.5-fe549bc
+// @version: 0.4.0-5a7353d
 
-window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){var b=a[this.name];if(!b)return!1;var c=b[0]===a;return b[0]=b[1]=void 0,c},has:function(a){var b=a[this.name];return b?b[0]===a:!1}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var testingExposeCycleCount=global.testingExposeCycleCount,hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];M(a,e,O(b,e))}return a}function e(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}M(a,e,O(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){P.value=c,M(a,b,P)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=I.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a):function(){return this.__impl4cf1e782hg__[a]}}function n(a){return L&&l(a)?new Function("v","this.__impl4cf1e782hg__."+a+" = v"):function(b){this.__impl4cf1e782hg__[a]=b}}function o(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[a].apply(this.__impl4cf1e782hg__,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return R}}function q(b,c,d){for(var e=N(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){Q&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),M(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===I.get(a)),I.set(a,b),J.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return I.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a&&a.__impl4cf1e782hg__}function x(a){return!w(a)}function y(a){return null===a?null:(c(x(a)),a.__wrapper8e3dd93a60__||(a.__wrapper8e3dd93a60__=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.__impl4cf1e782hg__)}function A(a){return a.__impl4cf1e782hg__}function B(a,b){b.__impl4cf1e782hg__=a,a.__wrapper8e3dd93a60__=b}function C(a){return a&&w(a)?z(a):a}function D(a){return a&&!w(a)?y(a):a}function E(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.__wrapper8e3dd93a60__=b)}function F(a,b,c){S.get=c,M(a.prototype,b,S)}function G(a,b){F(a,b,function(){return y(this.__impl4cf1e782hg__[b])})}function H(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=D(this);return a[b].apply(a,arguments)}})})}var I=new WeakMap,J=new WeakMap,K=Object.create(null),L=b(),M=Object.defineProperty,N=Object.getOwnPropertyNames,O=Object.getOwnPropertyDescriptor,P={value:void 0,configurable:!0,enumerable:!1,writable:!0};N(window);var Q=/Firefox/.test(navigator.userAgent),R={get:function(){},set:function(){},configurable:!0,enumerable:!0},S={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=I,a.defineGetter=F,a.defineWrapGetter=G,a.forwardMethodsToWrapper=H,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=J,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=E,a.setWrapper=B,a.unsafeUnwrap=A,a.unwrap=z,a.unwrapIfNeeded=C,a.wrap=y,a.wrapIfNeeded=D,a.wrappers=K}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){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={constructor:i,observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof S.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof S.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof S.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!U.get(a)&&(U.set(a,!0),n(R(a),R(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(V.get(b))throw new Error("InvalidStateError");V.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof S.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof S.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof S.Document&&(g=i.defaultView)}return bb.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),Z.set(b,cb),X.delete(b,null),V.delete(b),b.defaultPrevented
-}function o(a,b,c,d){var e=db;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=eb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=fb,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=T.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===db)return!0;c===fb&&(c=eb)}else if(c===fb&&!b.bubbles)return!0;if("relatedTarget"in b){var i=Q(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=R(j),m=k(b,a,l);if(m===g)return!0}else m=null;Y.set(b,m)}}Z.set(b,c);var n=b.type,o=!1;W.set(b,g),X.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===db||r.capture&&c===fb))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),_.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!$.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof gb))return R(x(gb,"Event",a,b));var c=a;return rb||"beforeunload"!==c.type?void O(c,this):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:Q(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void O(b,this):R(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=Q(arguments[b]);var c=Q(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(pb)return new a(c,u(d));var e=Q(document.createEvent(b)),f=ob[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=Q(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){O(a,this)}function C(a){return a instanceof S.ShadowRoot&&(a=a.host),Q(a)}function D(a,b){var c=T.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=Q(a);c;c=c.parentNode)if(D(R(c),b))return!0;return!1}function F(a){K(a,tb)}function G(b,c,e,f){a.renderAllPending();var g=R(ub.call(P(c),e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=ab.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=ab.get(this);d||(d=Object.create(null),ab.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.setWrapper,P=a.unsafeUnwrap,Q=a.unwrap,R=a.wrap,S=a.wrappers,T=(new WeakMap,new WeakMap),U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=new WeakMap,bb=new WeakMap,cb=0,db=1,eb=2,fb=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var gb=window.Event;gb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return W.get(this)},get currentTarget(){return X.get(this)},get eventPhase(){return Z.get(this)},get path(){var a=bb.get(this);return a?a.slice():[]},stopPropagation:function(){$.set(this,!0)},stopImmediatePropagation:function(){$.set(this,!0),_.set(this,!0)}},N(gb,t,document.createEvent("Event"));var hb=v("UIEvent",t),ib=v("CustomEvent",t),jb={get relatedTarget(){var a=Y.get(this);return void 0!==a?a:R(Q(this).relatedTarget)}},kb=M({initMouseEvent:w("initMouseEvent",14)},jb),lb=M({initFocusEvent:w("initFocusEvent",5)},jb),mb=v("MouseEvent",hb,kb),nb=v("FocusEvent",hb,lb),ob=Object.create(null),pb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!pb){var qb=function(a,b,c){if(c){var d=ob[c];b=M(M({},d),b)}ob[a]=b};qb("Event",{bubbles:!1,cancelable:!1}),qb("CustomEvent",{detail:null},"Event"),qb("UIEvent",{view:null,detail:0},"Event"),qb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),qb("FocusEvent",{relatedTarget:null},"UIEvent")}var rb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return P(this).returnValue},set returnValue(a){P(this).returnValue=a}}),rb&&N(rb,y);var sb=window.EventTarget,tb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;tb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=T.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,T.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=T.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=Q(b),d=c.type;U.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return Q(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},sb&&N(sb,B);var ub=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=ib,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=nb,a.wrappers.MouseEvent=mb,a.wrappers.UIEvent=hb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,p)}function c(a){j(a,this)}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.setWrapper,k=a.unsafeUnwrap,l=a.wrap,m=window.TouchEvent;if(m){var n;try{n=document.createEvent("TouchEvent")}catch(o){return}var p={enumerable:!1};c.prototype={get target(){return l(k(this).target)}};var q={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){q.get=function(){return k(this)[a]},Object.defineProperty(c.prototype,a,q)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(k(this).touches)},get targetTouches(){return e(k(this).targetTouches)},get changedTouches(){return e(k(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(m,f,n),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,h)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=g(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(f(this)[b].apply(f(this),arguments))}}var f=a.unsafeUnwrap,g=a.wrap,h={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);P=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;P=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return K(b[0]);for(var d=K(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(K(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=K(b),e=d.parentNode;e&&W.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=K(a),g=f.firstChild;g;)c=g.nextSibling,W.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=M(c?Q.call(c,J(a),!1):R.call(J(a),!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof O.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof S),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unsafeUnwrap,K=a.unwrap,L=a.unwrapIfNeeded,M=a.wrap,N=a.wrapIfNeeded,O=a.wrappers,P=!1,Q=document.importNode,R=window.Node.prototype.cloneNode,S=window.Node,T=window.DocumentFragment,U=(S.prototype.appendChild,S.prototype.compareDocumentPosition),V=S.prototype.insertBefore,W=S.prototype.removeChild,X=S.prototype.replaceChild,Y=/Trident/.test(navigator.userAgent),Z=Y?function(a,b){try{W.call(a,b)}catch(c){if(!(a instanceof T))throw c}}:function(a,b){W.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=K(c):(d=c,c=M(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),V.call(J(this),K(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:J(this);j?V.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=K(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Z(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Z(J(this),f);return P||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=K(d):(e=d,d=M(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),X.call(J(this),K(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&X.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:M(J(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:M(J(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:M(J(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:M(J(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:M(J(this).previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=J(this).ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),J(this).textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,N(a))},compareDocumentPosition:function(a){return U.call(J(this),L(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(S,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c,d,e){for(var f=null,g=null,h=0,i=b.length;i>h;h++)f=s(b[h]),!e&&(g=q(f).root)&&g instanceof a.wrappers.ShadowRoot||(d[c++]=f);return c}function c(a){return String(a).replace(/\/deep\//g," ")}function d(a,b){for(var c,e=a.firstElementChild;e;){if(e.matches(b))return e;if(c=d(e,b))return c;e=e.nextElementSibling}return null}function e(a,b){return a.matches(b)}function f(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===D}function g(){return!0}function h(a,b,c){return a.localName===c}function i(a,b){return a.namespaceURI===b}function j(a,b,c){return a.namespaceURI===b&&a.localName===c}function k(a,b,c,d,e,f){for(var g=a.firstElementChild;g;)d(g,e,f)&&(c[b++]=g),b=k(g,b,c,d,e,f),g=g.nextElementSibling;return b}function l(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,null);if(i instanceof B)h=w.call(i,f);else{if(!(i instanceof C))return k(this,d,e,c,f,null);h=v.call(i,f)}return b(h,d,e,g)}function m(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=y.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=x.call(i,f,g)}return b(h,d,e,!1)}function n(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=A.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=z.call(i,f,g)}return b(h,d,e,!1)}var o=a.wrappers.HTMLCollection,p=a.wrappers.NodeList,q=a.getTreeScope,r=a.unsafeUnwrap,s=a.wrap,t=document.querySelector,u=document.documentElement.querySelector,v=document.querySelectorAll,w=document.documentElement.querySelectorAll,x=document.getElementsByTagName,y=document.documentElement.getElementsByTagName,z=document.getElementsByTagNameNS,A=document.documentElement.getElementsByTagNameNS,B=window.Element,C=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",E={querySelector:function(b){var e=c(b),f=e!==b;b=e;var g,h=r(this),i=q(this).root;if(i instanceof a.wrappers.ShadowRoot)return d(this,b);if(h instanceof B)g=s(u.call(h,b));else{if(!(h instanceof C))return d(this,b);g=s(t.call(h,b))}return g&&!f&&(i=q(g).root)&&i instanceof a.wrappers.ShadowRoot?d(this,b):g},querySelectorAll:function(a){var b=c(a),d=b!==a;a=b;var f=new p;return f.length=l.call(this,e,0,f,a,d),f}},F={getElementsByTagName:function(a){var b=new o,c="*"===a?g:f;return b.length=m.call(this,c,0,b,a,a.toLowerCase()),b},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new o,d=null;return d="*"===a?"*"===b?g:h:"*"===b?i:j,c.length=n.call(this,d,0,c,a||null,b),c}};a.GetElementsByInterface=F,a.SelectorsInterface=E}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return h(this).data},set data(a){var b=h(this).data;e(this,"characterData",{oldValue:b}),h(this).data=a}}),f(b.prototype,c),g(i,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){d(a,this),this.ownerElement_=b}var d=a.setWrapper,e=a.unsafeUnwrap;c.prototype={constructor:c,get length(){return e(this).length},item:function(a){return e(this).item(a)},contains:function(a){return e(this).contains(a)},add:function(){e(this).add.apply(e(this),arguments),b(this.ownerElement_)},remove:function(){e(this).remove.apply(e(this),arguments),b(this.ownerElement_)},toggle:function(){var a=e(this).toggle.apply(e(this),arguments);return b(this.ownerElement_),a},toString:function(){return e(this).toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unsafeUnwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);n(this).polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return n(this).polymerShadowRoot_||null},setAttribute:function(a,d){var e=n(this).getAttribute(a);n(this).setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=n(this).getAttribute(a);n(this).removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(n(this),a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(A,b)}function d(a){return a.replace(B,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",C[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&D[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof z.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=x(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(y(f))}function i(a){o.call(this,a)}function j(a,b){var c=x(a.cloneNode(!1));c.innerHTML=b;for(var d,e=x(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return y(e)}function k(b){return function(){return a.renderAllPending(),w(this)[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),w(this)[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),w(this)[b].apply(w(this),arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unsafeUnwrap,x=a.unwrap,y=a.wrap,z=a.wrappers,A=/[&\u00A0"]/g,B=/[&\u00A0<>]/g,C=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),E=/MSIE/.test(navigator.userAgent),F=window.HTMLElement,G=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(E&&D[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof z.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!G&&this instanceof z.HTMLTemplateElement?h(this.content,a):w(this).innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)},get hidden(){return this.hasAttribute("hidden")},set hidden(a){a?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(F,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=f(this).getContext.apply(f(this),arguments);return a&&g(a)}}),e(h,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),b.prototype.constructor=b,e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=i(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!m){var b=c(a);k.set(this,j(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=a.unwrap,j=a.wrap,k=new WeakMap,l=new WeakMap,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{constructor:d,get content(){return m?j(h(this).content):k.get(this)}}),m&&g(m,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;e&&(b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;h&&(b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())
-},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.SVGElementInstance;h&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return g(f(this).correspondingElement)},get correspondingUseElement(){return g(f(this).correspondingUseElement)},get parentNode(){return g(f(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return g(f(this).firstChild)},get lastChild(){return g(f(this).lastChild)},get previousSibling(){return g(f(this).previousSibling)},get nextSibling(){return g(f(this).nextSibling)}}),e(h,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrap,h=a.unwrapIfNeeded,i=a.wrap,j=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return i(f(this).canvas)},drawImage:function(){arguments[0]=h(arguments[0]),f(this).drawImage.apply(f(this),arguments)},createPattern:function(){return arguments[0]=g(arguments[0]),f(this).createPattern.apply(f(this),arguments)}}),d(j,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.WebGLRenderingContext;if(i){c(b.prototype,{get canvas(){return h(f(this).canvas)},texImage2D:function(){arguments[5]=g(arguments[5]),f(this).texImage2D.apply(f(this),arguments)},texSubImage2D:function(){arguments[6]=g(arguments[6]),f(this).texSubImage2D.apply(f(this),arguments)}});var j=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(i,b,j),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Range;b.prototype={get startContainer(){return h(e(this).startContainer)},get endContainer(){return h(e(this).endContainer)},get commonAncestorContainer(){return h(e(this).commonAncestorContainer)},setStart:function(a,b){e(this).setStart(g(a),b)},setEnd:function(a,b){e(this).setEnd(g(a),b)},setStartBefore:function(a){e(this).setStartBefore(g(a))},setStartAfter:function(a){e(this).setStartAfter(g(a))},setEndBefore:function(a){e(this).setEndBefore(g(a))},setEndAfter:function(a){e(this).setEndAfter(g(a))},selectNode:function(a){e(this).selectNode(g(a))},selectNodeContents:function(a){e(this).selectNodeContents(g(a))},compareBoundaryPoints:function(a,b){return e(this).compareBoundaryPoints(a,f(b))},extractContents:function(){return h(e(this).extractContents())},cloneContents:function(){return h(e(this).cloneContents())},insertNode:function(a){e(this).insertNode(g(a))},surroundContents:function(a){e(this).surroundContents(g(a))},cloneRange:function(){return h(e(this).cloneRange())},isPointInRange:function(a,b){return e(this).isPointInRange(g(a),b)},comparePoint:function(a,b){return e(this).comparePoint(g(a),b)},intersectsNode:function(a){return e(this).intersectsNode(g(a))},toString:function(){return e(this).toString()}},i.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return h(e(this).createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=l(k(a).ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;n.set(this,e),this.treeScope_=new d(this,g(e||a)),m.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unsafeUnwrap,l=a.unwrap,m=new WeakMap,n=new WeakMap,o=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{constructor:b,get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return n.get(this)||null},get host(){return m.get(this)||null},invalidateShadowRenderer:function(){return m.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return o.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=H(a),g=H(c),h=e?H(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=I(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=H(a),d=c.parentNode;if(d){var e=I(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){J.set(a,[])}function f(a){var b=J.get(a);return b||J.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<N.length;a++){var b=N[a],c=b.parentRenderer;c&&c.dirty||b.render()}N=[]}function i(){y=null,h()}function j(a){var b=L.get(a);return b||(b=new n(a),L.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=K.get(a);c?c.push(b):K.set(a,[b])}function r(a){return K.get(a)}function s(a){K.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!P.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unsafeUnwrap,H=a.unwrap,I=a.wrap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),N=[],O=new ArraySplice;O.equals=function(a,b){return H(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(H(b)),h=a||new WeakMap,i=O.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=I(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&I(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var a=this.parentRenderer;if(a&&a.invalidate(),N.push(this),y)return;y=window[M](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){G(a).polymerShadowRenderer_=this}};var P=/^(:not\()?[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=G(this).polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),G(this).polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}{var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap;window.Selection}b.prototype={get anchorNode(){return h(e(this).anchorNode)},get focusNode(){return h(e(this).focusNode)},addRange:function(a){e(this).addRange(f(a))},collapse:function(a,b){e(this).collapse(g(a),b)},containsNode:function(a,b){return e(this).containsNode(g(a),b)},extend:function(a,b){e(this).extend(g(a),b)},getRangeAt:function(a){return h(e(this).getRangeAt(a))},removeRange:function(a){e(this).removeRange(f(a))},selectAllChildren:function(a){e(this).selectAllChildren(g(a))},toString:function(){return e(this).toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return C(c.apply(A(this),arguments))}}function d(a,b){F.call(A(b),B(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){z(a,this)}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return C(c.apply(A(this),arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(A(this),arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.setWrapper,A=a.unsafeUnwrap,B=a.unwrap,C=a.wrap,D=a.wrapEventTargetMethods,E=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var F=document.adoptNode,G=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,A(this))},getSelection:function(){return x(),new m(G.call(B(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var H=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void z(a,this):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){C(this)instanceof d||y(this),b.apply(C(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);H.call(B(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=E.get(this);return a?a:(a=new g(B(this).implementation),E.set(this,a),a)},get defaultView(){return C(B(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getDefaultComputedStyle,n=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},m&&(k.prototype.getDefaultComputedStyle=function(a,b){return j(this||window).getDefaultComputedStyle(i(a),b)}),k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(n.call(h(this)))},get document(){return j(h(this).document)}}),m&&(b.prototype.getDefaultComputedStyle=function(a,b){return g(),m.call(h(this),i(a),b)}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b;b=a instanceof f?a:new f(a&&e(a)),d(b,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unwrap,f=window.FormData;c(f,b,new f),a.wrappers.FormData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=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.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b<shadowDOMSelectorsRe.length;b++)a=a.replace(shadowDOMSelectorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){}},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]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){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):this.addElementToDocument(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"))}};var r=a.URL;r&&(i.createObjectURL=function(){return r.createObjectURL.apply(r,arguments)},i.revokeObjectURL=function(a){r.revokeObjectURL(a)}),a.URL=i}}(this),function(a){function b(a){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){function b(a,b){b=b||o,d(function(){e(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a,b){function c(){g==h&&a&&a()}function d(){g++,c()}var e=b.querySelectorAll("link[rel=import]"),g=0,h=e.length;if(h)for(var i,j=0;h>j&&(i=e[j]);j++)f(i)?d.call(i):(i.addEventListener("load",d),i.addEventListener("error",d));else c()}function f(a){return l?a.__loaded:a.__importParsed}function g(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)h(b)&&i(b)}function h(a){return"link"===a.localName&&"import"===a.rel}function i(a){var b=a.import;b?j({target:a}):(a.addEventListener("load",j),a.addEventListener("error",j))}function j(a){a.target.__loaded=!0}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&g(b.addedNodes)}).observe(document.head,{childList:!0}),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=f,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;for(var f,g=this.pending[a],h=0,i=g.length;i>h&&(f=g[h]);h++)this.onload(a,f,d,c,e),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:a;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b=d(a);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(b)}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=a.isIE,j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import&&(a.import.__importParsed=!0),this.markParsingComplete(a),a.dispatchEvent(a.__resource&&!a.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),this.addElementToDocument(a)},rootImportForElement:function(a){for(var b=a;b.ownerDocument.__importLink;)b=b.ownerDocument.__importLink;return b},addElementToDocument:function(a){for(var b=this.rootImportForElement(a.__importElement||a),c=b.__insertedElements=b.__insertedElements||0,d=b.nextElementSibling,e=0;c>e;e++)d=d&&d.nextElementSibling;b.parentNode.insertBefore(a,d)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),this.addElementToDocument(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){if(a)for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&void 0===a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n}(HTMLImports),function(a){function b(a){return c(a,g)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(g)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}var e=a.useNative,f=a.flags,g="import",h=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(e)var i={};else{var j=(a.xhr,a.Loader),k=a.parser,i={documents:{},documentPreloadSelectors:"link[rel="+g+"]",importsPreloadSelectors:["link[rel="+g+"]"].join(","),loadNode:function(a){l.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);l.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===h?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e,g,h){if(f.load&&console.log("loaded",a,c),c.__resource=e,c.__error=g,b(c)){var i=this.documents[a];void 0===i&&(i=g?null:d(e,h||a),i&&(i.__importLink=c,this.bootDocument(i)),this.documents[a]=i),c.import=i}k.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),k.parseNext()},loadedAll:function(){k.parseNext()}},l=new j(i.loaded.bind(i),i.loadedAll.bind(i));if(!document.baseURI){var m={get:function(){var a=document.querySelector("base");return a?a.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",m),Object.defineProperty(h,"baseURI",m)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c})}a.importer=i,a.IMPORT_LINK_TYPE=g,a.importLoader=l}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;
-for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)}),CustomElements.ready=!0,setTimeout(function(){CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,Boolean(b.bubbles),Boolean(b.cancelable),b.detail),c},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(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(this.iterator_.getUpdatedValue()))},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_,e=!0;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),e=c.ifValue,c.ifOneTime&&!e)return void this.valueChanged();c.ifOneTime||(e=e.open(this.updateIfValue,this))}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b));var f=c.value;return c.oneTime||(f=f.open(this.updateIteratedValue,this)),e?void this.updateValue(f):void this.valueChanged()},getUpdatedValue:function(){var a=this.deps.value;return this.deps.oneTime||(a=a.discardChanges()),a},updateIfValue:function(a){return a?void this.updateValue(this.getUpdatedValue()):void this.valueChanged()},updateIteratedValue:function(a){if(this.deps.hasIf){var b=this.deps.ifValue;if(this.deps.ifOneTime||(b=b.discardChanges()),!b)return void this.valueChanged()}this.updateValue(a)},updateValue:function(a){this.deps.repeat||(a=[a]);var b=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(a);this.valueChanged(a,b)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){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){var b=a[this.name];if(!b)return!1;var c=b[0]===a;return b[0]=b[1]=void 0,c},has:function(a){var b=a[this.name];return b?b[0]===a:!1}},window.WeakMap=c}(),Platform.flags.shadow?(!function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var testingExposeCycleCount=global.testingExposeCycleCount,hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];M(a,e,O(b,e))}return a}function e(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}M(a,e,O(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){P.value=c,M(a,b,P)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=I.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a):function(){return this.__impl4cf1e782hg__[a]}}function n(a){return L&&l(a)?new Function("v","this.__impl4cf1e782hg__."+a+" = v"):function(b){this.__impl4cf1e782hg__[a]=b}}function o(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[a].apply(this.__impl4cf1e782hg__,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return R}}function q(b,c,d){for(var e=N(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){Q&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),M(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===I.get(a)),I.set(a,b),J.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return I.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a&&a.__impl4cf1e782hg__}function x(a){return!w(a)}function y(a){return null===a?null:(c(x(a)),a.__wrapper8e3dd93a60__||(a.__wrapper8e3dd93a60__=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.__impl4cf1e782hg__)}function A(a){return a.__impl4cf1e782hg__}function B(a,b){b.__impl4cf1e782hg__=a,a.__wrapper8e3dd93a60__=b}function C(a){return a&&w(a)?z(a):a}function D(a){return a&&!w(a)?y(a):a}function E(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.__wrapper8e3dd93a60__=b)}function F(a,b,c){S.get=c,M(a.prototype,b,S)}function G(a,b){F(a,b,function(){return y(this.__impl4cf1e782hg__[b])})}function H(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=D(this);return a[b].apply(a,arguments)}})})}var I=new WeakMap,J=new WeakMap,K=Object.create(null),L=b(),M=Object.defineProperty,N=Object.getOwnPropertyNames,O=Object.getOwnPropertyDescriptor,P={value:void 0,configurable:!0,enumerable:!1,writable:!0};N(window);var Q=/Firefox/.test(navigator.userAgent),R={get:function(){},set:function(){},configurable:!0,enumerable:!0},S={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=I,a.defineGetter=F,a.defineWrapGetter=G,a.forwardMethodsToWrapper=H,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=J,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=E,a.setWrapper=B,a.unsafeUnwrap=A,a.unwrap=z,a.unwrapIfNeeded=C,a.wrap=y,a.wrapIfNeeded=D,a.wrappers=K}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){for(p=!1;o.length;){var a=o;o=[],a.sort(function(a,b){return a.uid_-b.uid_});for(var b=0;b<a.length;b++){var c=a[b],d=c.takeRecords();f(c),d.length&&c.callback_(d,c)}}}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var p=!1;for(var q in f){var m=f[q],r=new d(c,a);"name"in e&&"namespace"in e&&(r.attributeName=e.name,r.attributeNamespace=e.namespace),e.addedNodes&&(r.addedNodes=e.addedNodes),e.removedNodes&&(r.removedNodes=e.removedNodes),e.previousSibling&&(r.previousSibling=e.previousSibling),e.nextSibling&&(r.nextSibling=e.nextSibling),void 0!==g[q]&&(r.oldValue=g[q]),m.records_.length||(o.push(m),p=!0),m.records_.push(r)}p&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={constructor:i,observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof S.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof S.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof S.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!U.get(a)&&(U.set(a,!0),n(R(a),R(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(V.get(b))throw new Error("InvalidStateError");V.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof S.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof S.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];
+i instanceof S.Document&&(g=i.defaultView)}return bb.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),Z.set(b,cb),X.delete(b,null),V.delete(b),b.defaultPrevented}function o(a,b,c,d){var e=db;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=eb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=fb,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=T.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===db)return!0;c===fb&&(c=eb)}else if(c===fb&&!b.bubbles)return!0;if("relatedTarget"in b){var i=Q(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=R(j),m=k(b,a,l);if(m===g)return!0}else m=null;Y.set(b,m)}}Z.set(b,c);var n=b.type,o=!1;W.set(b,g),X.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===db||r.capture&&c===fb))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),_.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!$.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof gb))return R(x(gb,"Event",a,b));var c=a;return rb||"beforeunload"!==c.type?void O(c,this):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:Q(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void O(b,this):R(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=Q(arguments[b]);var c=Q(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(pb)return new a(c,u(d));var e=Q(document.createEvent(b)),f=ob[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=Q(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){O(a,this)}function C(a){return a instanceof S.ShadowRoot&&(a=a.host),Q(a)}function D(a,b){var c=T.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=Q(a);c;c=c.parentNode)if(D(R(c),b))return!0;return!1}function F(a){K(a,tb)}function G(b,c,e,f){a.renderAllPending();var g=R(ub.call(P(c),e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=ab.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=ab.get(this);d||(d=Object.create(null),ab.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.setWrapper,P=a.unsafeUnwrap,Q=a.unwrap,R=a.wrap,S=a.wrappers,T=(new WeakMap,new WeakMap),U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=new WeakMap,bb=new WeakMap,cb=0,db=1,eb=2,fb=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var gb=window.Event;gb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return W.get(this)},get currentTarget(){return X.get(this)},get eventPhase(){return Z.get(this)},get path(){var a=bb.get(this);return a?a.slice():[]},stopPropagation:function(){$.set(this,!0)},stopImmediatePropagation:function(){$.set(this,!0),_.set(this,!0)}},N(gb,t,document.createEvent("Event"));var hb=v("UIEvent",t),ib=v("CustomEvent",t),jb={get relatedTarget(){var a=Y.get(this);return void 0!==a?a:R(Q(this).relatedTarget)}},kb=M({initMouseEvent:w("initMouseEvent",14)},jb),lb=M({initFocusEvent:w("initFocusEvent",5)},jb),mb=v("MouseEvent",hb,kb),nb=v("FocusEvent",hb,lb),ob=Object.create(null),pb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!pb){var qb=function(a,b,c){if(c){var d=ob[c];b=M(M({},d),b)}ob[a]=b};qb("Event",{bubbles:!1,cancelable:!1}),qb("CustomEvent",{detail:null},"Event"),qb("UIEvent",{view:null,detail:0},"Event"),qb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),qb("FocusEvent",{relatedTarget:null},"UIEvent")}var rb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return P(this).returnValue},set returnValue(a){P(this).returnValue=a}}),rb&&N(rb,y);var sb=window.EventTarget,tb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;tb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=T.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,T.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=T.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=Q(b),d=c.type;U.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return Q(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},sb&&N(sb,B);var ub=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=ib,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=nb,a.wrappers.MouseEvent=mb,a.wrappers.UIEvent=hb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,p)}function c(a){j(a,this)}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.setWrapper,k=a.unsafeUnwrap,l=a.wrap,m=window.TouchEvent;if(m){var n;try{n=document.createEvent("TouchEvent")}catch(o){return}var p={enumerable:!1};c.prototype={get target(){return l(k(this).target)}};var q={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){q.get=function(){return k(this)[a]},Object.defineProperty(c.prototype,a,q)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(k(this).touches)},get targetTouches(){return e(k(this).targetTouches)},get changedTouches(){return e(k(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(m,f,n),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,h)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=g(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(f(this)[b].apply(f(this),arguments))}}var f=a.unsafeUnwrap,g=a.wrap,h={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);P=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;P=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return K(b[0]);for(var d=K(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(K(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=K(b),e=d.parentNode;e&&W.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=K(a),g=f.firstChild;g;)c=g.nextSibling,W.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=M(c?Q.call(c,J(a),!1):R.call(J(a),!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof O.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof S),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unsafeUnwrap,K=a.unwrap,L=a.unwrapIfNeeded,M=a.wrap,N=a.wrapIfNeeded,O=a.wrappers,P=!1,Q=document.importNode,R=window.Node.prototype.cloneNode,S=window.Node,T=window.DocumentFragment,U=(S.prototype.appendChild,S.prototype.compareDocumentPosition),V=S.prototype.insertBefore,W=S.prototype.removeChild,X=S.prototype.replaceChild,Y=/Trident/.test(navigator.userAgent),Z=Y?function(a,b){try{W.call(a,b)}catch(c){if(!(a instanceof T))throw c}}:function(a,b){W.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=K(c):(d=c,c=M(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),V.call(J(this),K(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:J(this);j?V.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=K(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Z(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Z(J(this),f);return P||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=K(d):(e=d,d=M(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),X.call(J(this),K(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&X.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:M(J(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:M(J(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:M(J(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:M(J(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:M(J(this).previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=J(this).ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),J(this).textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,N(a))},compareDocumentPosition:function(a){return U.call(J(this),L(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(S,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c,d,e){for(var f=null,g=null,h=0,i=b.length;i>h;h++)f=s(b[h]),!e&&(g=q(f).root)&&g instanceof a.wrappers.ShadowRoot||(d[c++]=f);return c}function c(a){return String(a).replace(/\/deep\//g," ")}function d(a,b){for(var c,e=a.firstElementChild;e;){if(e.matches(b))return e;if(c=d(e,b))return c;e=e.nextElementSibling}return null}function e(a,b){return a.matches(b)}function f(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===D}function g(){return!0}function h(a,b,c){return a.localName===c}function i(a,b){return a.namespaceURI===b}function j(a,b,c){return a.namespaceURI===b&&a.localName===c}function k(a,b,c,d,e,f){for(var g=a.firstElementChild;g;)d(g,e,f)&&(c[b++]=g),b=k(g,b,c,d,e,f),g=g.nextElementSibling;return b}function l(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,null);if(i instanceof B)h=w.call(i,f);else{if(!(i instanceof C))return k(this,d,e,c,f,null);h=v.call(i,f)}return b(h,d,e,g)}function m(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=y.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=x.call(i,f,g)}return b(h,d,e,!1)}function n(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=A.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=z.call(i,f,g)}return b(h,d,e,!1)}var o=a.wrappers.HTMLCollection,p=a.wrappers.NodeList,q=a.getTreeScope,r=a.unsafeUnwrap,s=a.wrap,t=document.querySelector,u=document.documentElement.querySelector,v=document.querySelectorAll,w=document.documentElement.querySelectorAll,x=document.getElementsByTagName,y=document.documentElement.getElementsByTagName,z=document.getElementsByTagNameNS,A=document.documentElement.getElementsByTagNameNS,B=window.Element,C=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",E={querySelector:function(b){var e=c(b),f=e!==b;b=e;var g,h=r(this),i=q(this).root;if(i instanceof a.wrappers.ShadowRoot)return d(this,b);if(h instanceof B)g=s(u.call(h,b));else{if(!(h instanceof C))return d(this,b);g=s(t.call(h,b))}return g&&!f&&(i=q(g).root)&&i instanceof a.wrappers.ShadowRoot?d(this,b):g},querySelectorAll:function(a){var b=c(a),d=b!==a;a=b;var f=new p;return f.length=l.call(this,e,0,f,a,d),f}},F={getElementsByTagName:function(a){var b=new o,c="*"===a?g:f;return b.length=m.call(this,c,0,b,a,a.toLowerCase()),b},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new o,d=null;return d="*"===a?"*"===b?g:h:"*"===b?i:j,c.length=n.call(this,d,0,c,a||null,b),c}};a.GetElementsByInterface=F,a.SelectorsInterface=E}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return h(this).data},set data(a){var b=h(this).data;e(this,"characterData",{oldValue:b}),h(this).data=a}}),f(b.prototype,c),g(i,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){d(a,this),this.ownerElement_=b}var d=a.setWrapper,e=a.unsafeUnwrap;c.prototype={constructor:c,get length(){return e(this).length},item:function(a){return e(this).item(a)},contains:function(a){return e(this).contains(a)},add:function(){e(this).add.apply(e(this),arguments),b(this.ownerElement_)},remove:function(){e(this).remove.apply(e(this),arguments),b(this.ownerElement_)},toggle:function(){var a=e(this).toggle.apply(e(this),arguments);return b(this.ownerElement_),a},toString:function(){return e(this).toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unsafeUnwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);n(this).polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return n(this).polymerShadowRoot_||null},setAttribute:function(a,d){var e=n(this).getAttribute(a);n(this).setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=n(this).getAttribute(a);n(this).removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(n(this),a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(A,b)}function d(a){return a.replace(B,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",C[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&D[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof z.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=x(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(y(f))}function i(a){o.call(this,a)}function j(a,b){var c=x(a.cloneNode(!1));c.innerHTML=b;for(var d,e=x(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return y(e)}function k(b){return function(){return a.renderAllPending(),w(this)[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),w(this)[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),w(this)[b].apply(w(this),arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unsafeUnwrap,x=a.unwrap,y=a.wrap,z=a.wrappers,A=/[&\u00A0"]/g,B=/[&\u00A0<>]/g,C=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),E=/MSIE/.test(navigator.userAgent),F=window.HTMLElement,G=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(E&&D[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof z.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!G&&this instanceof z.HTMLTemplateElement?h(this.content,a):w(this).innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)},get hidden(){return this.hasAttribute("hidden")},set hidden(a){a?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(F,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=f(this).getContext.apply(f(this),arguments);return a&&g(a)}}),e(h,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),b.prototype.constructor=b,e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=i(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!m){var b=c(a);k.set(this,j(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=a.unwrap,j=a.wrap,k=new WeakMap,l=new WeakMap,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{constructor:d,get content(){return m?j(h(this).content):k.get(this)}}),m&&g(m,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;e&&(b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;h&&(b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())
+},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.SVGElementInstance;h&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return g(f(this).correspondingElement)},get correspondingUseElement(){return g(f(this).correspondingUseElement)},get parentNode(){return g(f(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return g(f(this).firstChild)},get lastChild(){return g(f(this).lastChild)},get previousSibling(){return g(f(this).previousSibling)},get nextSibling(){return g(f(this).nextSibling)}}),e(h,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrap,h=a.unwrapIfNeeded,i=a.wrap,j=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return i(f(this).canvas)},drawImage:function(){arguments[0]=h(arguments[0]),f(this).drawImage.apply(f(this),arguments)},createPattern:function(){return arguments[0]=g(arguments[0]),f(this).createPattern.apply(f(this),arguments)}}),d(j,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.WebGLRenderingContext;if(i){c(b.prototype,{get canvas(){return h(f(this).canvas)},texImage2D:function(){arguments[5]=g(arguments[5]),f(this).texImage2D.apply(f(this),arguments)},texSubImage2D:function(){arguments[6]=g(arguments[6]),f(this).texSubImage2D.apply(f(this),arguments)}});var j=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(i,b,j),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Range;b.prototype={get startContainer(){return h(e(this).startContainer)},get endContainer(){return h(e(this).endContainer)},get commonAncestorContainer(){return h(e(this).commonAncestorContainer)},setStart:function(a,b){e(this).setStart(g(a),b)},setEnd:function(a,b){e(this).setEnd(g(a),b)},setStartBefore:function(a){e(this).setStartBefore(g(a))},setStartAfter:function(a){e(this).setStartAfter(g(a))},setEndBefore:function(a){e(this).setEndBefore(g(a))},setEndAfter:function(a){e(this).setEndAfter(g(a))},selectNode:function(a){e(this).selectNode(g(a))},selectNodeContents:function(a){e(this).selectNodeContents(g(a))},compareBoundaryPoints:function(a,b){return e(this).compareBoundaryPoints(a,f(b))},extractContents:function(){return h(e(this).extractContents())},cloneContents:function(){return h(e(this).cloneContents())},insertNode:function(a){e(this).insertNode(g(a))},surroundContents:function(a){e(this).surroundContents(g(a))},cloneRange:function(){return h(e(this).cloneRange())},isPointInRange:function(a,b){return e(this).isPointInRange(g(a),b)},comparePoint:function(a,b){return e(this).comparePoint(g(a),b)},intersectsNode:function(a){return e(this).intersectsNode(g(a))},toString:function(){return e(this).toString()}},i.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return h(e(this).createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=l(k(a).ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;n.set(this,e),this.treeScope_=new d(this,g(e||a)),m.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unsafeUnwrap,l=a.unwrap,m=new WeakMap,n=new WeakMap,o=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{constructor:b,get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return n.get(this)||null},get host(){return m.get(this)||null},invalidateShadowRenderer:function(){return m.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return o.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=H(a),g=H(c),h=e?H(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=I(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=H(a),d=c.parentNode;if(d){var e=I(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){J.set(a,[])}function f(a){var b=J.get(a);return b||J.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<N.length;a++){var b=N[a],c=b.parentRenderer;c&&c.dirty||b.render()}N=[]}function i(){y=null,h()}function j(a){var b=L.get(a);return b||(b=new n(a),L.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=K.get(a);c?c.push(b):K.set(a,[b])}function r(a){return K.get(a)}function s(a){K.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!P.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unsafeUnwrap,H=a.unwrap,I=a.wrap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),N=[],O=new ArraySplice;O.equals=function(a,b){return H(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(H(b)),h=a||new WeakMap,i=O.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=I(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&I(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var a=this.parentRenderer;if(a&&a.invalidate(),N.push(this),y)return;y=window[M](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){G(a).polymerShadowRenderer_=this}};var P=/^(:not\()?[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=G(this).polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),G(this).polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}{var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap;window.Selection}b.prototype={get anchorNode(){return h(e(this).anchorNode)},get focusNode(){return h(e(this).focusNode)},addRange:function(a){e(this).addRange(f(a))},collapse:function(a,b){e(this).collapse(g(a),b)},containsNode:function(a,b){return e(this).containsNode(g(a),b)},extend:function(a,b){e(this).extend(g(a),b)},getRangeAt:function(a){return h(e(this).getRangeAt(a))},removeRange:function(a){e(this).removeRange(f(a))},selectAllChildren:function(a){e(this).selectAllChildren(g(a))},toString:function(){return e(this).toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return C(c.apply(A(this),arguments))}}function d(a,b){F.call(A(b),B(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){z(a,this)}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return C(c.apply(A(this),arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(A(this),arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.setWrapper,A=a.unsafeUnwrap,B=a.unwrap,C=a.wrap,D=a.wrapEventTargetMethods,E=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var F=document.adoptNode,G=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,A(this))},getSelection:function(){return x(),new m(G.call(B(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var H=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void z(a,this):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){C(this)instanceof d||y(this),b.apply(C(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);H.call(B(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=E.get(this);return a?a:(a=new g(B(this).implementation),E.set(this,a),a)},get defaultView(){return C(B(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getDefaultComputedStyle,n=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},m&&(k.prototype.getDefaultComputedStyle=function(a,b){return j(this||window).getDefaultComputedStyle(i(a),b)}),k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(n.call(h(this)))},get document(){return j(h(this).document)}}),m&&(b.prototype.getDefaultComputedStyle=function(a,b){return g(),m.call(h(this),i(a),b)}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b;b=a instanceof f?a:new f(a&&e(a)),d(b,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unwrap,f=window.FormData;c(f,b,new f),a.wrappers.FormData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=Array.prototype.slice.call(g.sheet.cssRules,0),b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b<shadowDOMSelectorsRe.length;b++)a=a.replace(shadowDOMSelectorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){a.type===CSSRule.KEYFRAMES_RULE&&a.cssRules&&(c+=this.ieSafeCssTextFromKeyFrameRule(a))}},this),c},ieSafeCssTextFromKeyFrameRule:function(a){var b="@keyframes "+a.name+" {";return Array.prototype.forEach.call(a.cssRules,function(a){b+=" "+a.keyText+" {"+a.style.cssText+"}"}),b+=" }"},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var b="link[rel=stylesheet]["+y+"]",c="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+b,HTMLImports.importer.importsPreloadSelectors+=","+b,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,b,c].join(",");var d=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var b=a.__importElement||a;if(!b.hasAttribute(y))return void d.call(this,a);
+a.__resource&&(b=a.ownerDocument.createElement("style"),b.textContent=a.__resource),HTMLImports.path.resolveUrlsInStyle(b),b.textContent=k.shimStyle(b),b.removeAttribute(y,""),b.setAttribute(z,""),b[z]=!0,b.parentNode!==C&&(a.parentNode===C?C.replaceChild(b,a):this.addElementToDocument(b)),b.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var e=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:e.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}})}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}};var r=a.URL;r&&(i.createObjectURL=function(){return r.createObjectURL.apply(r,arguments)},i.revokeObjectURL=function(a){r.revokeObjectURL(a)}),a.URL=i}}(this),function(){Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}})}(window.Platform),function(a){"use strict";if(!window.performance){var b=Date.now();window.performance={now:function(){return Date.now()-b}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var c=[],d=function(){Array.prototype.push.call(arguments,document._currentScript),c.push(arguments)};window.Polymer=d,a.consumeDeclarations=function(b){a.consumeDeclarations=function(){throw"Possible attempt to load Polymer twice"},b&&b(c),c=null},window.addEventListener("DOMContentLoaded",function(){window.Polymer===d&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})})}(window.Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){function b(a,b){b=b||o,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a){a.target.__loaded=!0}function f(a,b){function c(){h==i&&a&&a()}function d(a){e(a),h++,c()}var f=b.querySelectorAll("link[rel=import]"),h=0,i=f.length;if(i)for(var j,k=0;i>k&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return l?a.__loaded:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a.import;b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=g,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;for(var f,g=this.pending[a],h=0,i=g.length;i>h&&(f=g[h]);h++)this.onload(a,f,d,c,e),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:a;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b=d(a);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(b)}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=a.isIE,j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import&&(a.import.__importParsed=!0),this.markParsingComplete(a),a.dispatchEvent(a.__resource&&!a.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),this.addElementToDocument(a)},rootImportForElement:function(a){for(var b=a;b.ownerDocument.__importLink;)b=b.ownerDocument.__importLink;return b},addElementToDocument:function(a){for(var b=this.rootImportForElement(a.__importElement||a),c=b.__insertedElements=b.__insertedElements||0,d=b.nextElementSibling,e=0;c>e;e++)d=d&&d.nextElementSibling;b.parentNode.insertBefore(a,d)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),this.addElementToDocument(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){if(a)for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&void 0===a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n}(HTMLImports),function(a){function b(a){return c(a,g)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(g)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}var e=a.useNative,f=a.flags,g="import",h=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(e)var i={};else{var j=(a.xhr,a.Loader),k=a.parser,i={documents:{},documentPreloadSelectors:"link[rel="+g+"]",importsPreloadSelectors:["link[rel="+g+"]"].join(","),loadNode:function(a){l.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);l.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===h?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e,g,h){if(f.load&&console.log("loaded",a,c),c.__resource=e,c.__error=g,b(c)){var i=this.documents[a];void 0===i&&(i=g?null:d(e,h||a),i&&(i.__importLink=c,this.bootDocument(i)),this.documents[a]=i),c.import=i}k.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),k.parseNext()},loadedAll:function(){k.parseNext()}},l=new j(i.loaded.bind(i),i.loadedAll.bind(i));if(!document.baseURI){var m={get:function(){var a=document.querySelector("base");return a?a.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",m),Object.defineProperty(h,"baseURI",m)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c})}a.importer=i,a.IMPORT_LINK_TYPE=g,a.importLoader=l}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);
+if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)}),CustomElements.ready=!0,setTimeout(function(){CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,Boolean(b.bubbles),Boolean(b.cancelable),b.detail),c},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window);
 //# 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 e84a66b..096554d 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/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLFormElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/FormData.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","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/base.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","src/styleloader.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        var hasValue = entry[0] === key;\n        entry[0] = entry[1] = undefined;\n        return hasValue;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// 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    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  // The name of the implementation property is intentionally hard to\n  // remember. Unfortunately, browsers are slower doing obj[expr] than\n  // obj.foo so we resort to repeat this ugly name. This ugly name is never\n  // used outside of this file though.\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name) :\n        function() { return this.__impl4cf1e782hg__[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :\n        function(v) { this.__impl4cf1e782hg__[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name +\n                     '.apply(this.__impl4cf1e782hg__, arguments)') :\n        function() {\n          return this.__impl4cf1e782hg__[name].apply(\n              this.__impl4cf1e782hg__, arguments);\n        };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ ||\n        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.setWrapper = setWrapper;\n  scope.unsafeUnwrap = unsafeUnwrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(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    constructor: MutationObserver,\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        setWrapper(type, this);\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return unsafeUnwrap(this).returnValue;\n    },\n    set returnValue(v) {\n      unsafeUnwrap(this).returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element =\n        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(\n          unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));\n    else\n      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        unsafeUnwrap(this).textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this),\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n  var getTreeScope = scope.getTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var originalDocumentQuerySelector = document.querySelector;\n  var originalElementQuerySelector = document.documentElement.querySelector;\n\n  var originalDocumentQuerySelectorAll = document.querySelectorAll;\n  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n\n  var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n\n  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n\n  var OriginalElement = window.Element;\n  var OriginalDocument = window.HTMLDocument || window.Document;\n\n  function filterNodeList(list, index, result, deep) {\n    var wrappedItem = null;\n    var root = null;\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrappedItem = wrap(list[i]);\n      if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          continue;\n        }\n      }\n      result[index++] = wrappedItem;\n    }\n\n    return index;\n  }\n\n  function shimSelector(selector) {\n    return String(selector).replace(/\\/deep\\//g, ' ');\n  }\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalNameOnly(el, ns, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, index, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[index++] = el;\n      index = findElements(el, index, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return index;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  function querySelectorAllFiltered(p, index, result, selector, deep) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementQuerySelectorAll.call(target, selector);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentQuerySelectorAll.call(target, selector);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    }\n\n    return filterNodeList(list, index, result, deep);\n  }\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var target = unsafeUnwrap(this);\n      var wrappedItem;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\n        // We are in the shadow tree and the logical tree is\n        // going to be disconnected so we do a manual tree traversal\n        return findOne(this, selector);\n      } else if (target instanceof OriginalElement) {\n        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));\n      } else if (target instanceof OriginalDocument) {\n        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));\n      } else {\n        // When we get a ShadowRoot the logical tree is going to be disconnected\n        // so we do a manual tree traversal\n        return findOne(this, selector);\n      }\n\n      if (!wrappedItem) {\n        // When the original query returns nothing\n        // we return nothing (to be consistent with the other wrapped calls)\n        return wrappedItem;\n      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          // When the original query returns an element in the ShadowDOM\n          // we must do a manual tree traversal\n          return findOne(this, selector);\n        }\n      }\n\n      return wrappedItem;\n    },\n    querySelectorAll: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var result = new NodeList();\n\n      result.length = querySelectorAllFiltered.call(this,\n          matchesSelector,\n          0,\n          result,\n          selector,\n          deep);\n\n      return result;\n    }\n  };\n\n  function getElementsByTagNameFiltered(p, index, result, localName,\n                                        lowercase) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagName.call(target, localName,\n                                                      lowercase);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagName.call(target, localName,\n                                                       lowercase);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      var match = localName === '*' ? matchesEveryThing : matchesTagName;\n\n      result.length = getElementsByTagNameFiltered.call(this,\n          match,\n          0,\n          result,\n          localName,\n          localName.toLowerCase());\n\n      return result;\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n      var match = null;\n\n      if (ns === '*') {\n        match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;\n      } else {\n        match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;\n      }\n\n      result.length = getElementsByTagNameNSFiltered.call(this,\n          match,\n          0,\n          result,\n          ns || null,\n          localName);\n\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return unsafeUnwrap(this).data;\n    },\n    set data(value) {\n      var oldValue = unsafeUnwrap(this).data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      unsafeUnwrap(this).data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    setWrapper(impl, this);\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    constructor: DOMTokenList,\n    get length() {\n      return unsafeUnwrap(this).length;\n    },\n    item: function(index) {\n      return unsafeUnwrap(this).item(index);\n    },\n    contains: function(token) {\n      return unsafeUnwrap(this).contains(token);\n    },\n    add: function() {\n      unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return unsafeUnwrap(this).polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(unsafeUnwrap(this), selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unsafeUnwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unsafeUnwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        unsafeUnwrap(this).innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    },\n\n    get hidden() {\n      return this.hasAttribute('hidden');\n    },\n    set hidden(v) {\n      if (v) {\n        this.setAttribute('hidden', '');\n      } else {\n        this.removeAttribute('hidden');\n      }\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return unsafeUnwrap(this)[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        unsafeUnwrap(this)[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    constructor: HTMLContentElement,\n\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    constructor: HTMLTemplateElement,\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(unsafeUnwrap(this).content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  if (!OriginalHTMLMediaElement) return;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  if (!OriginalHTMLAudioElement) return;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    constructor: HTMLTableSectionElement,\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(unsafeUnwrap(this).correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(unsafeUnwrap(this).correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(unsafeUnwrap(this).nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    setWrapper(impl, this);\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(unsafeUnwrap(this).startContainer);\n    },\n    get endContainer() {\n      return wrap(unsafeUnwrap(this).endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(unsafeUnwrap(this).commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(unsafeUnwrap(this).extractContents());\n    },\n    cloneContents: function() {\n      return wrap(unsafeUnwrap(this).cloneContents());\n    },\n    insertNode: function(node) {\n      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(unsafeUnwrap(this).cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(unsafeUnwrap(this).createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    constructor: ShadowRoot,\n\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  //   negation\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    setWrapper(impl, this);\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(unsafeUnwrap(this).anchorNode);\n    },\n    get focusNode() {\n      return wrap(unsafeUnwrap(this).focusNode);\n    },\n    addRange: function(range) {\n      unsafeUnwrap(this).addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(unsafeUnwrap(this).getRangeAt(index));\n    },\n    removeRange: function(range) {\n      unsafeUnwrap(this).removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, unsafeUnwrap(this));\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        setWrapper(node, this);\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    setWrapper(impl, this);\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(unsafeUnwrap(this), arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getDefaultComputedStyle(\n          unwrapIfNeeded(el), pseudo);\n    };\n  }\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getDefaultComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      renderAllPending();\n      return originalGetDefaultComputedStyle.call(unwrap(this),\n          unwrapIfNeeded(el),pseudo);\n    };\n  }\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    var impl;\n    if (formElement instanceof OriginalFormData) {\n      impl = formElement;\n    } else {\n      impl = new OriginalFormData(formElement && unwrap(formElement));\n    }\n    setWrapper(impl, this);\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // 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]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim,  \n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = 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            this.addElementToDocument(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  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  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// 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        // 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, 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 */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\n\nisIE = /Trident/.test(navigator.userAgent);\n\n// TODO(sorvell): SD polyfill intrusion\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\nvar wrap = function(node) {\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n};\nvar mainDoc = wrap(document);\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    var script = HTMLImports.currentScript || document.currentScript ||\n        // NOTE: only works when called in synchronously executing code.\n        // readyState should check if `loading` but IE10 is \n        // interactive when scripts run so we cheat.\n        (document.readyState !== 'complete' ? \n        document.scripts[document.scripts.length - 1] : null);\n    return wrap(script);\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\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 = 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\n// NOTE: test for native imports loading is based on explicitly watching\n// all imports (see below).\nfunction isImportLoaded(link) {\n  return useNative ? link.__loaded : 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// 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.\nwhenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  mainDoc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n// exports\nscope.useNative = useNative;\nscope.isImportLoaded = isImportLoaded;\nscope.whenReady = whenImportsReady;\nscope.isIE = isIE;\n\n// deprecated\nscope.whenImportsReady = whenImportsReady;\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        // If url was redirected, use the redirected location so paths are\n        // calculated relative to that.\n        this.onload(url, p, resource, err, redirectedUrl);\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : locationHeader;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIE = scope.isIE;\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    if (elt.import) {\n      elt.import.__importParsed = true;\n    }\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource && !elt.__error) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\n  rootImportForElement: function(elt) {\n    var n = elt;\n    while (n.ownerDocument.__importLink) {\n      n = n.ownerDocument.__importLink;\n    }\n    return n;\n  },\n  addElementToDocument: function(elt) {\n    var port = this.rootImportForElement(elt.__importElement || elt);\n    var l = port.__insertedElements = port.__insertedElements || 0;\n    var refNode = port.nextElementSibling;\n    for (var i=0; i < l; i++) {\n      refNode = refNode && refNode.nextElementSibling;\n    }\n    port.parentNode.insertBefore(elt, refNode);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIE && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    this.addElementToDocument(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    if (doc) {\n      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n        if (!this.isParsed(n)) {\n          if (this.hasResource(n)) {\n            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n          } else {\n            return;\n          }\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n (function(scope) {\n\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (doc === undefined) {\n          // generate an HTMLDocument from data\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            // note, we cannot use MO to detect parsed nodes because\n            // SD polyfill does not report these as mutations.\n            this.bootDocument(doc);\n          }\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n\n  // Polyfill document.baseURI for browsers without it.\n  if (!document.baseURI) {\n    var baseURIDescriptor = {\n      get: function() {\n        var base = document.querySelector('base');\n        return base ? base.href : window.location.href;\n      },\n      configurable: true\n    };\n\n    Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n    Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n  }\n\n  // IE shim for CustomEvent\n  if (typeof window.CustomEvent !== 'function') {\n    window.CustomEvent = function(inType, dictionary) {\n       var e = document.createEvent('HTMLEvents');\n       e.initEvent(inType,\n          dictionary.bubbles === false ? false : true,\n          dictionary.cancelable === false ? false : true,\n          dictionary.detail);\n       return e;\n    };\n  }\n\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// exports\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.importLoader = importLoader;\n\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(){\n\n// bootstrap\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Implements `document.registerElement`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // install upgrade hook if HTMLImports are available\n  if (window.HTMLImports) {\n    HTMLImports.__importsParsingHook = function(elt) {\n      CustomElements.parser.parse(elt.import);\n    }\n  }\n  // set internal 'ready' flag, now document.registerElement will trigger \n  // synchronous upgrades\n  CustomElements.ready = true;\n  // async to ensure *native* custom elements upgrade prior to this\n  // DOMContentLoaded can fire before elements upgrade (e.g. when there's\n  // an external script)\n  setTimeout(function() {\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, params) {\n    params = params || {};\n    var e = document.createEvent('CustomEvent');\n    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n    return e;\n  };\n  window.CustomEvent.prototype = window.Event.prototype;\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  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(this.iterator_.getUpdatedValue());\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      var ifValue = true;\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        ifValue = deps.ifValue;\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !ifValue) {\n          this.valueChanged();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          ifValue = ifValue.open(this.updateIfValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      var value = deps.value;\n      if (!deps.oneTime)\n        value = value.open(this.updateIteratedValue, this);\n\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(value);\n    },\n\n    /**\n     * Gets the updated value of the bind/repeat. This can potentially call\n     * user code (if a bindingDelegate is set up) so we try to avoid it if we\n     * already have the value in hand (from Observer.open).\n     */\n    getUpdatedValue: function() {\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      return value;\n    },\n\n    updateIfValue: function(ifValue) {\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(this.getUpdatedValue());\n    },\n\n    updateIteratedValue: function(value) {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      this.updateValue(value);\n    },\n\n    updateValue: function(value) {\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\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","build/if-poly.js","../observe-js/src/observe.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLFormElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/FormData.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/base.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/unresolved.js","src/module.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        var hasValue = entry[0] === key;\n        entry[0] = entry[1] = undefined;\n        return hasValue;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  // The name of the implementation property is intentionally hard to\n  // remember. Unfortunately, browsers are slower doing obj[expr] than\n  // obj.foo so we resort to repeat this ugly name. This ugly name is never\n  // used outside of this file though.\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name) :\n        function() { return this.__impl4cf1e782hg__[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :\n        function(v) { this.__impl4cf1e782hg__[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name +\n                     '.apply(this.__impl4cf1e782hg__, arguments)') :\n        function() {\n          return this.__impl4cf1e782hg__[name].apply(\n              this.__impl4cf1e782hg__, arguments);\n        };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ ||\n        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.setWrapper = setWrapper;\n  scope.unsafeUnwrap = unsafeUnwrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback() {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    while (globalMutationObservers.length) {\n      var notifyList = globalMutationObservers;\n      globalMutationObservers = [];\n\n      // Deliver changes in birth order of the MutationObservers.\n      notifyList.sort(function(x, y) { return x.uid_ - y.uid_; });\n\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n        }\n      }\n    }\n  }\n\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyObserversEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      if (!observer.records_.length) {\n        globalMutationObservers.push(observer);\n        anyObserversEnqueued = true;\n      }\n      observer.records_.push(record);\n    }\n\n    if (anyObserversEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  MutationObserver.prototype = {\n    constructor: MutationObserver,\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        setWrapper(type, this);\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return unsafeUnwrap(this).returnValue;\n    },\n    set returnValue(v) {\n      unsafeUnwrap(this).returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element =\n        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(\n          unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));\n    else\n      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        unsafeUnwrap(this).textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this),\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n  var getTreeScope = scope.getTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var originalDocumentQuerySelector = document.querySelector;\n  var originalElementQuerySelector = document.documentElement.querySelector;\n\n  var originalDocumentQuerySelectorAll = document.querySelectorAll;\n  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n\n  var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n\n  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n\n  var OriginalElement = window.Element;\n  var OriginalDocument = window.HTMLDocument || window.Document;\n\n  function filterNodeList(list, index, result, deep) {\n    var wrappedItem = null;\n    var root = null;\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrappedItem = wrap(list[i]);\n      if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          continue;\n        }\n      }\n      result[index++] = wrappedItem;\n    }\n\n    return index;\n  }\n\n  function shimSelector(selector) {\n    return String(selector).replace(/\\/deep\\//g, ' ');\n  }\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalNameOnly(el, ns, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, index, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[index++] = el;\n      index = findElements(el, index, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return index;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  function querySelectorAllFiltered(p, index, result, selector, deep) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementQuerySelectorAll.call(target, selector);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentQuerySelectorAll.call(target, selector);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    }\n\n    return filterNodeList(list, index, result, deep);\n  }\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var target = unsafeUnwrap(this);\n      var wrappedItem;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\n        // We are in the shadow tree and the logical tree is\n        // going to be disconnected so we do a manual tree traversal\n        return findOne(this, selector);\n      } else if (target instanceof OriginalElement) {\n        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));\n      } else if (target instanceof OriginalDocument) {\n        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));\n      } else {\n        // When we get a ShadowRoot the logical tree is going to be disconnected\n        // so we do a manual tree traversal\n        return findOne(this, selector);\n      }\n\n      if (!wrappedItem) {\n        // When the original query returns nothing\n        // we return nothing (to be consistent with the other wrapped calls)\n        return wrappedItem;\n      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          // When the original query returns an element in the ShadowDOM\n          // we must do a manual tree traversal\n          return findOne(this, selector);\n        }\n      }\n\n      return wrappedItem;\n    },\n    querySelectorAll: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var result = new NodeList();\n\n      result.length = querySelectorAllFiltered.call(this,\n          matchesSelector,\n          0,\n          result,\n          selector,\n          deep);\n\n      return result;\n    }\n  };\n\n  function getElementsByTagNameFiltered(p, index, result, localName,\n                                        lowercase) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagName.call(target, localName,\n                                                      lowercase);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagName.call(target, localName,\n                                                       lowercase);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      var match = localName === '*' ? matchesEveryThing : matchesTagName;\n\n      result.length = getElementsByTagNameFiltered.call(this,\n          match,\n          0,\n          result,\n          localName,\n          localName.toLowerCase());\n\n      return result;\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n      var match = null;\n\n      if (ns === '*') {\n        match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;\n      } else {\n        match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;\n      }\n\n      result.length = getElementsByTagNameNSFiltered.call(this,\n          match,\n          0,\n          result,\n          ns || null,\n          localName);\n\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return unsafeUnwrap(this).data;\n    },\n    set data(value) {\n      var oldValue = unsafeUnwrap(this).data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      unsafeUnwrap(this).data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    setWrapper(impl, this);\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    constructor: DOMTokenList,\n    get length() {\n      return unsafeUnwrap(this).length;\n    },\n    item: function(index) {\n      return unsafeUnwrap(this).item(index);\n    },\n    contains: function(token) {\n      return unsafeUnwrap(this).contains(token);\n    },\n    add: function() {\n      unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return unsafeUnwrap(this).polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(unsafeUnwrap(this), selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unsafeUnwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unsafeUnwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        unsafeUnwrap(this).innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    },\n\n    get hidden() {\n      return this.hasAttribute('hidden');\n    },\n    set hidden(v) {\n      if (v) {\n        this.setAttribute('hidden', '');\n      } else {\n        this.removeAttribute('hidden');\n      }\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return unsafeUnwrap(this)[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        unsafeUnwrap(this)[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    constructor: HTMLContentElement,\n\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    constructor: HTMLTemplateElement,\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(unsafeUnwrap(this).content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  if (!OriginalHTMLMediaElement) return;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  if (!OriginalHTMLAudioElement) return;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    constructor: HTMLTableSectionElement,\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(unsafeUnwrap(this).correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(unsafeUnwrap(this).correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(unsafeUnwrap(this).nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    setWrapper(impl, this);\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(unsafeUnwrap(this).startContainer);\n    },\n    get endContainer() {\n      return wrap(unsafeUnwrap(this).endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(unsafeUnwrap(this).commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(unsafeUnwrap(this).extractContents());\n    },\n    cloneContents: function() {\n      return wrap(unsafeUnwrap(this).cloneContents());\n    },\n    insertNode: function(node) {\n      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(unsafeUnwrap(this).cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(unsafeUnwrap(this).createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    constructor: ShadowRoot,\n\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  //   negation\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    setWrapper(impl, this);\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(unsafeUnwrap(this).anchorNode);\n    },\n    get focusNode() {\n      return wrap(unsafeUnwrap(this).focusNode);\n    },\n    addRange: function(range) {\n      unsafeUnwrap(this).addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(unsafeUnwrap(this).getRangeAt(index));\n    },\n    removeRange: function(range) {\n      unsafeUnwrap(this).removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, unsafeUnwrap(this));\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        setWrapper(node, this);\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    setWrapper(impl, this);\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(unsafeUnwrap(this), arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getDefaultComputedStyle(\n          unwrapIfNeeded(el), pseudo);\n    };\n  }\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getDefaultComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      renderAllPending();\n      return originalGetDefaultComputedStyle.call(unwrap(this),\n          unwrapIfNeeded(el),pseudo);\n    };\n  }\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    var impl;\n    if (formElement instanceof OriginalFormData) {\n      impl = formElement;\n    } else {\n      impl = new OriginalFormData(formElement && unwrap(formElement));\n    }\n    setWrapper(impl, this);\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // KEYFRAMES_RULE in IE throws when we query cssText\n          // when it contains a -webkit- property.\n          // if this happens, we fallback to constructing the rule\n          // from the CSSRuleSet\n          // https://connect.microsoft.com/IE/feedbackdetail/view/955703/accessing-csstext-of-a-keyframe-rule-that-contains-a-webkit-property-via-cssom-generates-exception\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {\n              cssText += this.ieSafeCssTextFromKeyFrameRule(rule);\n            }\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  ieSafeCssTextFromKeyFrameRule: function(rule) {\n    var cssText = '@keyframes ' + rule.name + ' {';\n    Array.prototype.forEach.call(rule.cssRules, function(rule) {\n      cssText += ' ' + rule.keyText + ' {' + rule.style.cssText + '}';\n    });\n    cssText += ' }';\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim,  \n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = Array.prototype.slice.call(style.sheet.cssRules, 0);\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = elt.__resource;\n        }\n        // relay on HTMLImports for path fixup\n        HTMLImports.path.resolveUrlsInStyle(style);\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            this.addElementToDocument(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    Array.prototype.push.call(arguments, document._currentScript);\n    elementDeclarations.push(arguments);\n  };\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.consumeDeclarations = function(callback) {\n    scope.consumeDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    if (callback) {\n      callback(elementDeclarations);\n    }\n    elementDeclarations = null;\n  };\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n})(window.Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded : link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        // If url was redirected, use the redirected location so paths are\n        // calculated relative to that.\n        this.onload(url, p, resource, err, redirectedUrl);\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : locationHeader;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIE = scope.isIE;\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    if (elt.import) {\n      elt.import.__importParsed = true;\n    }\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource && !elt.__error) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\n  rootImportForElement: function(elt) {\n    var n = elt;\n    while (n.ownerDocument.__importLink) {\n      n = n.ownerDocument.__importLink;\n    }\n    return n;\n  },\n  addElementToDocument: function(elt) {\n    var port = this.rootImportForElement(elt.__importElement || elt);\n    var l = port.__insertedElements = port.__insertedElements || 0;\n    var refNode = port.nextElementSibling;\n    for (var i=0; i < l; i++) {\n      refNode = refNode && refNode.nextElementSibling;\n    }\n    port.parentNode.insertBefore(elt, refNode);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIE && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    this.addElementToDocument(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    if (doc) {\n      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n        if (!this.isParsed(n)) {\n          if (this.hasResource(n)) {\n            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n          } else {\n            return;\n          }\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n (function(scope) {\n\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (doc === undefined) {\n          // generate an HTMLDocument from data\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            // note, we cannot use MO to detect parsed nodes because\n            // SD polyfill does not report these as mutations.\n            this.bootDocument(doc);\n          }\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n\n  // Polyfill document.baseURI for browsers without it.\n  if (!document.baseURI) {\n    var baseURIDescriptor = {\n      get: function() {\n        var base = document.querySelector('base');\n        return base ? base.href : window.location.href;\n      },\n      configurable: true\n    };\n\n    Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n    Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n  }\n\n  // IE shim for CustomEvent\n  if (typeof window.CustomEvent !== 'function') {\n    window.CustomEvent = function(inType, dictionary) {\n       var e = document.createEvent('HTMLEvents');\n       e.initEvent(inType,\n          dictionary.bubbles === false ? false : true,\n          dictionary.cancelable === false ? false : true,\n          dictionary.detail);\n       return e;\n    };\n  }\n\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// exports\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.importLoader = importLoader;\n\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(){\n\n// bootstrap\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Implements `document.registerElement`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // install upgrade hook if HTMLImports are available\n  if (window.HTMLImports) {\n    HTMLImports.__importsParsingHook = function(elt) {\n      CustomElements.parser.parse(elt.import);\n    }\n  }\n  // set internal 'ready' flag, now document.registerElement will trigger \n  // synchronous upgrades\n  CustomElements.ready = true;\n  // async to ensure *native* custom elements upgrade prior to this\n  // DOMContentLoaded can fire before elements upgrade (e.g. when there's\n  // an external script)\n  setTimeout(function() {\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, params) {\n    params = params || {};\n    var e = document.createEvent('CustomEvent');\n    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n    return e;\n  };\n  window.CustomEvent.prototype = window.Event.prototype;\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n"]}
\ No newline at end of file
diff --git a/pkg/web_components/pubspec.yaml b/pkg/web_components/pubspec.yaml
index 1e85cdd..a61eb21 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.6.0+1
+version: 0.7.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/runtime/bin/dbg_message.cc b/runtime/bin/dbg_message.cc
index 8d22bb4..30eb730 100644
--- a/runtime/bin/dbg_message.cc
+++ b/runtime/bin/dbg_message.cc
@@ -132,20 +132,20 @@
   Dart_Handle res = Dart_StringLength(str, &str_len);
   ASSERT_NOT_ERROR(res);
   intptr_t num_chars = (str_len > max_chars) ? max_chars : str_len;
-  uint16_t* codepoints =
+  uint16_t* codeunits =
       reinterpret_cast<uint16_t*>(malloc(num_chars * sizeof(uint16_t)));
-  ASSERT(codepoints != NULL);
+  ASSERT(codeunits != NULL);
   intptr_t actual_len = num_chars;
-  res = Dart_StringToUTF16(str, codepoints, &actual_len);
+  res = Dart_StringToUTF16(str, codeunits, &actual_len);
   ASSERT_NOT_ERROR(res);
   ASSERT(num_chars == actual_len);
   for (int i = 0; i < num_chars; i++) {
-    buf->AddEscapedChar(codepoints[i]);
+    buf->EscapeAndAddCodeUnit(codeunits[i]);
   }
   if (str_len > max_chars) {
     buf->Printf("...");
   }
-  free(codepoints);
+  free(codeunits);
 }
 
 
@@ -153,17 +153,17 @@
   intptr_t str_len = 0;
   Dart_Handle res = Dart_StringLength(str, &str_len);
   ASSERT_NOT_ERROR(res);
-  uint16_t* codepoints =
+  uint16_t* codeunits =
       reinterpret_cast<uint16_t*>(malloc(str_len * sizeof(uint16_t)));
-  ASSERT(codepoints != NULL);
+  ASSERT(codeunits != NULL);
   intptr_t actual_len = str_len;
-  res = Dart_StringToUTF16(str, codepoints, &actual_len);
+  res = Dart_StringToUTF16(str, codeunits, &actual_len);
   ASSERT_NOT_ERROR(res);
   ASSERT(str_len == actual_len);
   for (int i = 0; i < str_len; i++) {
-    buf->AddEscapedChar(codepoints[i]);
+    buf->EscapeAndAddCodeUnit(codeunits[i]);
   }
-  free(codepoints);
+  free(codeunits);
 }
 
 
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 4f5e752..b96d513 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -73,7 +73,7 @@
 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;
+static int vm_service_server_port = -1;
 
 // The environment provided through the command line using -D options.
 static dart::HashMap* environment = NULL;
@@ -690,21 +690,7 @@
   // closures and setting up 'package root' for URI resolution.
   result = DartUtils::PrepareForScriptLoading(package_root, builtin_lib);
   CHECK_RESULT(result);
-  Platform::SetPackageRoot(package_root);
-  Dart_Handle io_lib_url = DartUtils::NewString(DartUtils::kIOLibURL);
-  CHECK_RESULT(io_lib_url);
-  Dart_Handle io_lib = Dart_LookupLibrary(io_lib_url);
-  CHECK_RESULT(io_lib);
-  Dart_Handle platform_type = DartUtils::GetDartType(DartUtils::kIOLibURL,
-                                                     "_Platform");
-  CHECK_RESULT(platform_type);
-  Dart_Handle script_name = DartUtils::NewString("_nativeScript");
-  CHECK_RESULT(script_name);
-  Dart_Handle dart_script = DartUtils::NewString(script_uri);
-  CHECK_RESULT(dart_script);
-  Dart_Handle set_script_name =
-      Dart_SetField(platform_type, script_name, dart_script);
-  CHECK_RESULT(set_script_name);
+
   Dart_ExitScope();
   Dart_ExitIsolate();
   return isolate;
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index a165f93..9e374ae 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -120,6 +120,8 @@
       native "Process_ClearSignalHandler";
 }
 
+Function _getWatchSignalInternal() => _ProcessUtils._watchSignalInternal;
+
 
 patch class _ProcessUtils {
   /* patch */ static void _exit(int status) native "Process_Exit";
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 23e3f9e..d598e27 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -568,13 +568,11 @@
       return null;
     }
     if (result != null) {
-      if (Platform.isMacOS) {
-        // Mac includes the header size, so we need to query the actual
-        // available.
-        available = nativeAvailable();
-      } else {
-        available -= result.data.length;
-      }
+      // Read the next available. Available is only for the next datagram, not
+      // the sum of all datagrams pending, so we need to call after each
+      // receive. If available becomes > 0, the _NativeSocket will continue to
+      // emit read events.
+      available = nativeAvailable();
       totalRead += result.data.length;
     }
     readCount++;
diff --git a/runtime/bin/vmservice/observatory/deploy.sh b/runtime/bin/vmservice/observatory/deploy.sh
index 1b7a608..7cf4caf 100755
--- a/runtime/bin/vmservice/observatory/deploy.sh
+++ b/runtime/bin/vmservice/observatory/deploy.sh
@@ -20,5 +20,6 @@
 EXCLUDE="$EXCLUDE --exclude *.precompiled.js"
 EXCLUDE="$EXCLUDE --exclude main.*"
 EXCLUDE="$EXCLUDE --exclude unittest"
+EXCLUDE="$EXCLUDE --exclude *_buildLogs*"
 
 rsync -av --progress build/web/ deployed/web/ $EXCLUDE
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index.html b/runtime/bin/vmservice/observatory/deployed/web/index.html
index 8b368eb..0b0af81 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/index.html
@@ -1,4 +1,5 @@
-<!DOCTYPE html><html><head>
+<!DOCTYPE html><html><head><script src="packages/web_components/dart_support.js"></script>
+
   <meta charset="utf-8">
   <title>Dart VM Observatory</title>
   
@@ -73,15 +74,23 @@
 }
 
 html /deep/ [flex] {
-  -ms-flex: 1;
+  -ms-flex: 1 1 0.000000001px;
   -webkit-flex: 1;
   flex: 1;
+  -webkit-flex-basis: 0.000000001px;
+  flex-basis: 0.000000001px;
+}
+
+html /deep/ [vertical][layout] > [flex][auto-vertical], html /deep/ [vertical][layout]::shadow [flex][auto-vertical] {
+  -ms-flex: 1 1 auto;
+  -webkit-flex-basis: auto;
+  flex-basis: auto;
 }
 
 html /deep/ [flex][auto] {
   -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
+  -webkit-flex-basis: auto;
+  flex-basis: auto;
 }
 
 html /deep/ [flex][none] {
@@ -203,7 +212,7 @@
 }
 
 html /deep/ [layout][around-justified] {
-  -ms-flex-pack: around;
+  -ms-flex-pack: distribute;
   -webkit-justify-content: space-around;
   justify-content: space-around;
 }
@@ -597,6 +606,8 @@
 
 
 
+
+
 <polymer-element name="curly-block">
   <template>
     <style>
@@ -652,6 +663,271 @@
 <polymer-element name="any-service-ref" extends="observatory-element">
 </polymer-element>
 
+<polymer-element name="object-ref" extends="service-ref">
+  <template><style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered-big {
+  padding-left: 5%;
+  padding-right: 5%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+h1 {
+  font: 400 18px 'Montserrat', sans-serif;
+}
+
+.memberList {
+  display: table;
+}
+
+.memberItem {
+  display: table-row;
+}
+
+.memberName, .memberValue {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.memberSmall {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 12px 'Montserrat', sans-serif;
+}
+
+.monospace {
+  font-family: consolas, courier, monospace;
+  font-size: 1em;
+  line-height: 1.2em;
+  white-space: nowrap;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <template if="{{ nameIsEmpty }}">
+      <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.vmType }}</em></a>
+    </template>
+    <template if="{{ !nameIsEmpty }}">
+      <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ name }}</em></a>
+    </template>
+  </template>
+</polymer-element>
+
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
@@ -1644,6 +1920,13 @@
         <a class="boxclose" on-click="{{ closeItem }}">×</a>
       </div>
     </template>
+    <template if="{{ event.eventType == 'VMDisconnected' }}">
+      <div class="item">
+        Disconnected from VM
+        <br><br>
+        <a class="boxclose" on-click="{{ closeItem }}">×</a>
+      </div>
+    </template>
   </template>
 </polymer-element>
 
@@ -3238,15 +3521,15 @@
 }
 </style>
     <span>
-      <template if="{{ ref['static'] }}">static</template>
-      <template if="{{ ref['final'] }}">final</template>
-      <template if="{{ ref['const'] }}">const</template>
-      <template if="{{ (ref['declaredType'].name == 'dynamic' &amp;&amp;
-                        !ref['final'] &amp;&amp; !ref['const']) }}">
+      <template if="{{ ref.isStatic] }}">static</template>
+      <template if="{{ ref.isFinal }}">final</template>
+      <template if="{{ ref.isConst }}">const</template>
+      <template if="{{ (ref.declaredType.name == 'dynamic' &amp;&amp;
+                        !ref.isFinal &amp;&amp; !ref.isConst) }}">
         var
       </template>
-      <template if="{{ (ref['declaredType'].name != 'dynamic') }}">
-        <instance-ref ref="{{ ref['declaredType'] }}"></instance-ref>
+      <template if="{{ (ref.declaredType.name != 'dynamic') }}">
+        <instance-ref ref="{{ ref.declaredType }}"></instance-ref>
       </template>
       <a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a>
     </span>
@@ -4561,8 +4844,8 @@
                   <field-ref ref="{{ field }}"></field-ref>
                 </div>
                 <div class="memberValue">
-                  <template if="{{ field['value'] != null }}">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                  <template if="{{ field.value != null }}">
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </template>
                 </div>
               </div>
@@ -5885,12 +6168,12 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
-      <template if="{{ field['owner'].type == 'Class' }}">
+      <template if="{{ field.owner.type == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ field.owner }}"></class-nav-menu>
       </template>
-      <template if="{{ field['owner'].type == 'Library' }}">
-        <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
+      <template if="{{ field.owner.type == 'Library' }}">
+        <library-nav-menu library="{{ field.owner }}"></library-nav-menu>
       </template>
       <nav-menu link="{{ field.link }}" anchor="{{ field.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -5899,15 +6182,15 @@
 
     <div class="content">
       <h1>
-        <template if="{{ field['static'] }}">static</template>
-        <template if="{{ field['final'] }}">final</template>
-        <template if="{{ field['const'] }}">const</template>
-        <template if="{{ (field['declaredType'].name == 'dynamic' &amp;&amp;
-                         !field['final'] &amp;&amp; !field['const']) }}">
+        <template if="{{ field.isStatic }}">static</template>
+        <template if="{{ field.isFinal }}">final</template>
+        <template if="{{ field.isConst }}">const</template>
+        <template if="{{ (field.declaredType.name == 'dynamic' &amp;&amp;
+                         !field.isFinal &amp;&amp; !field.isConst) }}">
           var
         </template>
-        <template if="{{ (field['declaredType'].name != 'dynamic') }}">
-          {{ field['declaredType'].name }}
+        <template if="{{ (field.declaredType.name != 'dynamic') }}">
+          {{ field.declaredType.name }}
         </template>
         {{ field.name }}
       </h1>
@@ -5915,48 +6198,48 @@
         <div class="memberItem">
           <div class="memberName">owner</div>
           <div class="memberValue">
-            <template if="{{ field['owner'].type == 'Class' }}">
-              <class-ref ref="{{ field['owner'] }}"></class-ref>
+            <template if="{{ field.owner.type == 'Class' }}">
+              <class-ref ref="{{ field.owner }}"></class-ref>
             </template>
-            <template if="{{ field['owner'].type != 'Class' }}">
-              <library-ref ref="{{ field['owner'] }}"></library-ref>
+            <template if="{{ field.owner.type != 'Class' }}">
+              <library-ref ref="{{ field.owner }}"></library-ref>
             </template>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ field['script'] }}"></script-ref>
+            <script-ref ref="{{ field.script }}"></script-ref>
           </div>
         </div>
-        <template if="{{ !field['static'] }}">
+        <template if="{{ !field.isStatic }}">
           <div class="memberItem" title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
             <div class="memberName">observed types</div>
             <div class="memberValue">
-              <template if="{{ field['guardClass'] == 'dynamic' }}">
+              <template if="{{ field.guardClass == 'dynamic' }}">
                 various
               </template>
-              <template if="{{ field['guardClass'] == 'unknown' }}">
+              <template if="{{ field.guardClass == 'unknown' }}">
                 none
               </template>
-              <template if="{{ field['guardClass'] != 'unknown' &amp;&amp;
-                            field['guardClass'] != 'dynamic' }}">
-                <class-ref ref="{{ field['guardClass'] }}"></class-ref>
-                <template if="{{ field['guardNullable'] }}">
+              <template if="{{ field.guardClass != 'unknown' &amp;&amp;
+                            field.guardClass != 'dynamic' }}">
+                <class-ref ref="{{ field.guardClass }}"></class-ref>
+                <template if="{{ field.guardNullable }}">
                   — null observed
                 </template>
-                <template if="{{ !field['guardNullable'] }}">
+                <template if="{{ !field.guardNullable }}">
                   — null not observed
                 </template>
               </template>
             </div>
           </div>
         </template>
-        <template if="{{ field['value'] != null }}">
+        <template if="{{ field.value != null }}">
           <div class="memberItem">
             <div class="memberName">static value</div>
             <div class="memberValue">
-              <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+              <any-service-ref ref="{{ field.value }}"></any-service-ref>
             </div>
           </div>
         </template>
@@ -14854,10 +15137,19 @@
         </div>
       </div>
 
-      <div class="memberItem" title="Space for this object in memory">
-        <div class="memberName">size</div>
-        <div class="memberValue">{{ object.size | formatSize }}</div>
-      </div>
+      <template if="{{ object.size != null }}">
+        <div class="memberItem" title="Space for this object in memory">
+          <div class="memberName">size</div>
+          <div class="memberValue">{{ object.size | formatSize }}</div>
+        </div>
+      </template>
+
+      <template if="{{ object.size == null }}">
+        <div class="memberItem" title="Space for this object in memory">
+          <div class="memberName">size</div>
+          <div class="memberValue">0</div>
+        </div>
+      </template>
 
       <div class="memberItem" title="Space that would be reclaimed if references to this object were replaced with null">
         <div class="memberName">retained size</div>
@@ -15601,7 +15893,7 @@
                     <field-ref ref="{{ field['decl'] }}"></field-ref>
                   </div>
                   <div class="memberValue">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </div>
                 </div>
               </template>
@@ -16012,8 +16304,8 @@
                   <field-ref ref="{{ field }}"></field-ref>
                 </div>
                 <div class="memberValue">
-                  <template if="{{ field['value'] != null }}">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                  <template if="{{ field.value != null }}">
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </template>
                 </div>
               </div>
@@ -16962,6 +17254,292 @@
 
 
 
+<polymer-element name="object-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered-big {
+  padding-left: 5%;
+  padding-right: 5%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+h1 {
+  font: 400 18px 'Montserrat', sans-serif;
+}
+
+.memberList {
+  display: table;
+}
+
+.memberItem {
+  display: table-row;
+}
+
+.memberName, .memberValue {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.memberSmall {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 12px 'Montserrat', sans-serif;
+}
+
+.monospace {
+  font-family: consolas, courier, monospace;
+  font-size: 1em;
+  line-height: 1.2em;
+  white-space: nowrap;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ object.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="object" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
+    </nav-bar>
+
+    <div class="content">
+      <object-common object="{{ object }}"></object-common>
+    </div>
+
+    <hr>
+  </template>
+</polymer-element>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
 
 
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index.html._data b/runtime/bin/vmservice/observatory/deployed/web/index.html._data
index 1ec5d7a..9e8e93a 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index.html._data
+++ b/runtime/bin/vmservice/observatory/deployed/web/index.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/object_common.dart"],["observatory","lib/src/elements/context_ref.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/context_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/object_common.dart"],["observatory","lib/src/elements/context_ref.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/object_view.dart"],["observatory","lib/src/elements/context_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js
index e4629fc..b8d37aa5 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js
@@ -157,7 +157,7 @@
 "^":"",
 x:function(a){return void 0},
 uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-aN:function(a){var z,y,x,w
+MZ:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -169,23 +169,23 @@
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.Sx
 else return C.vB}return w},
-e1g:function(a){var z,y,x,w
-z=$.AuW
+zG:function(a){var z,y,x,w
+z=$.uv
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
 if(x.n(a,y[w]))return w}return},
-Dc:function(a){var z,y,x
-z=J.e1g(a)
+Xr:function(a){var z,y,x
+z=J.zG(a)
 if(z==null)return
-y=$.AuW
+y=$.uv
 x=z+1
 if(x>=y.length)return H.e(y,x)
 return y[x]},
-KE:function(a,b){var z,y,x
-z=J.e1g(a)
+YC:function(a,b){var z,y,x
+z=J.zG(a)
 if(z==null)return
-y=$.AuW
+y=$.uv
 x=z+2
 if(x>=y.length)return H.e(y,x)
 return y[x][b]},
@@ -213,7 +213,7 @@
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
-gbx:function(a){return C.Bc}},
+gbx:function(a){return C.Ho}},
 iCW:{
 "^":"Ue1;"},
 kdQ:{
@@ -227,7 +227,7 @@
 if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
-xe:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
+aP:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
@@ -238,13 +238,13 @@
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 uk:function(a,b){H.DQ(a,b)},
-ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0)])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
+ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.TNQ(),[H.u3(a,0)]),0)])},
+yx:[function(a,b){return H.VM(new H.Fm(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kY",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -252,17 +252,17 @@
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
 y[x]=w}return y.join(b)},
-eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0))},
+eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.TNQ(),[H.u3(a,0)]),0))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
 if(b===c)return H.VM([],[H.u3(a,0)])
 return H.VM(a.slice(b,c),[H.u3(a,0)])},
-Yc:function(a,b,c){var z=H.VM(new H.wb(),[H.u3(a,0)])
-H.xF(a,b,c)
+Yc:function(a,b,c){var z=H.VM(new H.TNQ(),[H.u3(a,0)])
+H.K0(a,b,c)
 return H.c1(a,b,c,H.u3(z,0))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -280,7 +280,7 @@
 Jd:function(a){return this.GT(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
+Pk:function(a,b,c){return H.EHn(a,b,a.length-1)},
 cn:function(a,b){return this.Pk(a,b,null)},
 tg:function(a,b){var z
 for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
@@ -294,7 +294,7 @@
 z.fixed$length=init
 return z}},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.u3(a,0))
+Oe:function(a){var z=P.fM(null,null,null,H.u3(a,0))
 z.FV(0,a)
 return z},
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)])},
@@ -330,7 +330,7 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gzr:function(a){return isFinite(a)},
+gx8:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
@@ -346,7 +346,7 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gVz",2,0,14,75],
+return y},"$1","gKy",2,0,14,75],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
@@ -398,20 +398,20 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-gbx:function(a){return C.WU},
-$islf:true,
+gbx:function(a){return C.yT},
+$isFK:true,
 static:{"^":"SAz,N6l"}},
 imn:{
 "^":"P;",
 gbx:function(a){return C.yw},
-$isVf:true,
-$islf:true,
+$isCP:true,
+$isFK:true,
 $isKN:true},
 VA7:{
 "^":"P;",
-gbx:function(a){return C.cz},
-$isVf:true,
-$islf:true},
+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))
@@ -460,7 +460,7 @@
 if(J.xZ(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
-bS:function(a){var z,y,x,w,v
+DY:function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
@@ -479,6 +479,9 @@
 b=b>>>1
 if(b===0)break
 z+=z}return y},
+LL:function(a,b,c){var z=b-a.length
+if(z<=0)return a
+return this.U(c,z)+a},
 gNq:function(a){return new J.IA(a)},
 XU:function(a,b,c){var z,y,x,w
 if(b==null)H.vh(P.u(null))
@@ -514,7 +517,7 @@
 y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
 y^=y>>11
 return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.lY},
+gbx:function(a){return C.Gh},
 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))
@@ -531,10 +534,10 @@
 x=a.charCodeAt(y)
 if(x!==32&&x!==13&&!J.Ga(x))break}return b}}},
 IA:{
-"^":"w2Y;vF",
-gB:function(a){return this.vF.length},
+"^":"w2Y;Bx",
+gB:function(a){return this.Bx.length},
 t:function(a,b){var z,y
-z=this.vF
+z=this.Bx
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 y=J.Wx(b)
 if(y.C(b,0))H.vh(P.N(b))
@@ -542,7 +545,7 @@
 return z.charCodeAt(b)},
 $asw2Y:function(){return[P.KN]},
 $asark:function(){return[P.KN]},
-$aseD:function(){return[P.KN]},
+$asE9h:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
 $asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
@@ -559,15 +562,15 @@
 z.a=b
 y=b}else y=b
 if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
-y=new H.dl(0,0,1,null,null,null,null,null,null,null,null,null,a)
+y=new H.O2(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.N8(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.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,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+x=P.L5(null,null,null,P.KN,H.HX)
+w=P.fM(null,null,null,P.KN)
+v=new H.HX(0,null,!1)
+u=new H.aX(y,x,w,new I(),v,new H.iV(H.t4()),new H.iV(H.t4()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
 w.h(0,0)
 u.ac(0,v)
 init.globalState.Nr=u
@@ -580,11 +583,11 @@
 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.mfx()
+if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.cL()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.mfx()
+if(init.globalState.EF===!0)return H.cL()
 return},
-mfx:function(){var z,y
+cL: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"))
@@ -593,24 +596,24 @@
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=H.Ln(b.data)
+z=H.BK(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.NO=y.t(z,"id")
 x=y.t(z,"functionName")
 w=x==null?init.globalState.w2:init.globalFunctions[x]()
 v=y.t(z,"args")
-u=H.Ln(y.t(z,"msg"))
+u=H.BK(y.t(z,"msg"))
 t=y.t(z,"isSpawnUri")
 s=y.t(z,"startPaused")
-r=H.Ln(y.t(z,"replyTo"))
+r=H.BK(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,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+q=P.L5(null,null,null,P.KN,H.HX)
+p=P.fM(null,null,null,P.KN)
+o=new H.HX(0,null,!1)
+n=new H.aX(y,q,p,new I(),o,new H.iV(H.t4()),new H.iV(H.t4()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
 p.h(0,0)
 n.ac(0,o)
-init.globalState.Xz.Rk.B7(0,new H.IY(n,new H.MA(w,v,u,t,s,r),"worker-start"))
+init.globalState.Xz.Rk.B7(0,new H.IY(n,new H.jl3(w,v,u,t,s,r),"worker-start"))
 init.globalState.N0=n
 init.globalState.Xz.bL()
 break
@@ -618,19 +621,19 @@
 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))
+case"close":init.globalState.XC.Rz(0,$.cz().t(0,a))
 a.terminate()
 init.globalState.Xz.bL()
 break
-case"log":H.Vj(y.t(z,"msg"))
+case"log":H.VLM(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.rj
 q=H.GyL(P.EF(["command","print","msg",z],null,null))
 y.toString
 self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","va",4,0,null,1,2],
-Vj:function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NBB",4,0,null,1,2],
+VLM:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.rj
 x=H.GyL(P.EF(["command","log","msg",a],null,null))
 y.toString
@@ -642,20 +645,20 @@
 y=z.jO
 $.z7=$.z7+("_"+y)
 $.Mr=$.Mr+("_"+y)
-y=z.er
+y=z.D5
 x=init.globalState.N0.jO
 w=z.Qy
-J.H4(f,["spawned",new H.Kg(y,x),w,z.PX])
+J.H4(f,["spawned",new H.VU(y,x),w,z.PX])
 x=new H.zX(a,b,c,d,z)
-if(e===!0){z.V0(w,w)
+if(e===!0){z.oz(w,w)
 init.globalState.Xz.Rk.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
 GyL:function(a){var z
-if(init.globalState.ji===!0){z=new H.RS(0,new H.oV())
+if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
 z.dZ=new H.m3(null)
-return z.h7(a)}else{z=new H.fL(new H.oV())
+return z.Zo(a)}else{z=new H.fL(new H.cx())
 z.dZ=new H.m3(null)
-return z.h7(a)}},
-Ln:function(a){if(init.globalState.ji===!0)return new H.EU(null).QS(a)
+return z.Zo(a)}},
+BK:function(a){if(init.globalState.ji===!0)return new H.hq(null).ug(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
@@ -667,7 +670,7 @@
 "^":"TpZ:76;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
-dl:{
+O2:{
 "^":"a;Hg,NO,hJ,N0,Nr,Xz,Ws,EF,ji,i2<,rj,XC,w2<",
 N8:function(a){var z,y,x
 z=self.window==null
@@ -678,10 +681,7 @@
 else y=!0
 this.ji=y
 this.Ws=z&&!x
-y=H.IY
-x=H.VM(new P.nd(null,0,0,0),[y])
-x.Eo(null,y)
-this.Xz=new H.ae(x,0)
+this.Xz=new H.ae(P.NZ2(null,H.IY),0)
 this.i2=P.L5(null,null,null,P.KN,H.aX)
 this.XC=P.L5(null,null,null,P.KN,null)
 if(this.EF===!0){z=new H.JH()
@@ -690,15 +690,15 @@
 self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
 static:{wI:[function(a){return H.GyL(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,A4,fW,En<,er<,Qy,PX,xF?,UF<,C9<,lJ,QC,fB,P0,pa,ir",
-V0:function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,A4,fW,En<,D5<,Qy,PX,xF?,UF<,Vp<,lJ,QC,fB,P0,pa,ir",
+oz:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.CX()},
 NR:function(a){var z,y,x,w,v,u
 if(!this.UF)return
 z=this.lJ
 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)
+if(z.X5===0){for(z=this.Vp;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
 y=init.globalState.Xz.Rk
 w=y.QN
@@ -726,21 +726,19 @@
 return}y=new H.NYh(a)
 if(z.n(b,2)){init.globalState.Xz.Rk.B7(0,new H.IY(this,y,"ping"))
 return}z=this.fB
-if(z==null){z=H.VM(new P.nd(null,0,0,0),[null])
-z.Eo(null,null)
+if(z==null){z=P.NZ2(null,null)
 this.fB=z}z.B7(0,y)},
 w1:function(a,b){var z,y
 if(!this.PX.n(0,a))return
 z=J.x(b)
 if(!z.n(b,0))y=z.n(b,1)&&!this.P0
 else y=!0
-if(y){this.Dm()
+if(y){this.Pb()
 return}if(z.n(b,2)){z=init.globalState.Xz
 y=this.gIm()
 z.Rk.B7(0,new H.IY(this,y,"kill"))
 return}z=this.fB
-if(z==null){z=H.VM(new P.nd(null,0,0,0),[null])
-z.Eo(null,null)
+if(z==null){z=P.NZ2(null,null)
 this.fB=z}z.B7(0,this.gIm())},
 hk:function(a,b){var z,y
 z=this.ir
@@ -762,13 +760,13 @@
 x=u
 w=new H.oP(v,null)
 this.hk(x,w)
-if(this.pa===!0){this.Dm()
+if(this.pa===!0){this.Pb()
 if(this===init.globalState.Nr)throw v}}finally{this.P0=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
 if(this.fB!=null)for(;u=this.fB,!u.gl0(u);)this.fB.AR().$0()}return y},"$1","gZ2",2,0,77,78],
 Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
+switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
@@ -791,17 +789,17 @@
 if(z.NZ(0,a))throw H.b(P.eG("Registry: ports must be registered only once."))
 z.u(0,a,b)},
 CX:function(){if(this.A4.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.i2.u(0,this.jO,this)
-else this.Dm()},
-Dm:[function(){var z,y
+else this.Pb()},
+Pb:[function(){var z,y
 z=this.fB
 if(z!=null)z.V1(0)
-for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.Ff.BG()
+for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.BG()
 z.V1(0)
 this.fW.V1(0)
 init.globalState.i2.Rz(0,this.jO)
 this.ir.V1(0)
 z=this.QC
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.Ff,null)
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.lo,null)
 this.QC=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NYh:{
@@ -810,11 +808,11 @@
 $isEH:true},
 ae:{
 "^":"a;Rk>,kv",
-mj:function(){var z=this.Rk
+MK:function(){var z=this.Rk
 if(z.QN===z.Bq)return
 return z.AR()},
-d5:function(){var z,y,x
-z=this.mj()
+xB:function(){var z,y,x
+z=this.MK()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.NZ(0,init.globalState.Nr.jO)&&init.globalState.Ws===!0&&init.globalState.Nr.A4.X5===0)H.vh(P.eG("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.i2.X5===0&&y.Xz.kv===0){y=y.rj
@@ -823,7 +821,7 @@
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
 nT:function(){if(self.window!=null)new H.Rm(this).$0()
-else for(;this.d5(););},
+else for(;this.xB(););},
 bL:function(){var z,y,x,w,v
 if(init.globalState.EF!==!0)this.nT()
 else try{this.nT()}catch(x){w=H.Ru(x)
@@ -835,17 +833,17 @@
 self.postMessage(v)}}},
 Rm:{
 "^":"TpZ:17;a",
-$0:[function(){if(!this.a.d5())return
+$0:[function(){if(!this.a.xB())return
 P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,xh,G1>",
-Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
+Fn:[function(a){if(this.od.gUF()){this.od.gVp().push(this)
 return}J.QT(this.od,this.xh)},"$0","gpE",0,0,17],
 $isIY:true},
 JH:{
 "^":"a;"},
-MA:{
+jl3:{
 "^":"TpZ:76;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -864,9 +862,9 @@
 $isEH:true},
 Iy4:{
 "^":"a;",
-$ispW:true,
-$ishq:true},
-Kg:{
+$isRZ:true,
+$isXY:true},
+VU:{
 "^":"Iy4;kx,AJ",
 wR:function(a,b){var z,y,x,w,v
 z={}
@@ -878,22 +876,22 @@
 v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
 z.a=b
 if(v)z.a=H.GyL(b)
-if(x.ger()===w){x.Ds(z.a)
+if(x.gD5()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.B7(0,new H.IY(x,new H.Ua(z,this,v),w))},
+y.Rk.B7(0,new H.IY(x,new H.cR(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isKg&&J.xC(this.kx,b.kx)},
-giO:function(a){return J.Rr(this.kx)},
-$isKg:true,
-$ispW:true,
-$ishq:true},
-Ua:{
+return!!J.x(b).$isVU&&J.xC(this.kx,b.kx)},
+giO:function(a){return J.dv(this.kx)},
+$isVU:true,
+$isRZ:true,
+$isXY:true},
+cR:{
 "^":"TpZ:76;a,b,c",
 $0:[function(){var z,y
 z=this.b.kx
 if(!z.geL()){if(this.c){y=this.a
-y.a=H.Ln(y.a)}J.Pc(z,this.a.a)}},"$0",null,0,0,null,"call"],
+y.a=H.BK(y.a)}J.pq(z,this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 bM:{
 "^":"Iy4;Bi,ma,AJ",
@@ -905,16 +903,16 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isbM&&J.xC(this.Bi,b.Bi)&&J.xC(this.AJ,b.AJ)&&J.xC(this.ma,b.ma)},
 giO:function(a){var z,y,x
-z=J.Eh(this.Bi,16)
-y=J.Eh(this.AJ,8)
+z=J.lf(this.Bi,16)
+y=J.lf(this.AJ,8)
 x=this.ma
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isbM:true,
-$ispW:true,
-$ishq:true},
-yo:{
-"^":"a;a7>,Oy,eL<",
+$isRZ:true,
+$isXY:true},
+HX:{
+"^":"a;UL>,Oy,eL<",
 mY:function(a){return this.Oy.$1(a)},
 BG:function(){this.eL=!0
 this.Oy=null},
@@ -923,29 +921,29 @@
 this.eL=!0
 this.Oy=null
 z=init.globalState.N0
-y=this.a7
+y=this.UL
 z.A4.Rz(0,y)
 z.fW.Rz(0,y)
 z.CX()},
 yU:function(a,b){if(this.eL)return
 this.mY(b)},
-$isyo:true,
-static:{"^":"kz"}},
+$isHX:true,
+static:{"^":"v0"}},
 RS:{
-"^":"hz;uP,dZ",
-DE:function(a){if(!!a.$isKg)return["sendport",init.globalState.NO,a.AJ,J.Rr(a.kx)]
+"^":"jP1;uP,dZ",
+DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.AJ,J.dv(a.kx)]
 if(!!a.$isbM)return["sendport",a.Bi,a.AJ,a.ma]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$iskuS)return["capability",a.a7]
+yf:function(a){if(!!a.$isiV)return["capability",a.UL]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 fL:{
 "^":"ooy;dZ",
-DE:function(a){if(!!a.$isKg)return new H.Kg(a.kx,a.AJ)
+DE:function(a){if(!!a.$isVU)return new H.VU(a.kx,a.AJ)
 if(!!a.$isbM)return new H.bM(a.Bi,a.ma,a.AJ)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$iskuS)return new H.kuS(a.a7)
+yf:function(a){if(!!a.$isiV)return new H.iV(a.UL)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-EU:{
+hq:{
 "^":"fPc;Bw",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
@@ -956,19 +954,19 @@
 if(v==null)return
 u=v.hV(w)
 if(u==null)return
-return new H.Kg(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.kuS(J.UQ(a,1))}},
+return new H.VU(u,x)}else return new H.bM(y,w,x)},
+Op:function(a){return new H.iV(J.UQ(a,1))}},
 m3:{
-"^":"a;At",
+"^":"a;Vz",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.At.push(b)
+u:function(a,b,c){this.Vz.push(b)
 b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.At=[]},
+CH:function(a){this.Vz=[]},
 F4:function(){var z,y,x
-for(z=this.At.length,y=0;y<z;++y){x=this.At
+for(z=this.Vz.length,y=0;y<z;++y){x=this.Vz
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.At=null}},
-oV:{
+x[y].__MessageTraverser__attached_info__=null}this.Vz=null}},
+cx:{
 "^":"a;",
 t:function(a,b){return},
 u:function(a,b,c){},
@@ -976,18 +974,18 @@
 F4:function(){}},
 HU5:{
 "^":"a;",
-h7:function(a){var z
+Zo:function(a){var z
 if(H.vM(a))return this.Wp(a)
 this.dZ.CH(0)
 z=null
-try{z=this.B3(a)}finally{this.dZ.F4()}return z},
-B3:function(a){var z
+try{z=this.GP(a)}finally{this.dZ.F4()}return z},
+GP:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Wp(a)
 z=J.x(a)
 if(!!z.$isWO)return this.wb(a)
-if(!!z.$isT8)return this.TI(a)
-if(!!z.$ispW)return this.DE(a)
-if(!!z.$ishq)return this.yf(a)
+if(!!z.$isT8)return this.pi(a)
+if(!!z.$isRZ)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:{
@@ -1001,9 +999,9 @@
 z=Array(x)
 z.fixed$length=init
 this.dZ.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.B3(y.t(a,w))
+for(w=0;w<x;++w)z[w]=this.GP(y.t(a,w))
 return z},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z={}
 y=this.dZ.t(0,a)
 z.a=y
@@ -1018,9 +1016,9 @@
 RK:{
 "^":"TpZ:81;a,b",
 $2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.B3(a),z.B3(b))},"$2",null,4,0,null,79,80,"call"],
+J.qQ(this.a.a,z.GP(a),z.GP(b))},"$2",null,4,0,null,79,80,"call"],
 $isEH:true},
-hz:{
+jP1:{
 "^":"HU5;",
 Wp:function(a){return a},
 wb:function(a){var z,y
@@ -1029,26 +1027,26 @@
 y=this.uP++
 this.dZ.u(0,a,y)
 return["list",y,this.IP(a)]},
-TI:function(a){var z,y,x
+pi:function(a){var z,y,x
 z=this.dZ.t(0,a)
 if(z!=null)return["ref",z]
 y=this.uP++
 this.dZ.u(0,a,y)
 x=J.RE(a)
-return["map",y,this.IP(J.Nd(x.gvc(a))),this.IP(J.Nd(x.gUQ(a)))]},
+return["map",y,this.IP(J.qA(x.gvc(a))),this.IP(J.qA(x.gUQ(a)))]},
 IP:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
 C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.B3(z.t(a,w))
+for(w=0;w<y;++w){v=this.GP(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 fPc:{
 "^":"a;",
-QS:function(a){if(H.ZR(a))return a
+ug:function(a){if(H.ZR(a))return a
 this.Bw=P.YM(null,null,null,null,null)
 return this.H6(a)},
 H6:function(a){var z,y
@@ -1088,12 +1086,12 @@
 return z},
 fp:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
-"^":"a;bf,TD,Iw",
+"^":"a;zY,TD,Iw",
 Gv:function(){if(self.setTimeout!=null){if(this.TD)throw H.b(P.f("Timer in event loop cannot be canceled."))
 if(this.Iw==null)return
 H.cv()
 var z=this.Iw
-if(this.bf)self.clearTimeout(z)
+if(this.zY)self.clearTimeout(z)
 else self.clearInterval(z)
 this.Iw=null}else throw H.b(P.f("Canceling a timer."))},
 WI:function(a,b){if(self.setTimeout!=null){++init.globalState.Xz.kv
@@ -1109,7 +1107,7 @@
 this.Iw=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
 static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
 z.Qa(a,b)
-return z},zw:function(a,b){var z=new H.Oe(!1,!1,null)
+return z},jW:function(a,b){var z=new H.Oe(!1,!1,null)
 z.WI(a,b)
 return z}}},
 Av:{
@@ -1127,10 +1125,10 @@
 "^":"TpZ:76;a,b",
 $0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-kuS:{
-"^":"a;a7>",
+iV:{
+"^":"a;UL>",
 giO:function(a){var z,y,x
-z=this.a7
+z=this.UL
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1143,11 +1141,11 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$iskuS){z=this.a7
-y=b.a7
+if(!!J.x(b).$isiV){z=this.UL
+y=b.UL
 return z==null?y==null:z===y}return!1},
-$iskuS:true,
-$ishq:true}}],["","",,H,{
+$isiV:true,
+$isXY:true}}],["","",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1163,9 +1161,9 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
+nN:[function(a){throw H.b(P.rr(a,null,null))},"$1","UR",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
-if(c==null)c=H.kk()
+if(c==null)c=H.UR()
 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
@@ -1192,20 +1190,20 @@
 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(b==null)b=H.UR()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
-if(isNaN(z)){y=J.rr(a)
+if(isNaN(z)){y=J.iY(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)
+if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.yo.j(z,0)===36)z=C.yo.yn(z,1)
 return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
 a5:function(a){return"Instance of '"+H.lh(a)+"'"},
 Qn:[function(){return Date.now()},"$0","EY",0,0,4],
-Xe:function(){var z,y
+w4:function(){var z,y
 if($.xG!=null)return
 $.xG=1000
 $.hG=H.EY()
@@ -1228,13 +1226,13 @@
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.u3(a,0)]
-for(;y.G();){x=y.Ff
+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.wG(x-65536,10)&1023))
 z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
-eT:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
+LY:function(a){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
 if(y>65535)return H.Cq(a)}return H.RF(a)},
@@ -1263,7 +1261,7 @@
 KL:function(a){return a.aL?H.o2(a).getUTCHours()+0:H.o2(a).getHours()+0},
 ch:function(a){return a.aL?H.o2(a).getUTCMinutes()+0:H.o2(a).getMinutes()+0},
 Sw:function(a){return a.aL?H.o2(a).getUTCSeconds()+0:H.o2(a).getSeconds()+0},
-vA:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+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},
@@ -1308,7 +1306,7 @@
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
 z.name=""}else z.toString=H.tM
 return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
+tM:[function(){return J.AG(this.dartException)},"$0","nR",0,0,null],
 vh:function(a){throw H.b(a)},
 Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Hk(a)
@@ -1322,11 +1320,11 @@
 if((C.jn.wG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
 case 445:case 5007:v=H.d(y)+" (Error "+w+")"
 return z.$1(new H.W0(v,null))}}if(a instanceof TypeError){v=$.WD()
-u=$.Up()
+u=$.bN()
 t=$.PH()
 s=$.D1()
 r=$.BN()
-q=$.Kr()
+q=$.Y9()
 p=$.W6()
 $.PB()
 o=$.eA()
@@ -1357,11 +1355,11 @@
 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))
+if(z.n(c,0))return H.dB(b,new H.TL(a))
+else if(z.n(c,1))return H.dB(b,new H.uZ(a,d))
+else if(z.n(c,2))return H.dB(b,new H.OQ(a,d,e))
+else if(z.n(c,3))return H.dB(b,new H.Qx(a,d,e,f))
+else if(z.n(c,4))return H.dB(b,new H.RM(a,d,e,f,g))
 else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,5,6,7,8,9,10,11],
 tR:function(a,b){var z
 if(a==null)return
@@ -1391,7 +1389,7 @@
 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
+else if(u&&typeof x=="function"){q=t?H.HY:H.DVi
 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
@@ -1400,7 +1398,7 @@
 if(n!=null){m=d?o:H.CW(a,o,t)
 w[n]=m}}w["call*"]=s
 return v},
-vq:function(a,b,c,d){var z=H.uj
+vq:function(a,b,c,d){var z=H.DVi
 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)
@@ -1409,27 +1407,27 @@
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
 default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
 CW:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.Kv(a,b)
+if(c)return H.na(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.mJs
-if(w==null){w=H.B3("self")
-$.mJs=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+if(y===0){w=$.bf
+if(w==null){w=H.Iq("self")
+$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.WB(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
-v=$.mJs
-if(v==null){v=H.B3("self")
-$.mJs=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+v=$.bf
+if(v==null){v=H.Iq("self")
+$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(v+H.d(w)+"}")()},
-rm:function(a,b,c,d){var z,y
-z=H.uj
+ps:function(a,b,c,d){var z,y
+z=H.DVi
 y=H.HY
 switch(b?-1:a){case 0:throw H.b(H.S3("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
@@ -1441,16 +1439,16 @@
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
 return e.apply(f(this),h)}}(d,z,y)}},
-Kv:function(a,b){var z,y,x,w,v,u,t,s
+na:function(a,b){var z,y,x,w,v,u,t,s
 z=H.bO()
 y=$.P4
-if(y==null){y=H.B3("receiver")
+if(y==null){y=H.Iq("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.rm(w,!t,x,b)
+if(v||!t||w>=28)return H.ps(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.WB(t,1)
@@ -1472,16 +1470,16 @@
 eQK:function(a){throw H.b(P.mE("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Ogz:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.tu(z)
+if(b==null||b.length===0)return new H.Fp(z)
 return new H.KEA(z,b,null)},
 G3:function(){return C.Kn},
-rp:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
+t4:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
 Kxv:function(a){return new H.cu(a,null)},
 VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},
 oX:function(a){if(a==null)return
 return a.$builtinTypeInfo},
-IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
+IM:function(a,b){return H.Z9(a["$as"+H.d(b)],H.oX(a))},
 W8:function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},
 u3:function(a,b){var z=H.oX(a)
@@ -1503,7 +1501,7 @@
 wO:function(a){var z=J.x(a).constructor.builtin$cls
 if(a==null)return z
 return z+H.ia(a.$builtinTypeInfo,0,null)},
-Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+Z9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function")b=H.ml(a,null,b)}return b},
@@ -1512,7 +1510,7 @@
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
+return H.hv(H.Z9(y[d],z),c)},
 hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
@@ -1544,7 +1542,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},
+return H.hv(H.Z9(t,y),w)},
 Hc:function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
@@ -1667,18 +1665,18 @@
 z=H.VM([],[P.Od])
 y=b.length
 x=a.length
-for(;!0;){w=C.xB.XU(b,a,c)
+for(;!0;){w=C.yo.XU(b,a,c)
 if(w===-1)break
 z.push(new H.Vo(w,b,a))
 v=w+x
 if(v===y)break
 else c=w===v?c+1:v}return z},
 m2:function(a,b,c){var z,y
-if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
+if(typeof b==="string")return C.yo.XU(a,b,c)!==-1
 else{z=J.x(b)
-if(!!z.$isVR){z=C.xB.yn(a,c)
+if(!!z.$isVR){z=C.yo.yn(a,c)
 y=b.Yr
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},
+return y.test(z)}else return J.pO(z.dd(b,C.yo.yn(a,c)))}},
 ys:function(a,b,c){var z,y,x,w
 if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -1686,7 +1684,8 @@
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.IN+=w
-z.IN=w+c}return z.IN}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
+z.IN=w+c}w=z.IN
+return w.charCodeAt(0)==0?w:w}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
 ysD:{
 "^":"a;",
 gl0:function(a){return J.xC(this.gB(this),0)},
@@ -1711,18 +1710,18 @@
 z=this.md
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.Uf(x))}},
-gvc:function(a){return H.VM(new H.Ns(this),[H.u3(this,0)])},
+gvc:function(a){return H.VM(new H.dZ(this),[H.u3(this,0)])},
 gUQ:function(a){return H.K1(this.md,new H.hY(this),H.u3(this,0),H.u3(this,1))},
 $isyN:true},
 hY:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.Uf(a)},"$1",null,2,0,null,79,"call"],
 $isEH:true},
-Ns:{
+dZ:{
 "^":"mW;Nt",
 gA:function(a){return J.mY(this.Nt.md)}},
 LI:{
-"^":"a;r9,yl,Jt,TX,Y2,Ok",
+"^":"a;r9,yV,Jt,TX,Y2,Ok",
 gWa:function(){return this.r9},
 gUA:function(){return this.Jt===0},
 gnd:function(){var z,y,x,w
@@ -1748,9 +1747,9 @@
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
 v.u(0,new H.tx(t),x[s])}return v},
-static:{"^":"hAw,eHF,oJ"}},
+static:{"^":"hAw,eHF,De4"}},
 FD:{
-"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
+"^":"a;mr,Rn>,xm,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
@@ -1828,7 +1827,7 @@
 x=this.lT
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,GK,rZ,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
+static:{"^":"lm,xq,Re,fN,GK,rZ,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
 a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
@@ -1864,7 +1863,7 @@
 vV:{
 "^":"XS;yy",
 bu:[function(a){var z=this.yy
-return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,73]},
+return C.yo.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,73]},
 Hk:{
 "^":"TpZ:12;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
@@ -1880,23 +1879,23 @@
 z=y==null?"":y
 this.j0=z
 return z},"$0","gCR",0,0,73]},
-dr:{
+TL:{
 "^":"TpZ:76;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
-TL:{
+uZ:{
 "^":"TpZ:76;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
-uZ:{
+OQ:{
 "^":"TpZ:76;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
-OQ:{
+Qx:{
 "^":"TpZ:76;UI,bK,Gq,Rm",
 $0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
-Qx:{
+RM:{
 "^":"TpZ:76;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
@@ -1908,7 +1907,7 @@
 Bp:{
 "^":"TpZ;"},
 v:{
-"^":"Bp;tx,J6,lT,JL",
+"^":"Bp;tx,J6,lT,N7",
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isv)return!1
@@ -1919,9 +1918,9 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.J6))},
 $isv:true,
-static:{"^":"mJs,P4",uj:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.mJs
-if(z==null){z=H.B3("self")
-$.mJs=z}return z},B3:function(a){var z,y,x,w,v
+static:{"^":"bf,P4",DVi:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.bf
+if(z==null){z=H.Iq("self")
+$.bf=z}return z},Iq:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
@@ -1933,10 +1932,10 @@
 bu:[function(a){return this.G1},"$0","gCR",0,0,73],
 $isXS:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
-bb:{
+rg:{
 "^":"XS;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
-static:{S3:function(a){return new H.bb(a)}}},
+static:{S3:function(a){return new H.rg(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
@@ -1985,7 +1984,7 @@
 bu:[function(a){return"dynamic"},"$0","gCR",0,0,73],
 za:function(){return},
 $isi6:true},
-tu:{
+Fp:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
@@ -2002,7 +2001,7 @@
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.Ff.za())
+for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},
 bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gCR",0,0,73]},
@@ -2036,13 +2035,13 @@
 gHc:function(){var z=this.HN
 if(z!=null)return z
 z=this.Yr
-z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
+z=H.Vq(this.zO,z.multiline,!z.ignoreCase,!0)
 this.HN=z
 return z},
 gIa:function(){var z=this.mV
 if(z!=null)return z
 z=this.Yr
-z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.Vq(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
 this.mV=z
 return z},
 ik:function(a){var z
@@ -2052,7 +2051,7 @@
 return H.yx(this,z)},
 B0:function(a){if(typeof a!=="string")H.vh(P.u(a))
 return this.Yr.test(a)},
-e5:function(a){var z,y
+ii:function(a){var z,y
 z=this.ik(a)
 if(z!=null){y=z.pX
 if(0>=y.length)return H.e(y,0)
@@ -2086,14 +2085,14 @@
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $iswL:true,
-static:{v4:function(a,b,c,d){var z,y,x,w,v
+static:{Vq:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
+throw H.b(P.rr("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
 EK:{
 "^":"a;zO,pX",
 t:function(a,b){var z=this.pX
@@ -2105,17 +2104,17 @@
 z.fw(a,b)
 return z}}},
 KW:{
-"^":"mW;ve,BZ,wQ",
-gA:function(a){return new H.Pb(this.ve,this.BZ,this.wQ,null)},
+"^":"mW;ve,vF,wQ",
+gA:function(a){return new H.Pb(this.ve,this.vF,this.wQ,null)},
 $asmW:function(){return[P.Od]},
 $asQV:function(){return[P.Od]}},
 Pb:{
-"^":"a;UW,BZ,Ij,Jz",
+"^":"a;UW,vF,XB,Jz",
 gl:function(){return this.Jz},
 G:function(){var z,y,x,w,v
-z=this.BZ
+z=this.vF
 if(z==null)return!1
-y=this.Ij
+y=this.XB
 if(y<=z.length){x=this.UW.UZ(z,y)
 if(x!=null){this.Jz=x
 z=x.pX
@@ -2124,9 +2123,9 @@
 w=J.q8(z[0])
 if(typeof w!=="number")return H.s(w)
 v=y+w
-this.Ij=z.index===v?v+1:v
+this.XB=z.index===v?v+1:v
 return!0}}this.Jz=null
-this.BZ=null
+this.vF=null
 return!1}},
 Vo:{
 "^":"a;M,f1,zO",
@@ -2135,7 +2134,7 @@
 $isOd:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"LPc;IF,Qw,cw,oX,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"LPc;IF,Qw,cw,yQ,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gO9:function(a){return a.IF},
 sO9:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
 gFR:function(a){return a.Qw},
@@ -2144,12 +2143,12 @@
 sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
 gph:function(a){return a.cw},
 sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
-gih:function(a){return a.oX},
-sih:function(a,b){a.oX=this.ct(a,C.mJ,a.oX,b)},
+gih:function(a){return a.yQ},
+sih:function(a,b){a.yQ=this.ct(a,C.mJ,a.yQ,b)},
 pp:[function(a,b,c,d){var z=a.IF
 if(z===!0)return
 if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
-this.LY(a,null).wM(new X.jE(a))}},"$3","gYi",6,0,84,49,50,85],
+this.LY(a,null).wM(new X.IB(a))}},"$3","gMN",6,0,84,49,50,85],
 static:{zy:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -2159,8 +2158,8 @@
 a.IF=!1
 a.Qw=null
 a.cw="action"
-a.oX=null
-a.f4=[]
+a.yQ=null
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -2173,10 +2172,10 @@
 LPc:{
 "^":"xc+Pi;",
 $isd3:true},
-jE:{
+IB:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-z.IF=J.NB(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
@@ -2184,23 +2183,23 @@
 z=J.UQ(J.UQ($.Xw(),"google"),"visualization")
 $.BY=z
 return z},"$1","vN",2,0,12,13],
-DUC:function(a){var z=$.Vy().getItem(a)
+DU:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
-return C.xr.iQ(z)},
-n8:function(a){if(a==null)return P.pz(null,null,null)
-return W.qw("/crdptargets/"+P.jW(C.Fa,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
-G0:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
+return C.xr.kV(z)},
+QX:function(a){if(a==null)return P.t5(null,null,null)
+return W.Kz("/crdptargets/"+H.d(P.Mp(C.yD,a,C.xM,!1)),null,null).ml(new G.KF()).OA(new G.XN())},
+dj:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"},
 o1:function(a,b){var z
 for(z="";b>1;){--b
 if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-avE:[function(a){var z,y,x
+le:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
 y=z.Y(a,1000)
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","OA",2,0,14],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","nI",2,0,14],
 J8:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.RE(a*1000))
 y=C.jn.BU(z,3600000)
@@ -2211,15 +2210,15 @@
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-Xz:[function(a){var z=J.Wx(a)
+XzS:[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","Gt",2,0,14,15],
-mG:function(a){var z,y,x,w
+else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","RC",2,0,14,15],
+mGl:function(a){var z,y,x,w
 if(a==null)return"-"
-z=J.Dv(J.vX(a,1000))
+z=J.NQ(J.vX(a,1000))
 y=C.jn.BU(z,3600000)
 z=C.jn.Y(z,3600000)
 x=C.jn.BU(z,60000)
@@ -2229,34 +2228,34 @@
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;wc,fN,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,fn",
+"^":"Pi;k5,Ef,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,ij",
 gwv:function(a){return this.Nv},
 swv:function(a,b){var z,y
 if(J.xC(this.Nv,b))return
-if(this.Nv!=null){J.Z8(this.cC)
-J.of(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
-b.gEH().ml(this.gAQ())
+if(this.Nv!=null){J.U2(this.cC)
+J.tw(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
+b.gEH().ml(this.gEX())
 z=J.RE(b)
 z.giG(b).ml(this.gm6())
 y=b.gG2()
-H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gtb())
-J.Sr(z.gRk(b)).yI(this.gR7())
+H.VM(new P.rk(y),[H.u3(y,0)]).yI(this.gbf())
+J.HL(z.gRk(b)).yI(this.gfF())
 z=b.gLi()
-H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
+H.VM(new P.rk(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
 gvK:function(){return this.cC},
 svK:function(a){this.cC=F.Wi(this,C.c6,this.cC,a)},
-KO:function(a){var z,y
+of:function(a){var z,y
 $.Kh=this
-z=this.wc
+z=this.k5
 z.push(new G.t9(this,null,null,null,null))
 z.push(new G.ki(this,null,null,null,null))
-z.push(new G.Sy(this,null,null,null,null))
-z.push(G.Gi(this))
+z.push(new G.lO(this,null,null,null,null))
+z.push(G.b2(this))
 z.push(new G.by(this,null,null,null,null))
 z=this.Z6
 z.By=this
-y=H.VM(new W.RO(window,C.yf.fA,!1),[null])
-H.VM(new W.Ov(0,y.bi,y.fA,W.Yt(z.gnt()),y.el),[H.u3(y,0)]).DN()
+y=H.VM(new W.vG(window,"popstate",!1),[null])
+H.VM(new W.Ov(0,y.bi,y.fA,W.Yt(z.gTk()),y.el),[H.u3(y,0)]).DN()
 z.VA()},
 pZ:function(a){J.Ei(this.cC,new G.xE(a,new G.cE()))},
 rG:[function(a){var z=J.RE(a)
@@ -2266,28 +2265,28 @@
 case"BreakpointResolved":z.god(a).Xb()
 break
 case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.pZ(z.god(a))
-J.bi(this.cC,a)
+J.dH(this.cC,a)
 break
 case"GC":break
 default:N.QM("").YX("Unrecognized event: "+H.d(a))
-break}},"$1","gR7",2,0,86,87],
+break}},"$1","gfF",2,0,86,87],
 kj:[function(a){this.Pv=a
-this.aX("error/",null)},"$1","gtb",2,0,88,23],
+this.aX("error/",null)},"$1","gbf",2,0,88,23],
 m0:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
 else this.aX("error/",null)},"$1","geO",2,0,89,90],
 aX:function(a,b){var z,y,x,w,v,u
-z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
+z=b==null?P.Fl(null,null):P.WX(b,C.xM)
 y=J.U6(z)
 if(y.t(z,"trace")!=null){x=y.t(z,"trace")
 y=J.x(x)
-if(y.n(x,"on")){if($.ax==null)$.ax=Z.JQ()}else if(y.n(x,"off")){y=$.ax
+if(y.n(x,"on")){if($.hm==null)$.hm=Z.JQ()}else if(y.n(x,"off")){y=$.hm
 if(y!=null){y.RV.Gv()
-$.ax=null}}}y=$.ax
+$.hm=null}}}y=$.hm
 if(y!=null){y.NP.CH(0)
-J.Z8(y.Rk)}y=this.HJ
-if(y!=null)J.La(y,$.ax)
-for(y=this.wc,w=0;w<y.length;++w){v=y[w]
+J.U2(y.Rk)}y=this.HJ
+if(y!=null)J.La(y,$.hm)
+for(y=this.k5,w=0;w<y.length;++w){v=y[w]
 if(v.VU(a)){this.yN(v)
 y=R.tB(z)
 u=v.fz
@@ -2297,37 +2296,43 @@
 v.Q0(a)
 return}}throw H.b(P.a9())},
 yN:function(a){var z,y,x,w
-if(J.xC(this.fN,a))return
-if(this.fN!=null){N.QM("").To("Uninstalling page: "+H.d(this.fN))
-this.fN.oV()
+if(J.xC(this.Ef,a))return
+if(this.Ef!=null){N.QM("").To("Uninstalling page: "+H.d(this.Ef))
+this.Ef.oV()
 J.Wf(this.bn)}N.QM("").To("Installing page: "+H.d(a))
-try{a.ak()}catch(y){x=H.Ru(y)
+try{a.ci()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Failed to install page: "+H.d(z))}x=this.bn
 x.appendChild(a.gyF())
 w=W.r3("trace-view",null)
 this.HJ=w
-J.La(w,$.ax)
+J.La(w,$.hm)
 x.appendChild(this.HJ)
 x=a
-w=this.fN
+w=this.Ef
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.fN=x},
-rY:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gAQ",2,0,91,92],
-T0:[function(a){if(!J.xC(this.Nv,a))return
+this.nq(this,w)}this.Ef=x},
+vW:function(){J.Ei(this.cC,new G.cw())},
+rY:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)
+this.vW()},"$1","gEX",2,0,91,92],
+T0:[function(a){var z,y
+if(!J.xC(this.Nv,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gm6",2,0,91,92],
+z=this.cC
+y=new D.Mk(null,null,null,null,null,null,null,null,null,null,!1,null,null,null,null,null)
+y.eq=F.Wi(y,C.qR,null,"VMDisconnected")
+J.dH(z,y)},"$1","gm6",2,0,91,92],
 Ty:function(a){var z=this.m2.TY
-z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
-this.KO(!1)},
-E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A0),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+this.of(!1)},
+E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A5),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
-this.KO(!0)},
+this.of(!0)},
 static:{"^":"Kh<"}},
 cE:{
 "^":"TpZ:93;",
@@ -2336,33 +2341,37 @@
 $isEH:true},
 xE:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
+$1:[function(a){return J.xC(J.wg(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
 $isEH:true},
-Kf:{
+cw:{
+"^":"TpZ:12;",
+$1:[function(a){return J.xC(J.iiZ(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"],
+$isEH:true},
+eM:{
 "^":"a;Yb",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
 Ai:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-Id:function(a,b){var z=[]
+QS:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
 this.Yb.V7("addRow",[H.VM(new P.GD(z),[null])])}},
-yD:{
+qu:{
 "^":"a;vR,bG",
 Am:function(a,b){var z=P.jT(this.bG)
 this.vR.V7("draw",[b.Yb,z])}},
 yVe:{
 "^":"d3;",
 bo:function(a,b){var z
-if(this.By.Nv==null)b=this.wa("/vm-connect/")
-z=this.BE
+if(this.By.Nv==null){if(window.confirm("Connection with VM has been lost. Proceeding will lose current page.")!==!0)return
+b=this.wa("/vm-connect/")}z=this.BE
 if(z==null?b!=null:z!==b){N.QM("").To("Navigated to "+H.d(b))
 window.history.pushState(b,document.title,b)
 this.BE=b}this.UJ(b)},
 UJ:function(a){var z,y,x
-if(J.Qe(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("---")
+if(J.Qe(a).nC(a,"#"))a=C.yo.yn(a,1)
+if(C.yo.nC(a,"/"))a=C.yo.yn(a,1)
+if(C.yo.tg(a,"---")){z=a.split("---")
 y=z.length
 if(0>=y)return H.e(z,0)
 a=z[0]
@@ -2372,94 +2381,94 @@
 Cz:function(a,b,c){var z,y,x
 z=J.Vs(c).dA.getAttribute("href")
 y=J.RE(a)
-x=y.gEV(a)
+x=y.gAy(a)
 if(typeof x!=="number")return x.D()
-if(x>0||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gYK(a)===!0)return
+if(x>0||y.gNl(a)===!0||y.gTu(a)===!0||y.gkA(a)===!0||y.gw4(a)===!0)return
 this.bo(0,z)
-y.e6(a)}},
-ng:{
-"^":"yVe;Zz,By,BE,ro,XY,cU",
+y.TI(a)}},
+OR:{
+"^":"yVe;Zz,By,BE,ro,XY,iS",
 VA:function(){var z=H.d(window.location.hash)
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.Zz
 window.history.pushState(z,document.title,z)
 this.UJ(window.location.hash)},
-fH:[function(a){this.UJ(window.location.hash)},"$1","gnt",2,0,95,13],
+fH:[function(a){this.UJ(window.location.hash)},"$1","gTk",2,0,95,13],
 wa:function(a){return"#"+H.d(a)}},
-OS:{
+MQ:{
 "^":"Pi;i6>,yF<",
 gFL:function(a){return this.yF},
 sFL:function(a,b){this.yF=F.Wi(this,C.GP,this.yF,b)},
 gl6:function(a){return this.fz},
 sl6:function(a,b){this.fz=F.Wi(this,C.Zg,this.fz,b)},
 oV:function(){this.yF=F.Wi(this,C.GP,this.yF,null)},
-$isOS:true},
+$isMQ:true},
 by:{
-"^":"OS;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
+"^":"MQ;i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){if(J.xC(a,""))return
-this.i6.Nv.cv(a).ml(new G.mo(this)).OA(new G.Go5())},
+this.i6.Nv.cv(a).ml(new G.GL(this)).OA(new G.mo())},
 VU:function(a){return!0}},
-mo:{
+GL:{
 "^":"TpZ:12;a",
 $1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-Go5:{
+mo:{
 "^":"TpZ:12;",
 $1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 t9:{
-"^":"OS;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("class-tree",null)
+"^":"MQ;i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){a=J.ZZ(a,11)
-this.i6.Nv.cv(a).ml(new G.Hb(this)).OA(new G.ZaW())},
+this.i6.Nv.cv(a).ml(new G.Za(this)).OA(new G.hh())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
-Hb:{
+Za:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a.yF
 if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-ZaW:{
+hh:{
 "^":"TpZ:12;",
 $1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-Sy:{
-"^":"OS;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
+lO:{
+"^":"MQ;i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){var z,y
 z=H.Go(this.yF,"$isTi")
 y=this.i6.Pv
-z.Ll=J.NB(z,C.td,z.Ll,y)},
+z.Ll=J.Q5(z,C.td,z.Ll,y)},
 VU:function(a){return J.co(a,"error/")}},
 ki:{
-"^":"OS;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
+"^":"MQ;i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){},
 VU:function(a){return J.co(a,"vm-connect/")}},
 JM:{
-"^":"OS;cX@,K3,i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("metrics-page",null)
+"^":"MQ;cX@,K3,i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("metrics-page",null)
 z=F.Wi(this,C.GP,this.yF,z)
 this.yF=z
 H.Go(z,"$isqn")
-z.GC=J.NB(z,C.EP,z.GC,this)}},
+z.GC=J.Q5(z,C.EP,z.GC,this)}},
 ZW:function(a,b){var z
 if(b.gmw()!=null){if(J.cj(b.gmw()).gVs()===a)return
-C.Nm.Rz(b.gmw().gJb(),b)
+C.Nm.Rz(b.gmw().gfj(),b)
 b.smw(null)}if(J.xC(a,0))return
 z=this.K3.t(0,a)
-if(z!=null){z.gJb().push(b)
+if(z!=null){z.gfj().push(b)
 b.smw(z)
 return}throw H.b(P.a9())},
 Q0:function(a){var z,y,x
 z=this.i6.Nv
-y=$.qL().e5(a)
+y=$.Il().ii(a)
 x=J.U6(y)
-z.cv(x.Nj(y,0,J.bI(x.gB(y),1))).ml(new G.YhF(this))},
+z.cv(x.Nj(y,0,J.bI(x.gB(y),1))).ml(new G.VP(this))},
 VU:function(a){var z=$.NP().Yr
 if(typeof a!=="string")H.vh(P.u(a))
 return z.test(a)},
@@ -2471,21 +2480,21 @@
 w=new D.W1(w,v,null)
 w.Cb=P.SZ(v,w.gia(w))
 z.u(0,x,w)}},
-static:{"^":"lZ,AX,Bw",Gi:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
+static:{"^":"lZ,M2,Bw",b2:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
 z.LS(a)
 return z}}},
-YhF:{
+VP:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=H.Go(this.a.yF,"$isqn")
-z.OM=J.NB(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
+z.OM=J.Q5(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
 V3:{
 "^":"a;IU",
-cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
+cv:function(a){return G.DU(this.IU+"."+H.d(a))}},
 KF:{
 "^":"TpZ:3;",
 $1:[function(a){var z,y,x,w
-z=C.xr.iQ(a)
+z=C.xr.kV(a)
 if(z==null)return z
 y=J.U6(z)
 x=0
@@ -2498,10 +2507,10 @@
 "^":"TpZ:12;",
 $1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-nD:{
-"^":"d3;wo,bq>,TY,ro,XY,cU",
+uh:{
+"^":"d3;wo,bq>,TY,ro,XY,iS",
 k6:function(){return"ws://"+H.d(window.location.host)+"/ws"},
-TP:function(a){var z=this.Xk(a)
+J8:function(a){var z=this.Xk(a)
 if(z!=null)return z
 z=new L.Z5(0,!1,null,a)
 z.oc=a
@@ -2533,7 +2542,7 @@
 A7:function(){var z,y,x,w,v
 z=this.bq
 z.V1(z)
-y=G.DUC(this.wo.IU+".history")
+y=G.DU(this.wo.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2542,8 +2551,8 @@
 if(!(w<v))break
 x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
 this.TV()},
-lK:function(){this.A7()
-var z=this.TP(this.k6())
+vs:function(){this.A7()
+var z=this.J8(this.k6())
 this.TY=z
 this.h(0,z)},
 static:{"^":"lGN"}},
@@ -2553,42 +2562,42 @@
 $isEH:true},
 jQ:{
 "^":"TpZ:99;",
-$2:function(a,b){return J.FW(b.geX(),a.geX())},
+$2:function(a,b){return J.FW(b.gFH(),a.gFH())},
 $isEH:true},
 Y2:{
-"^":"Pi;eT>,yt<,ks>,oH<",
+"^":"Pi;eT>,yt<,qu>,oH<",
 gyX:function(a){return this.PU},
-gty:function(){return this.aZ},
+grm:function(){return this.aZ},
 goE:function(a){return this.Lk},
 soE:function(a,b){var z=J.xC(this.Lk,b)
 this.Lk=b
 if(!z){z=this.PU
 if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
 this.Pz(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.cO()}}},
+this.aY()}}},
 r8:function(){this.soE(0,this.Lk!==!0)
 return this.Lk},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
 ih:{
-"^":"Pi;vp>,Vg,fn",
-G7:function(a){var z,y
+"^":"Pi;vp>,Vg,ij",
+rT:function(a){var z,y
 z=this.vp
 y=J.w1(z)
 y.V1(z)
 a.Pz(0)
-y.FV(z,a.ks)},
-lo:function(a){var z,y,x
+y.FV(z,a.qu)},
+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.OY(z,x)+1,J.Mx(x))
+if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.dd(x))
 else this.nm(x)},
 nm:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.q8(z.gks(a))
+y=J.q8(z.gqu(a))
 if(y===0)return
-for(x=0;x<y;++x)if(J.IL(J.UQ(z.gks(a),x))===!0)this.nm(J.UQ(z.gks(a),x))
+for(x=0;x<y;++x)if(J.IL(J.UQ(z.gqu(a),x))===!0)this.nm(J.UQ(z.gqu(a),x))
 z.soE(a,!1)
 z=this.vp
 w=J.U6(z)
@@ -2596,15 +2605,15 @@
 w.oq(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy<",
-static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,16]}},
-Ni:{
+static:{mbk:[function(a){return a!=null?J.AG(a):"<null>"},"$1","NZt",2,0,16]}},
+c0:{
 "^":"a;UQ>",
-$isNi:true},
+$isc0:true},
 Vz:{
-"^":"Pi;oH<,vp>,zz<",
-sxp:function(a){this.pT=a
+"^":"Pi;oH<,vp>,GD<",
+sn4:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
-gxp:function(){return this.pT},
+gn4:function(){return this.pT},
 gT3:function(){return this.Rj},
 sT3:function(a){this.Rj=a
 F.Wi(this,C.JB,0,1)},
@@ -2613,19 +2622,19 @@
 return J.UQ(J.hI(z[a]),b)},
 oa:[function(a,b){var z=this.Ey(a,this.pT)
 return J.FW(this.Ey(b,this.pT),z)},"$2","gMG",4,0,100],
-ws:[function(a,b){return J.FW(this.Ey(a,this.pT),this.Ey(b,this.pT))},"$2","gfL",4,0,100],
+iJ8:[function(a,b){return J.FW(this.Ey(a,this.pT),this.Ey(b,this.pT))},"$2","gfL",4,0,100],
 Jd:function(a){var z,y
-H.Xe()
+H.w4()
 $.Ji=$.xG
-new P.VV(null,null).D5(0)
-z=this.zz
+new P.VV(null,null).wE(0)
+z=this.GD
 if(this.Rj){y=this.gMG()
 H.ig(z,y)}else{y=this.gfL()
 H.ig(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
-C.Nm.sB(this.zz,0)},
-Id:function(a,b){var z=this.vp
-this.zz.push(z.length)
+C.Nm.sB(this.GD,0)},
+QS:function(a,b){var z=this.vp
+this.GD.push(z.length)
 z.push(b)},
 Gu:function(a,b){var z,y
 z=this.vp
@@ -2637,25 +2646,25 @@
 ra:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.WB(J.Yq(z[a]),"\u2003")}z=this.oH
+return J.WB(J.ZC(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.Yq(z[a])
+z=J.ZC(z[a])
 return J.WB(z,this.Rj?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,101]}}],["","",,E,{
 "^":"",
 Jz:[function(){var z,y,x
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.Wq,new E.wa(),C.ET,new E.Or(),C.BE,new E.YL(),C.WC,new E.wf(),C.hR,new E.Oa(),C.S4,new E.emv(),C.Ro,new E.Lbd(),C.hN,new E.QAa(),C.AV,new E.CvS(),C.bV,new E.edy(),C.C0,new E.waE(),C.eZ,new E.Ore(),C.bk,new E.YLa(),C.lH,new E.wfa(),C.am,new E.Oaa(),C.oE,new E.e0(),C.kG,new E.e1(),C.OI,new E.e2(),C.Wt,new E.e3(),C.I9,new E.e4(),C.To,new E.e5(),C.mM,new E.e6(),C.aw,new E.e7(),C.XA,new E.e8(),C.i4,new E.e9(),C.mJ,new E.e10(),C.qt,new E.e11(),C.p1,new E.e12(),C.yJ,new E.e13(),C.la,new E.e14(),C.yL,new E.e15(),C.nr,new E.e16(),C.bJ,new E.e17(),C.ox,new E.e18(),C.Je,new E.e19(),C.kI,new E.e20(),C.vY,new E.e21(),C.Rs,new E.e22(),C.hJ,new E.e23(),C.Lw,new E.e24(),C.eR,new E.e25(),C.LS,new E.e26(),C.iE,new E.e27(),C.f4,new E.e28(),C.VK,new E.e29(),C.aH,new E.e30(),C.aK,new E.e31(),C.GP,new E.e32(),C.mw,new E.e33(),C.vs,new E.e34(),C.Gr,new E.e35(),C.TU,new E.e36(),C.Fe,new E.e37(),C.tP,new E.e38(),C.yh,new E.e39(),C.Zb,new E.e40(),C.u7,new E.e41(),C.p8,new E.e42(),C.qR,new E.e43(),C.ld,new E.e44(),C.ne,new E.e45(),C.B0,new E.e46(),C.r1,new E.e47(),C.mr,new E.e48(),C.Ek,new E.e49(),C.Pn,new E.e50(),C.YT,new E.e51(),C.h7,new E.e52(),C.R3,new E.e53(),C.cJ,new E.e54(),C.WQ,new E.e55(),C.fV,new E.e56(),C.jU,new E.e57(),C.OO,new E.e58(),C.Mc,new E.e59(),C.FP,new E.e60(),C.kF,new E.e61(),C.UD,new E.e62(),C.Aq,new E.e63(),C.DS,new E.e64(),C.C9,new E.e65(),C.VF,new E.e66(),C.uU,new E.e67(),C.YJ,new E.e68(),C.eF,new E.e69(),C.oI,new E.e70(),C.ST,new E.e71(),C.QH,new E.e72(),C.qX,new E.e73(),C.rE,new E.e74(),C.nf,new E.e75(),C.EI,new E.e76(),C.JB,new E.e77(),C.RY,new E.e78(),C.d4,new E.e79(),C.cF,new E.e80(),C.SI,new E.e81(),C.zS,new E.e82(),C.YA,new E.e83(),C.Ge,new E.e84(),C.A7,new E.e85(),C.He,new E.e86(),C.im,new E.e87(),C.Ss,new E.e88(),C.k6,new E.e89(),C.oj,new E.e90(),C.PJ,new E.e91(),C.Yb,new E.e92(),C.q2,new E.e93(),C.d2,new E.e94(),C.kN,new E.e95(),C.uO,new E.e96(),C.fn,new E.e97(),C.yB,new E.e98(),C.eJ,new E.e99(),C.iG,new E.e100(),C.Py,new E.e101(),C.pC,new E.e102(),C.uu,new E.e103(),C.qs,new E.e104(),C.XH,new E.e105(),C.XJ,new E.e106(),C.tJ,new E.e107(),C.F8,new E.e108(),C.fy,new E.e109(),C.C1,new E.e110(),C.Nr,new E.e111(),C.nL,new E.e112(),C.a0,new E.e113(),C.Yg,new E.e114(),C.bR,new E.e115(),C.ai,new E.e116(),C.ob,new E.e117(),C.MY,new E.e118(),C.Wg,new E.e119(),C.tD,new E.e120(),C.QS,new E.e121(),C.C7,new E.e122(),C.nZ,new E.e123(),C.Of,new E.e124(),C.Vl,new E.e125(),C.pY,new E.e126(),C.XL,new E.e127(),C.LA,new E.e128(),C.Iw,new E.e129(),C.tz,new E.e130(),C.AT,new E.e131(),C.Lk,new E.e132(),C.GS,new E.e133(),C.rB,new E.e134(),C.bz,new E.e135(),C.Jx,new E.e136(),C.b5,new E.e137(),C.z6,new E.e138(),C.SY,new E.e139(),C.Lc,new E.e140(),C.hf,new E.e141(),C.uk,new E.e142(),C.Zi,new E.e143(),C.TN,new E.e144(),C.GI,new E.e145(),C.Wn,new E.e146(),C.ur,new E.e147(),C.VN,new E.e148(),C.EV,new E.e149(),C.VI,new E.e150(),C.eh,new E.e151(),C.SA,new E.e152(),C.uG,new E.e153(),C.kV,new E.e154(),C.vp,new E.e155(),C.cc,new E.e156(),C.DY,new E.e157(),C.Lx,new E.e158(),C.M3,new E.e159(),C.wT,new E.e160(),C.JK,new E.e161(),C.SR,new E.e162(),C.t6,new E.e163(),C.rP,new E.e164(),C.qi,new E.e165(),C.pX,new E.e166(),C.kB,new E.e167(),C.LH,new E.e168(),C.a2,new E.e169(),C.VD,new E.e170(),C.NN,new E.e171(),C.UX,new E.e172(),C.YS,new E.e173(),C.pu,new E.e174(),C.uw,new E.e175(),C.BJ,new E.e176(),C.c6,new E.e177(),C.td,new E.e178(),C.Gn,new E.e179(),C.zO,new E.e180(),C.vg,new E.e181(),C.YV,new E.e182(),C.If,new E.e183(),C.Ys,new E.e184(),C.zm,new E.e185(),C.EP,new E.e186(),C.nX,new E.e187(),C.BV,new E.e188(),C.xP,new E.e189(),C.XM,new E.e190(),C.Ic,new E.e191(),C.yG,new E.e192(),C.uI,new E.e193(),C.O9,new E.e194(),C.ba,new E.e195(),C.tW,new E.e196(),C.CG,new E.e197(),C.Jf,new E.e198(),C.Wj,new E.e199(),C.vb,new E.e200(),C.UL,new E.e201(),C.AY,new E.e202(),C.QK,new E.e203(),C.AO,new E.e204(),C.Xd,new E.e205(),C.I7,new E.e206(),C.kY,new E.e207(),C.Wm,new E.e208(),C.vK,new E.e209(),C.Tc,new E.e210(),C.GR,new E.e211(),C.KX,new E.e212(),C.ja,new E.e213(),C.mn,new E.e214(),C.Dj,new E.e215(),C.ir,new E.e216(),C.dx,new E.e217(),C.ni,new E.e218(),C.X2,new E.e219(),C.F3,new E.e220(),C.UY,new E.e221(),C.Aa,new E.e222(),C.nY,new E.e223(),C.tg,new E.e224(),C.HD,new E.e225(),C.iU,new E.e226(),C.eN,new E.e227(),C.ue,new E.e228(),C.nh,new E.e229(),C.L2,new E.e230(),C.vm,new E.e231(),C.Gs,new E.e232(),C.bE,new E.e233(),C.YD,new E.e234(),C.PX,new E.e235(),C.N8,new E.e236(),C.EA,new E.e237(),C.oW,new E.e238(),C.KC,new E.e239(),C.tf,new E.e240(),C.da,new E.e241(),C.Jd,new E.e242(),C.Y4,new E.e243(),C.Si,new E.e244(),C.pH,new E.e245(),C.Ve,new E.e246(),C.jM,new E.e247(),C.rd,new E.e248(),C.W5,new E.e249(),C.uX,new E.e250(),C.nt,new E.e251(),C.IT,new E.e252(),C.li,new E.e253(),C.PM,new E.e254(),C.ks,new E.e255(),C.Om,new E.e256(),C.iC,new E.e257(),C.Nv,new E.e258(),C.Wo,new E.e259(),C.FZ,new E.e260(),C.TW,new E.e261(),C.xS,new E.e262(),C.ft,new E.e263(),C.QF,new E.e264(),C.mi,new E.e265(),C.zz,new E.e266(),C.eO,new E.e267(),C.hO,new E.e268(),C.ei,new E.e269(),C.HK,new E.e270(),C.je,new E.e271(),C.Ef,new E.e272(),C.QL,new E.e273(),C.RH,new E.e274(),C.SP,new E.e275(),C.Q1,new E.e276(),C.ID,new E.e277(),C.dA,new E.e278(),C.bc,new E.e279(),C.kw,new E.e280(),C.nE,new E.e281(),C.ep,new E.e282(),C.hB,new E.e283(),C.J2,new E.e284(),C.hx,new E.e285(),C.zU,new E.e286(),C.OU,new E.e287(),C.bn,new E.e288(),C.mh,new E.e289(),C.Fh,new E.e290(),C.yv,new E.e291(),C.LP,new E.e292(),C.jh,new E.e293(),C.zd,new E.e294(),C.Db,new E.e295(),C.aF,new E.e296(),C.l4,new E.e297(),C.fj,new E.e298(),C.xw,new E.e299(),C.zn,new E.e300(),C.RJ,new E.e301(),C.Sk,new E.e302(),C.KS,new E.e303(),C.YE,new E.e304(),C.Uy,new E.e305()],null,null)
-y=P.EF([C.aP,new E.e306(),C.cg,new E.e307(),C.Zg,new E.e308(),C.S4,new E.e309(),C.AV,new E.e310(),C.bk,new E.e311(),C.lH,new E.e312(),C.am,new E.e313(),C.oE,new E.e314(),C.kG,new E.e315(),C.Wt,new E.e316(),C.mM,new E.e317(),C.aw,new E.e318(),C.XA,new E.e319(),C.i4,new E.e320(),C.mJ,new E.e321(),C.yL,new E.e322(),C.nr,new E.e323(),C.bJ,new E.e324(),C.kI,new E.e325(),C.vY,new E.e326(),C.VK,new E.e327(),C.aH,new E.e328(),C.GP,new E.e329(),C.vs,new E.e330(),C.Gr,new E.e331(),C.Fe,new E.e332(),C.tP,new E.e333(),C.yh,new E.e334(),C.Zb,new E.e335(),C.p8,new E.e336(),C.ld,new E.e337(),C.ne,new E.e338(),C.B0,new E.e339(),C.mr,new E.e340(),C.YT,new E.e341(),C.cJ,new E.e342(),C.WQ,new E.e343(),C.jU,new E.e344(),C.OO,new E.e345(),C.Mc,new E.e346(),C.QH,new E.e347(),C.rE,new E.e348(),C.nf,new E.e349(),C.Ge,new E.e350(),C.A7,new E.e351(),C.He,new E.e352(),C.oj,new E.e353(),C.d2,new E.e354(),C.uO,new E.e355(),C.fn,new E.e356(),C.yB,new E.e357(),C.Py,new E.e358(),C.uu,new E.e359(),C.qs,new E.e360(),C.rB,new E.e361(),C.z6,new E.e362(),C.hf,new E.e363(),C.uk,new E.e364(),C.Zi,new E.e365(),C.TN,new E.e366(),C.ur,new E.e367(),C.EV,new E.e368(),C.VI,new E.e369(),C.eh,new E.e370(),C.SA,new E.e371(),C.uG,new E.e372(),C.kV,new E.e373(),C.vp,new E.e374(),C.SR,new E.e375(),C.t6,new E.e376(),C.kB,new E.e377(),C.UX,new E.e378(),C.YS,new E.e379(),C.c6,new E.e380(),C.td,new E.e381(),C.zO,new E.e382(),C.YV,new E.e383(),C.If,new E.e384(),C.Ys,new E.e385(),C.EP,new E.e386(),C.nX,new E.e387(),C.BV,new E.e388(),C.XM,new E.e389(),C.Ic,new E.e390(),C.O9,new E.e391(),C.tW,new E.e392(),C.Wj,new E.e393(),C.vb,new E.e394(),C.QK,new E.e395(),C.Xd,new E.e396(),C.kY,new E.e397(),C.vK,new E.e398(),C.Tc,new E.e399(),C.GR,new E.e400(),C.KX,new E.e401(),C.ja,new E.e402(),C.Dj,new E.e403(),C.X2,new E.e404(),C.UY,new E.e405(),C.Aa,new E.e406(),C.nY,new E.e407(),C.tg,new E.e408(),C.HD,new E.e409(),C.iU,new E.e410(),C.eN,new E.e411(),C.Gs,new E.e412(),C.bE,new E.e413(),C.YD,new E.e414(),C.PX,new E.e415(),C.tf,new E.e416(),C.Jd,new E.e417(),C.pH,new E.e418(),C.Ve,new E.e419(),C.jM,new E.e420(),C.rd,new E.e421(),C.uX,new E.e422(),C.nt,new E.e423(),C.IT,new E.e424(),C.PM,new E.e425(),C.ks,new E.e426(),C.Om,new E.e427(),C.iC,new E.e428(),C.Nv,new E.e429(),C.FZ,new E.e430(),C.TW,new E.e431(),C.ft,new E.e432(),C.mi,new E.e433(),C.zz,new E.e434(),C.dA,new E.e435(),C.kw,new E.e436(),C.nE,new E.e437(),C.hx,new E.e438(),C.zU,new E.e439(),C.OU,new E.e440(),C.zd,new E.e441(),C.RJ,new E.e442(),C.YE,new E.e443()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.XW,C.il,C.kH,C.Mt,C.Lg,C.qJ,C.Bi,C.il,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.uC,C.Mt,C.Wz,C.il,C.Ke,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.IZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.fU,C.Mt,C.pi,C.Mt,C.Fn,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.Mz,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.rC,C.Mt,C.Dl,C.Mt,C.Mz,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.R9,C.Mt,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.tQ,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.Mz,C.al,C.il],null,null)
-y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.aj,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.XW,P.Fl(null,null),C.kH,P.EF([C.nr,C.BO],null,null),C.Lg,P.EF([C.S4,C.aj,C.AV,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Bi,P.Fl(null,null),C.KO,P.EF([C.yh,C.Ul],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.jO,C.Aa,C.k5,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.aj,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.P9],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.EF([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.Fl(null,null),C.Ke,P.EF([C.fn,C.Kk],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.xV],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.IZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.hd,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.fU,P.EF([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.EF([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.EF([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.EF([C.uk,C.rY,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Cg],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.rY,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.oh,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.rY],null,null),C.rC,P.EF([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.Dl,P.EF([C.VK,C.lW],null,null),C.Mz,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.Bf,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.Df,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.It,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.bp],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.il,P.EF([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.iH,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.NS,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.iH,C.rE,C.B7],null,null),C.tQ,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.Wq,"asStringLiteral",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.Wt,"clazz",C.I9,"closeItem",C.To,"closing",C.mM,"closureCtxt",C.aw,"closureFunc",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.nr,"context",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.hJ,"dartMetrics",C.Lw,"deleteVm",C.eR,"deoptimizations",C.LS,"description",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.mw,"elements",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Yb,"id",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.XJ,"isAbstractType",C.tJ,"isBool",C.F8,"isChromeTarget",C.fy,"isClosure",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.C7,"isMirrorReference",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Iw,"isPlainInstance",C.tz,"isSentinel",C.AT,"isStatic",C.Lk,"isString",C.GS,"isWeakProperty",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.qi,"max",C.pX,"message",C.kB,"metric",C.LH,"metricChanged",C.a2,"min",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.uw,"nativeFields",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.EP,"page",C.nX,"parent",C.BV,"parentContext",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.Tc,"referent",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.mn,"refreshRateChange",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.vm,"sampleBufferSizeChange",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.da,"size",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.hB,"type",C.J2,"typeChecksEnabled",C.hx,"typeClass",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.zd,"value",C.Db,"valueAsString",C.aF,"valueAsStringIsTruncated",C.l4,"values",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Sk,"vmMetrics",C.KS,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.Wq,new E.wa(),C.ET,new E.Or(),C.BE,new E.YL(),C.WC,new E.wf(),C.hR,new E.Oa(),C.S4,new E.emv(),C.Ro,new E.Lbd(),C.hN,new E.QAa(),C.AV,new E.CvS(),C.bV,new E.edy(),C.C0,new E.waE(),C.eZ,new E.Ore(),C.bk,new E.YLa(),C.lH,new E.wfa(),C.am,new E.Oaa(),C.oE,new E.e0(),C.kG,new E.e1(),C.OI,new E.e2(),C.Wt,new E.e3(),C.I9,new E.e4(),C.To,new E.e5(),C.mM,new E.e6(),C.aw,new E.e7(),C.XA,new E.e8(),C.i4,new E.e9(),C.mJ,new E.e10(),C.qt,new E.e11(),C.p1,new E.e12(),C.yJ,new E.e13(),C.la,new E.e14(),C.yL,new E.e15(),C.nr,new E.e16(),C.bJ,new E.e17(),C.ox,new E.e18(),C.Je,new E.e19(),C.kI,new E.e20(),C.vY,new E.e21(),C.Rs,new E.e22(),C.hJ,new E.e23(),C.yC,new E.e24(),C.Lw,new E.e25(),C.eR,new E.e26(),C.LS,new E.e27(),C.iE,new E.e28(),C.f4,new E.e29(),C.VK,new E.e30(),C.aH,new E.e31(),C.aK,new E.e32(),C.GP,new E.e33(),C.mw,new E.e34(),C.vs,new E.e35(),C.Gr,new E.e36(),C.TU,new E.e37(),C.Fe,new E.e38(),C.tP,new E.e39(),C.yh,new E.e40(),C.Zb,new E.e41(),C.u7,new E.e42(),C.p8,new E.e43(),C.qR,new E.e44(),C.ld,new E.e45(),C.ne,new E.e46(),C.B0,new E.e47(),C.r1,new E.e48(),C.mr,new E.e49(),C.Ek,new E.e50(),C.Pn,new E.e51(),C.YT,new E.e52(),C.h7,new E.e53(),C.R3,new E.e54(),C.cJ,new E.e55(),C.WQ,new E.e56(),C.fV,new E.e57(),C.jU,new E.e58(),C.OO,new E.e59(),C.Mc,new E.e60(),C.FP,new E.e61(),C.kF,new E.e62(),C.UD,new E.e63(),C.Aq,new E.e64(),C.DS,new E.e65(),C.C9,new E.e66(),C.VF,new E.e67(),C.uU,new E.e68(),C.YJ,new E.e69(),C.eF,new E.e70(),C.oI,new E.e71(),C.ST,new E.e72(),C.QH,new E.e73(),C.qX,new E.e74(),C.rE,new E.e75(),C.nf,new E.e76(),C.EI,new E.e77(),C.JB,new E.e78(),C.RY,new E.e79(),C.d4,new E.e80(),C.cF,new E.e81(),C.ft,new E.e82(),C.dr,new E.e83(),C.SI,new E.e84(),C.zS,new E.e85(),C.YA,new E.e86(),C.Ge,new E.e87(),C.A7,new E.e88(),C.He,new E.e89(),C.im,new E.e90(),C.Ss,new E.e91(),C.k6,new E.e92(),C.oj,new E.e93(),C.PJ,new E.e94(),C.Yb,new E.e95(),C.q2,new E.e96(),C.d2,new E.e97(),C.kN,new E.e98(),C.uO,new E.e99(),C.fn,new E.e100(),C.yB,new E.e101(),C.eJ,new E.e102(),C.iG,new E.e103(),C.Py,new E.e104(),C.pC,new E.e105(),C.uu,new E.e106(),C.qs,new E.e107(),C.XH,new E.e108(),C.XJ,new E.e109(),C.tJ,new E.e110(),C.F8,new E.e111(),C.fy,new E.e112(),C.C1,new E.e113(),C.Nr,new E.e114(),C.nL,new E.e115(),C.a0,new E.e116(),C.Yg,new E.e117(),C.bR,new E.e118(),C.ai,new E.e119(),C.ob,new E.e120(),C.dR,new E.e121(),C.MY,new E.e122(),C.Wg,new E.e123(),C.tD,new E.e124(),C.QS,new E.e125(),C.C7,new E.e126(),C.nZ,new E.e127(),C.Of,new E.e128(),C.Vl,new E.e129(),C.pY,new E.e130(),C.XL,new E.e131(),C.LA,new E.e132(),C.Iw,new E.e133(),C.tz,new E.e134(),C.AT,new E.e135(),C.Lk,new E.e136(),C.GS,new E.e137(),C.rB,new E.e138(),C.bz,new E.e139(),C.Jx,new E.e140(),C.b5,new E.e141(),C.z6,new E.e142(),C.SY,new E.e143(),C.Lc,new E.e144(),C.hf,new E.e145(),C.uk,new E.e146(),C.Zi,new E.e147(),C.TN,new E.e148(),C.GI,new E.e149(),C.Wn,new E.e150(),C.ur,new E.e151(),C.VN,new E.e152(),C.EV,new E.e153(),C.VI,new E.e154(),C.eh,new E.e155(),C.SA,new E.e156(),C.uG,new E.e157(),C.kV,new E.e158(),C.vp,new E.e159(),C.cc,new E.e160(),C.DY,new E.e161(),C.Lx,new E.e162(),C.M3,new E.e163(),C.wT,new E.e164(),C.JK,new E.e165(),C.SR,new E.e166(),C.t6,new E.e167(),C.rP,new E.e168(),C.qi,new E.e169(),C.pX,new E.e170(),C.kB,new E.e171(),C.LH,new E.e172(),C.a2,new E.e173(),C.VD,new E.e174(),C.NN,new E.e175(),C.UX,new E.e176(),C.YS,new E.e177(),C.pu,new E.e178(),C.uw,new E.e179(),C.BJ,new E.e180(),C.c6,new E.e181(),C.td,new E.e182(),C.Gn,new E.e183(),C.zO,new E.e184(),C.vg,new E.e185(),C.Yp,new E.e186(),C.YV,new E.e187(),C.If,new E.e188(),C.Ys,new E.e189(),C.zm,new E.e190(),C.EP,new E.e191(),C.nX,new E.e192(),C.BV,new E.e193(),C.xP,new E.e194(),C.XM,new E.e195(),C.Ic,new E.e196(),C.yG,new E.e197(),C.uI,new E.e198(),C.O9,new E.e199(),C.ba,new E.e200(),C.tW,new E.e201(),C.CG,new E.e202(),C.Jf,new E.e203(),C.Wj,new E.e204(),C.vb,new E.e205(),C.UL,new E.e206(),C.AY,new E.e207(),C.QK,new E.e208(),C.AO,new E.e209(),C.Xd,new E.e210(),C.I7,new E.e211(),C.kY,new E.e212(),C.Wm,new E.e213(),C.vK,new E.e214(),C.Tc,new E.e215(),C.GR,new E.e216(),C.KX,new E.e217(),C.ja,new E.e218(),C.mn,new E.e219(),C.Dj,new E.e220(),C.ir,new E.e221(),C.dx,new E.e222(),C.ni,new E.e223(),C.X2,new E.e224(),C.F3,new E.e225(),C.UY,new E.e226(),C.Aa,new E.e227(),C.nY,new E.e228(),C.tg,new E.e229(),C.HD,new E.e230(),C.iU,new E.e231(),C.eN,new E.e232(),C.ue,new E.e233(),C.nh,new E.e234(),C.L2,new E.e235(),C.vm,new E.e236(),C.Gs,new E.e237(),C.bE,new E.e238(),C.YD,new E.e239(),C.PX,new E.e240(),C.N8,new E.e241(),C.EA,new E.e242(),C.oW,new E.e243(),C.KC,new E.e244(),C.tf,new E.e245(),C.da,new E.e246(),C.Jd,new E.e247(),C.Y4,new E.e248(),C.Si,new E.e249(),C.pH,new E.e250(),C.Ve,new E.e251(),C.jM,new E.e252(),C.rd,new E.e253(),C.W5,new E.e254(),C.uX,new E.e255(),C.nt,new E.e256(),C.IT,new E.e257(),C.li,new E.e258(),C.PM,new E.e259(),C.ks,new E.e260(),C.Om,new E.e261(),C.iC,new E.e262(),C.Nv,new E.e263(),C.Wo,new E.e264(),C.FZ,new E.e265(),C.TW,new E.e266(),C.xS,new E.e267(),C.pD,new E.e268(),C.QF,new E.e269(),C.mi,new E.e270(),C.zz,new E.e271(),C.eO,new E.e272(),C.hO,new E.e273(),C.ei,new E.e274(),C.HK,new E.e275(),C.je,new E.e276(),C.Ef,new E.e277(),C.QL,new E.e278(),C.RH,new E.e279(),C.SP,new E.e280(),C.Q1,new E.e281(),C.ID,new E.e282(),C.dA,new E.e283(),C.bc,new E.e284(),C.kw,new E.e285(),C.nE,new E.e286(),C.ep,new E.e287(),C.hB,new E.e288(),C.J2,new E.e289(),C.hx,new E.e290(),C.zU,new E.e291(),C.OU,new E.e292(),C.bn,new E.e293(),C.mh,new E.e294(),C.Fh,new E.e295(),C.yv,new E.e296(),C.LP,new E.e297(),C.jh,new E.e298(),C.zd,new E.e299(),C.Db,new E.e300(),C.aF,new E.e301(),C.l4,new E.e302(),C.fj,new E.e303(),C.xw,new E.e304(),C.zn,new E.e305(),C.RJ,new E.e306(),C.Sk,new E.e307(),C.KS,new E.e308(),C.MA,new E.e309(),C.YE,new E.e310(),C.Uy,new E.e311()],null,null)
+y=P.EF([C.aP,new E.e312(),C.cg,new E.e313(),C.Zg,new E.e314(),C.S4,new E.e315(),C.AV,new E.e316(),C.bk,new E.e317(),C.lH,new E.e318(),C.am,new E.e319(),C.oE,new E.e320(),C.kG,new E.e321(),C.Wt,new E.e322(),C.mM,new E.e323(),C.aw,new E.e324(),C.XA,new E.e325(),C.i4,new E.e326(),C.mJ,new E.e327(),C.yL,new E.e328(),C.nr,new E.e329(),C.bJ,new E.e330(),C.kI,new E.e331(),C.vY,new E.e332(),C.yC,new E.e333(),C.VK,new E.e334(),C.aH,new E.e335(),C.GP,new E.e336(),C.vs,new E.e337(),C.Gr,new E.e338(),C.Fe,new E.e339(),C.tP,new E.e340(),C.yh,new E.e341(),C.Zb,new E.e342(),C.p8,new E.e343(),C.ld,new E.e344(),C.ne,new E.e345(),C.B0,new E.e346(),C.mr,new E.e347(),C.YT,new E.e348(),C.cJ,new E.e349(),C.WQ,new E.e350(),C.jU,new E.e351(),C.OO,new E.e352(),C.Mc,new E.e353(),C.QH,new E.e354(),C.rE,new E.e355(),C.nf,new E.e356(),C.ft,new E.e357(),C.Ge,new E.e358(),C.A7,new E.e359(),C.He,new E.e360(),C.oj,new E.e361(),C.d2,new E.e362(),C.uO,new E.e363(),C.fn,new E.e364(),C.yB,new E.e365(),C.Py,new E.e366(),C.uu,new E.e367(),C.qs,new E.e368(),C.rB,new E.e369(),C.z6,new E.e370(),C.hf,new E.e371(),C.uk,new E.e372(),C.Zi,new E.e373(),C.TN,new E.e374(),C.ur,new E.e375(),C.EV,new E.e376(),C.VI,new E.e377(),C.eh,new E.e378(),C.SA,new E.e379(),C.uG,new E.e380(),C.kV,new E.e381(),C.vp,new E.e382(),C.SR,new E.e383(),C.t6,new E.e384(),C.kB,new E.e385(),C.UX,new E.e386(),C.YS,new E.e387(),C.c6,new E.e388(),C.td,new E.e389(),C.zO,new E.e390(),C.Yp,new E.e391(),C.YV,new E.e392(),C.If,new E.e393(),C.Ys,new E.e394(),C.EP,new E.e395(),C.nX,new E.e396(),C.BV,new E.e397(),C.XM,new E.e398(),C.Ic,new E.e399(),C.O9,new E.e400(),C.tW,new E.e401(),C.Wj,new E.e402(),C.vb,new E.e403(),C.QK,new E.e404(),C.Xd,new E.e405(),C.kY,new E.e406(),C.vK,new E.e407(),C.Tc,new E.e408(),C.GR,new E.e409(),C.KX,new E.e410(),C.ja,new E.e411(),C.Dj,new E.e412(),C.X2,new E.e413(),C.UY,new E.e414(),C.Aa,new E.e415(),C.nY,new E.e416(),C.tg,new E.e417(),C.HD,new E.e418(),C.iU,new E.e419(),C.eN,new E.e420(),C.Gs,new E.e421(),C.bE,new E.e422(),C.YD,new E.e423(),C.PX,new E.e424(),C.tf,new E.e425(),C.Jd,new E.e426(),C.pH,new E.e427(),C.Ve,new E.e428(),C.jM,new E.e429(),C.rd,new E.e430(),C.uX,new E.e431(),C.nt,new E.e432(),C.IT,new E.e433(),C.PM,new E.e434(),C.ks,new E.e435(),C.Om,new E.e436(),C.iC,new E.e437(),C.Nv,new E.e438(),C.FZ,new E.e439(),C.TW,new E.e440(),C.pD,new E.e441(),C.mi,new E.e442(),C.zz,new E.e443(),C.dA,new E.e444(),C.kw,new E.e445(),C.nE,new E.e446(),C.hx,new E.e447(),C.zU,new E.e448(),C.OU,new E.e449(),C.zd,new E.e450(),C.RJ,new E.e451(),C.YE,new E.e452()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.XW,C.il,C.kH,C.Mt,C.Lg,C.qJ,C.Bi,C.il,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.uC,C.Mt,C.Wz,C.il,C.Ke,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.IZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.fU,C.Mt,C.pi,C.Mt,C.Fn,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.Mz,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.rC,C.Mt,C.kq,C.Mt,C.Dl,C.Mt,C.Mz,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.R9,C.Mt,C.OZ,C.il,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.tQ,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.Mz,C.al,C.il],null,null)
+y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.aj,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.XW,P.Fl(null,null),C.kH,P.EF([C.nr,C.BO],null,null),C.Lg,P.EF([C.S4,C.aj,C.AV,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Bi,P.Fl(null,null),C.KO,P.EF([C.yh,C.tO],null,null),C.wk,P.EF([C.AV,C.k1,C.eh,C.jO,C.Aa,C.k5,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.aj,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.on],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.P9],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.EF([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.Fl(null,null),C.Ke,P.EF([C.fn,C.Kk],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.xV],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.IZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.hd,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.fU,P.EF([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.EF([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.EF([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.EF([C.uk,C.rY,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Cg],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.rY,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.oh,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.rY],null,null),C.rC,P.EF([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.kq,P.EF([C.td,C.Zk],null,null),C.Dl,P.EF([C.VK,C.lW],null,null),C.Mz,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.Bf,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.Df,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.It,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.bp],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.OZ,P.Fl(null,null),C.il,P.EF([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.iH,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.NS,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.iH,C.rE,C.B7],null,null),C.tQ,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.pD,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.tO,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.Wq,"asStringLiteral",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.Wt,"clazz",C.I9,"closeItem",C.To,"closing",C.mM,"closureCtxt",C.aw,"closureFunc",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.nr,"context",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.hJ,"dartMetrics",C.yC,"declaredType",C.Lw,"deleteVm",C.eR,"deoptimizations",C.LS,"description",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.mw,"elements",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.ft,"guardClass",C.dr,"guardNullable",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Yb,"id",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.XJ,"isAbstractType",C.tJ,"isBool",C.F8,"isChromeTarget",C.fy,"isClosure",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.dR,"isFinal",C.MY,"isInlinable",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.C7,"isMirrorReference",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Iw,"isPlainInstance",C.tz,"isSentinel",C.AT,"isStatic",C.Lk,"isString",C.GS,"isWeakProperty",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.qi,"max",C.pX,"message",C.kB,"metric",C.LH,"metricChanged",C.a2,"min",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.uw,"nativeFields",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Yp,"owner",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.EP,"page",C.nX,"parent",C.BV,"parentContext",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.Tc,"referent",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.mn,"refreshRateChange",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.vm,"sampleBufferSizeChange",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.da,"size",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.pD,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.hB,"type",C.J2,"typeChecksEnabled",C.hx,"typeClass",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.zd,"value",C.Db,"valueAsString",C.aF,"valueAsStringIsTruncated",C.l4,"values",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Sk,"vmMetrics",C.KS,"vmName",C.MA,"vmType",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
 $.j8=new O.fH(y)
 $.Yv=new O.bY(y)
 $.qe=new O.ut(y)
-$.M6=[new E.e444(),new E.e445(),new E.e446(),new E.e447(),new E.e448(),new E.e449(),new E.e450(),new E.e451(),new E.e452(),new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470(),new E.e471(),new E.e472(),new E.e473(),new E.e474(),new E.e475(),new E.e476(),new E.e477(),new E.e478(),new E.e479(),new E.e480(),new E.e481(),new E.e482(),new E.e483(),new E.e484(),new E.e485(),new E.e486(),new E.e487(),new E.e488(),new E.e489(),new E.e490(),new E.e491(),new E.e492(),new E.e493(),new E.e494(),new E.e495(),new E.e496(),new E.e497(),new E.e498(),new E.e499(),new E.e500(),new E.e501(),new E.e502(),new E.e503(),new E.e504(),new E.e505(),new E.e506(),new E.e507(),new E.e508(),new E.e509(),new E.e510(),new E.e511(),new E.e512(),new E.e513(),new E.e514(),new E.e515(),new E.e516(),new E.e517(),new E.e518(),new E.e519(),new E.e520(),new E.e521(),new E.e522(),new E.e523(),new E.e524(),new E.e525(),new E.e526(),new E.e527(),new E.e528(),new E.e529(),new E.e530(),new E.e531(),new E.e532(),new E.e533(),new E.e534()]
+$.M6=[new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470(),new E.e471(),new E.e472(),new E.e473(),new E.e474(),new E.e475(),new E.e476(),new E.e477(),new E.e478(),new E.e479(),new E.e480(),new E.e481(),new E.e482(),new E.e483(),new E.e484(),new E.e485(),new E.e486(),new E.e487(),new E.e488(),new E.e489(),new E.e490(),new E.e491(),new E.e492(),new E.e493(),new E.e494(),new E.e495(),new E.e496(),new E.e497(),new E.e498(),new E.e499(),new E.e500(),new E.e501(),new E.e502(),new E.e503(),new E.e504(),new E.e505(),new E.e506(),new E.e507(),new E.e508(),new E.e509(),new E.e510(),new E.e511(),new E.e512(),new E.e513(),new E.e514(),new E.e515(),new E.e516(),new E.e517(),new E.e518(),new E.e519(),new E.e520(),new E.e521(),new E.e522(),new E.e523(),new E.e524(),new E.e525(),new E.e526(),new E.e527(),new E.e528(),new E.e529(),new E.e530(),new E.e531(),new E.e532(),new E.e533(),new E.e534(),new E.e535(),new E.e536(),new E.e537(),new E.e538(),new E.e539(),new E.e540(),new E.e541(),new E.e542(),new E.e543(),new E.e544(),new E.e545()]
 $.UG=!0
-F.E2()},"$0","jk",0,0,17],
+F.E2()},"$0","V7A",0,0,17],
 em:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jp9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Lb:{
 "^":"TpZ:12;",
@@ -2667,11 +2676,11 @@
 $isEH:true},
 Cv:{
 "^":"TpZ:12;",
-$1:[function(a){return J.r0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 ed:{
 "^":"TpZ:12;",
-$1:[function(a){return J.D8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.H3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wa:{
 "^":"TpZ:12;",
@@ -2683,7 +2692,7 @@
 $isEH:true},
 YL:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqZ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wf:{
 "^":"TpZ:12;",
@@ -2691,7 +2700,7 @@
 $isEH:true},
 Oa:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gQ1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gYZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 emv:{
 "^":"TpZ:12;",
@@ -2699,11 +2708,11 @@
 $isEH:true},
 Lbd:{
 "^":"TpZ:12;",
-$1:[function(a){return J.aA(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.rS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 QAa:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gfj()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gET()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 CvS:{
 "^":"TpZ:12;",
@@ -2711,11 +2720,11 @@
 $isEH:true},
 edy:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gkV()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gbZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 waE:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Wp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.XB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Ore:{
 "^":"TpZ:12;",
@@ -2723,23 +2732,23 @@
 $isEH:true},
 YLa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.K0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.rp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wfa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.hn(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Oaa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e0:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ze(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e1:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yz(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e2:{
 "^":"TpZ:12;",
@@ -2751,11 +2760,11 @@
 $isEH:true},
 e4:{
 "^":"TpZ:12;",
-$1:[function(a){return J.RC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.us(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e5:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gaP()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gmy()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e6:{
 "^":"TpZ:12;",
@@ -2767,15 +2776,15 @@
 $isEH:true},
 e8:{
 "^":"TpZ:12;",
-$1:[function(a){return J.E3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e9:{
 "^":"TpZ:12;",
-$1:[function(a){return J.on(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.tX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e10:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e11:{
 "^":"TpZ:12;",
@@ -2787,7 +2796,7 @@
 $isEH:true},
 e13:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dw(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ad(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e14:{
 "^":"TpZ:12;",
@@ -2803,11 +2812,11 @@
 $isEH:true},
 e17:{
 "^":"TpZ:12;",
-$1:[function(a){return J.OT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.xk(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e18:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Okq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e19:{
 "^":"TpZ:12;",
@@ -2819,7 +2828,7 @@
 $isEH:true},
 e21:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e22:{
 "^":"TpZ:12;",
@@ -2831,2053 +2840,2097 @@
 $isEH:true},
 e24:{
 "^":"TpZ:12;",
-$1:[function(a){return J.TG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gOF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e25:{
 "^":"TpZ:12;",
-$1:[function(a){return a.guh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.TG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e26:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gGB()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gOs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e27:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gQZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e28:{
 "^":"TpZ:12;",
-$1:[function(a){return a.guH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e29:{
 "^":"TpZ:12;",
-$1:[function(a){return J.GF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.guH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e30:{
 "^":"TpZ:12;",
-$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.CNb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e31:{
 "^":"TpZ:12;",
-$1:[function(a){return J.H2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e32:{
 "^":"TpZ:12;",
-$1:[function(a){return J.y3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Nx(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e33:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hg(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.y3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e34:{
 "^":"TpZ:12;",
-$1:[function(a){return J.k0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.BB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e35:{
 "^":"TpZ:12;",
-$1:[function(a){return J.rw(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.k0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e36:{
 "^":"TpZ:12;",
-$1:[function(a){return J.wt(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e37:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gej()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.MV(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e38:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gw2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gej()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e39:{
 "^":"TpZ:12;",
-$1:[function(a){return J.w8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gw2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e40:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ht(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.w8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e41:{
 "^":"TpZ:12;",
-$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ht(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e42:{
 "^":"TpZ:12;",
-$1:[function(a){return J.a3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.nEe(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e43:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.qf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e44:{
 "^":"TpZ:12;",
-$1:[function(a){return J.um(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iiZ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e45:{
 "^":"TpZ:12;",
-$1:[function(a){return J.io(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.um(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e46:{
 "^":"TpZ:12;",
-$1:[function(a){return J.UE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.io(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e47:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.UE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e48:{
 "^":"TpZ:12;",
-$1:[function(a){return J.IL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ak(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e49:{
 "^":"TpZ:12;",
-$1:[function(a){return J.nb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.IL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e50:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gty()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ur(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e51:{
 "^":"TpZ:12;",
-$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.grm()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e52:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gMX()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ua(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e53:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gMX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e54:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gq2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e55:{
 "^":"TpZ:12;",
-$1:[function(a){return J.pm(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.E1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e56:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gtJ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Nb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e57:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gtJ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e58:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PK(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.vE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e59:{
 "^":"TpZ:12;",
-$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.tdY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e60:{
 "^":"TpZ:12;",
-$1:[function(a){return J.WX(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.AU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e61:{
 "^":"TpZ:12;",
-$1:[function(a){return J.IP(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.WX7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e62:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gZd()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.IP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e63:{
 "^":"TpZ:12;",
-$1:[function(a){return J.TM(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gZd()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e64:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xo(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.TM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e65:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gkA()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Oi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e66:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gGK()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gqE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e67:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gan()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gAX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e68:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gcQ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gan()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e69:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gS7()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gcQ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e70:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gmE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gS7()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e71:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gP3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e72:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bu(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e73:{
 "^":"TpZ:12;",
-$1:[function(a){return J.eU(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bu(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e74:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e75:{
 "^":"TpZ:12;",
-$1:[function(a){return J.m4(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e76:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gmu()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.m4(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e77:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gCO()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gmu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e78:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gCO()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e79:{
 "^":"TpZ:12;",
-$1:[function(a){return J.tw(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e80:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.i2U(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e81:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gX1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e82:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUa()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e83:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gMp()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gRl()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e84:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Er(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.ghR()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e85:{
 "^":"TpZ:12;",
-$1:[function(a){return J.OB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUa()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e86:{
 "^":"TpZ:12;",
-$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gMp()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e87:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Er(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e88:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gc1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e89:{
 "^":"TpZ:12;",
-$1:[function(a){return J.aW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e90:{
 "^":"TpZ:12;",
-$1:[function(a){return J.aB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e91:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gu0()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gc1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e92:{
 "^":"TpZ:12;",
-$1:[function(a){return J.eS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.aW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e93:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gaj()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.hW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e94:{
 "^":"TpZ:12;",
-$1:[function(a){return a.giq()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gu0()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e95:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gBm()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.eS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e96:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gaj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e97:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fh(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.giq()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e98:{
 "^":"TpZ:12;",
-$1:[function(a){return J.NDJ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gBm()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e99:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gNI()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e100:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gva()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e101:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gKt()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.US(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e102:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gp2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gtI()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e103:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ns(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gva()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e104:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gKt()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e105:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gVM()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gp2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e106:{
 "^":"TpZ:12;",
-$1:[function(a){return a.glO()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ns(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e107:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gFY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e108:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gVM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e109:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gBF()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.glO()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e110:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUB()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gFY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e111:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gRs()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ho(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e112:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ix(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gBF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e113:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gMA()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e114:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqy()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gRh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e115:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzx()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ls(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e116:{
 "^":"TpZ:12;",
-$1:[function(a){return J.FN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gMA()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e117:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gt3()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gqy()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e118:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gho()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gzx()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e119:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gWL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.FN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e120:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gt3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e121:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Z6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e122:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gJE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gxL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e123:{
 "^":"TpZ:12;",
-$1:[function(a){return J.pO(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSO()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e124:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gHh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e125:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gW1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e126:{
 "^":"TpZ:12;",
-$1:[function(a){return a.goF()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gOC()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e127:{
 "^":"TpZ:12;",
-$1:[function(a){return a.geh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.pO(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e128:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gHY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gHh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e129:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXM()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gW1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e130:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gl5()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.goF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e131:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gFo()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.geh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e132:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gu7()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gHY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e133:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gl2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gXM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e134:{
 "^":"TpZ:12;",
-$1:[function(a){return J.aT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gl5()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e135:{
 "^":"TpZ:12;",
-$1:[function(a){return J.KG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gFo()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e136:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gi2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gu7()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e137:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gEB()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gl2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e138:{
 "^":"TpZ:12;",
-$1:[function(a){return J.AW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.wg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e139:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e140:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gi2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e141:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Yq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gnp()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e142:{
 "^":"TpZ:12;",
-$1:[function(a){return J.MQ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.AW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e143:{
 "^":"TpZ:12;",
-$1:[function(a){return J.X7(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iYM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e144:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kj(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e145:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gJW()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ZC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e146:{
 "^":"TpZ:12;",
-$1:[function(a){return J.q8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.OH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e147:{
 "^":"TpZ:12;",
-$1:[function(a){return a.ghX()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.X7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e148:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvU()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e149:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gJW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e150:{
 "^":"TpZ:12;",
-$1:[function(a){return J.f2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.q8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e151:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gcI()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e152:{
 "^":"TpZ:12;",
-$1:[function(a){return J.de(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gpd()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e153:{
 "^":"TpZ:12;",
-$1:[function(a){return J.t0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ik(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e154:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.f2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e155:{
 "^":"TpZ:12;",
-$1:[function(a){return J.cO(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e156:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzM()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.de(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e157:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gn0()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.t0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e158:{
 "^":"TpZ:12;",
-$1:[function(a){return a.giP()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e159:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gfJ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.cO(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e160:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gIT()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gzM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e161:{
 "^":"TpZ:12;",
-$1:[function(a){return J.c7(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gn0()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e162:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.giP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e163:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ol(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gbB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e164:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Y7(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gIT()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e165:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PR(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.HS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e166:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e167:{
 "^":"TpZ:12;",
-$1:[function(a){return J.qx(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e168:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dj(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e169:{
 "^":"TpZ:12;",
-$1:[function(a){return J.GL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e170:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e171:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.qx(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e172:{
 "^":"TpZ:12;",
-$1:[function(a){return J.X6(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e173:{
 "^":"TpZ:12;",
-$1:[function(a){return J.DA(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LY4(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e174:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e175:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gbA()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e176:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Zv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e177:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvK()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.DA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e178:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e179:{
 "^":"TpZ:12;",
-$1:[function(a){return J.t8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gDm()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e180:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gL1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e181:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gxQ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gvK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e182:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gEl()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.mk(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e183:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gxH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.t8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e184:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gL1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e185:{
 "^":"TpZ:12;",
-$1:[function(a){return J.mF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gxQ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e186:{
 "^":"TpZ:12;",
-$1:[function(a){return J.MT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gXP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e187:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gP2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e188:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gxH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e189:{
 "^":"TpZ:12;",
-$1:[function(a){return J.eb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.qN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e190:{
 "^":"TpZ:12;",
-$1:[function(a){return J.AF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.mF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e191:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fi(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.MT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e192:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e193:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gU6()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gqH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e194:{
 "^":"TpZ:12;",
-$1:[function(a){return J.cj(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.eb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e195:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Tm(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.AF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e196:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Yd(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e197:{
 "^":"TpZ:12;",
-$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e198:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gj9()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gU6()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e199:{
 "^":"TpZ:12;",
-$1:[function(a){return J.JX(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.cj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e200:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.os(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e201:{
 "^":"TpZ:12;",
-$1:[function(a){return J.CN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e202:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.xlH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e203:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ul(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gj9()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e204:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUx()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.JX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e205:{
 "^":"TpZ:12;",
-$1:[function(a){return J.id(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Zl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e206:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gm8()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Q0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e207:{
 "^":"TpZ:12;",
-$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.u5(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e208:{
 "^":"TpZ:12;",
-$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ul(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e209:{
 "^":"TpZ:12;",
-$1:[function(a){return a.ghL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUx()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e210:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gCM()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ks(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e211:{
 "^":"TpZ:12;",
-$1:[function(a){return J.At(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gm8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e212:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dZ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e213:{
 "^":"TpZ:12;",
-$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.xi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e214:{
 "^":"TpZ:12;",
-$1:[function(a){return J.up(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.ghL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e215:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gCM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e216:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gua()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.At(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e217:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gNS()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ph(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e218:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzK()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Xp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e219:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.up(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e220:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LM(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.n8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e221:{
 "^":"TpZ:12;",
-$1:[function(a){return J.uW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gua()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e222:{
 "^":"TpZ:12;",
-$1:[function(a){return J.W2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gNS()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e223:{
 "^":"TpZ:12;",
-$1:[function(a){return J.UT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gzK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e224:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kd(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e225:{
 "^":"TpZ:12;",
-$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e226:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ma(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e227:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gVc()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.W2H(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e228:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gpF()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.nl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e229:{
 "^":"TpZ:12;",
-$1:[function(a){return J.TY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.I1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e230:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gGL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e231:{
 "^":"TpZ:12;",
-$1:[function(a){return J.X9(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e232:{
 "^":"TpZ:12;",
-$1:[function(a){return J.nv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gVc()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e233:{
 "^":"TpZ:12;",
-$1:[function(a){return J.UP(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.geH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e234:{
 "^":"TpZ:12;",
-$1:[function(a){return J.UA(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.x3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e235:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gLd()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e236:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e237:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXR()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.nv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e238:{
 "^":"TpZ:12;",
-$1:[function(a){return J.uN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Fi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e239:{
 "^":"TpZ:12;",
-$1:[function(a){return J.le(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zD(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e240:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bh(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fx(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e241:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Y5(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e242:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ue(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gXR()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e243:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.P5(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e244:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dK(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e245:{
 "^":"TpZ:12;",
-$1:[function(a){return J.U8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.wS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e246:{
 "^":"TpZ:12;",
-$1:[function(a){return J.oN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e247:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gip()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e248:{
 "^":"TpZ:12;",
-$1:[function(a){return J.M2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e249:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gp8()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.be(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e250:{
 "^":"TpZ:12;",
-$1:[function(a){return J.F9(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Cr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e251:{
 "^":"TpZ:12;",
-$1:[function(a){return J.HB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.oN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e252:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fM(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gV8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e253:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ay(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e254:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gp8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e255:{
 "^":"TpZ:12;",
-$1:[function(a){return J.lA(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.F9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e256:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.HB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e257:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e258:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gDo()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e259:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gLT()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e260:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gAY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ff(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e261:{
 "^":"TpZ:12;",
-$1:[function(a){return J.j1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e262:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e263:{
 "^":"TpZ:12;",
-$1:[function(a){return J.l2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gDo()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e264:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gm2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gup()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e265:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gAY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e266:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Xa(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e267:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Xr(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e268:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzg()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.l2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e269:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gZn()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gm2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e270:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvs()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e271:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gVh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e272:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gZX()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Dc(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e273:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e274:{
 "^":"TpZ:12;",
-$1:[function(a){return J.As(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gZn()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e275:{
 "^":"TpZ:12;",
-$1:[function(a){return J.YG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gmj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e276:{
 "^":"TpZ:12;",
-$1:[function(a){return J.SG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gVh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e277:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gZX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e278:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gVF()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ug(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e279:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gkw()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.d5(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e280:{
 "^":"TpZ:12;",
-$1:[function(a){return J.K2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.SS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e281:{
 "^":"TpZ:12;",
-$1:[function(a){return J.eK(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.SG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e282:{
 "^":"TpZ:12;",
-$1:[function(a){return J.uy(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e283:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gVF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e284:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gdW()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gkw()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e285:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gCY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e286:{
 "^":"TpZ:12;",
-$1:[function(a){return J.un(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e287:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gjW()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.uy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e288:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e289:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gI2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gdW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e290:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gQR()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e291:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSu()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Gt(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e292:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSU()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gjW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e293:{
 "^":"TpZ:12;",
-$1:[function(a){return a.ghW()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e294:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gI2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e295:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gPE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e296:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSS()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e297:{
 "^":"TpZ:12;",
-$1:[function(a){return J.hI(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e298:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gYY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gFc()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e299:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gZ3()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e300:{
 "^":"TpZ:12;",
-$1:[function(a){return J.NV(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gPE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e301:{
 "^":"TpZ:12;",
-$1:[function(a){return J.wp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSS()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e302:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSn()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.hI(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e303:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gTE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gYY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e304:{
 "^":"TpZ:12;",
-$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gZ3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e305:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gaU()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e306:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return J.wp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e307:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gSn()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e308:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gzz()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e309:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gdr()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e310:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Fv(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e311:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gSY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e312:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e313:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e314:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e315:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e316:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sUP(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Fv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e317:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.su5(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e318:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.swz(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.m8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e319:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e320:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e321:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Kw(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e322:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sUP(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e323:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Hf(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.su5(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e324:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.swz(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e325:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e326:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e327:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Nh(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e328:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e329:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Xu(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Hf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e330:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e331:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e332:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.U8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e333:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sOF(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e334:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e335:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e336:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Xu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e337:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e338:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.AE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e339:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e340:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e341:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e342:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e343:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e344:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.fR(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e345:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.MI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e346:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e347:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e348:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e349:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e350:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e351:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.fR(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e352:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.UU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e353:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e354:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e355:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e356:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e357:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sSE(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e358:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e359:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e360:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e361:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e362:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Bj(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e363:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e364:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e365:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e366:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e367:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e368:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e369:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e370:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Bj(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e371:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e372:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e373:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e374:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e375:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.scI(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e376:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e377:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.rA(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e378:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.o3(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e379:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e380:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e381:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e382:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e383:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e384:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e385:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.rA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e386:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.b0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.oJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e387:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e388:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sqH(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e389:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e390:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e391:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sXP(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e392:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sP2(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e393:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e394:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e395:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.b0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e396:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e397:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sqH(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e398:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e399:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sCM(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e400:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e401:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.tv(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e402:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e403:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e404:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e405:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.jy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e406:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e407:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Eo(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e408:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sCM(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e409:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e410:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.tv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e411:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Co(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e412:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e413:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e414:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e415:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e416:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.G7(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Eo(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e417:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.pq(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e418:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e419:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e420:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sip(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e421:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e422:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e423:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Hn(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Rx(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e424:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e425:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.G7(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e426:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.lF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e427:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.jq(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e428:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e429:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sV8(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e430:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e431:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e432:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e433:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e434:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e435:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e436:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.yO(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.jq(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e437:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.cS(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e438:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sCY(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e439:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e440:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.ix(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e441:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Fc(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e442:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.NH(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e443:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e444:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e445:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("observatory-element",C.Mz)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.yO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e446:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e447:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){a.sQR(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e448:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e449:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e450:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.Fc(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e451:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.NH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e452:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e453:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e454:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("observatory-element",C.Mz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e455:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e456:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e457:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("object-ref",C.OZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e458:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e459:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e460:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e461:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e462:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e463:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e464:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("error-ref",C.Bi)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e465:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e466:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e467:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e468:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e469:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e470:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e471:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e472:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e473:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e474:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("error-ref",C.Bi)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e475:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e476:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e477:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e478:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e479:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e480:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e481:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e482:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e483:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e484:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e485:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e486:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e487:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e488:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e489:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e490:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e491:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-list-view",C.IZ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e492:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e493:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e494:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e495:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e496:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e497:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e498:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e499:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e500:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e501:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-list-view",C.IZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e502:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e503:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e504:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e505:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e506:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e507:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e508:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e509:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e510:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("object-common",C.rC)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e511:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("context-ref",C.XW)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e512:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("instance-view",C.Ke)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e513:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e514:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e515:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("metrics-page",C.Fn)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e516:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("metric-details",C.fU)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e517:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("metrics-graph",C.pi)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e518:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("context-view",C.kH)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e519:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e520:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("object-common",C.rC)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e521:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("context-ref",C.XW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e522:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("instance-view",C.Ke)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e523:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("stack-trace",C.tQ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e524:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e525:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("metrics-page",C.Fn)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e526:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("metric-details",C.fU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e527:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("metrics-graph",C.pi)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e528:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("object-view",C.kq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e529:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("context-view",C.kH)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e530:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e531:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e532:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e533:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e534:{
 "^":"TpZ:76;",
+$0:[function(){return A.Ad("stack-trace",C.tQ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e535:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e536:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e537:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e538:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e539:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e540:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e541:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e542:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e543:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e544:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e545:{
+"^":"TpZ:76;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
 $isEH:true}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"Vfx;BW,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gjD:function(a){return a.BW},
-sjD:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
+"^":"Vfx;BW,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+grs:function(a){return a.BW},
+srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
 pA:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,19,102],
 static:{KU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -4885,58 +4938,58 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.C8.LX(a)
-C.C8.XI(a)
+C.QD.LX(a)
+C.QD.XI(a)
 return a}}},
 Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{rt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.i3.LX(a)
-C.i3.XI(a)
+C.YZz.LX(a)
+C.YZz.XI(a)
 return a}}}}],["","",,O,{
 "^":"",
-CZ:{
-"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
+TY:{
+"^":"Y2;od>,Ru>,eT,yt,qu,oH,PU,aZ,Lk,Vg,ij",
 Pz:function(a){var z,y,x,w,v,u,t
-z=this.ks
+z=this.qu
 if(z.length>0)return
-for(y=this.Ru.gLT(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.Ff
+for(y=this.Ru.gup(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.lo
 if(v.geh()===!0)continue
 u=[]
 u.$builtinTypeInfo=[G.Y2]
-t=new O.CZ(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
+t=new O.TY(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 this.Ru.gLT().XG.length>0}},
+aY:function(){},
+Nh:function(){return this.Ru.gup().xN.length>0}},
 eo:{
-"^":"tuj;CA,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"tuj;CA,Hm=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.CA},
 sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
 Es:function(a){var z
@@ -4945,46 +4998,46 @@
 a.Hm=new G.ih(z,null,null)
 z=a.CA
 if(z!=null)this.hP(a,z.gDZ())},
-vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
+vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","grV",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
-u=new O.CZ(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
+u=new O.TY(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
 u.k7(null)
 z=u
-w=J.Mx(z)
+w=J.dd(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=new O.TY(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
 s.k7(t)
 w.push(s)
-a.Hm.G7(z)}catch(q){w=H.Ru(q)
+a.Hm.rT(z)}catch(q){w=H.Ru(q)
 y=w
 x=new H.oP(q,null)
-N.QM("").r0("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
+N.QM("").OW("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
 Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
-ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+ZZ:[function(a,b){return C.Jp[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
 wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.IO(z)
+v=J.JC(z)
 if(typeof v!=="number")return v.W()
-w.lo(v-1)}catch(u){w=H.Ru(u)
+w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+N.QM("").OW("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
 static:{l0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5003,27 +5056,27 @@
 $isEH:true}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"Vct;Wf,ef,QI,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Vct;Wf,ef,QI,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRu:function(a){return a.Wf},
 sRu:function(a,b){a.Wf=this.ct(a,C.XA,a.Wf,b)},
 gWt:function(a){return a.ef},
 sWt:function(a,b){a.ef=this.ct(a,C.yB,a.ef,b)},
 gCF:function(a){return a.QI},
 sCF:function(a,b){a.QI=this.ct(a,C.tg,a.QI,b)},
-vV:[function(a,b){return a.Wf.cv("eval?expr="+P.jW(C.Fa,b,C.xM,!1))},"$1","gZ2",2,0,109,110],
-Be:[function(a,b){return a.Wf.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,111,112],
-zs:[function(a,b){return a.Wf.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,111,113],
+vV:[function(a,b){return a.Wf.cv("eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+Be:[function(a,b){return a.Wf.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gPe",2,0,111,112],
+Cq:[function(a,b){return a.Wf.cv("retained").ml(new Z.Rc(a))},"$1","ghN",2,0,111,113],
 pA:[function(a,b){a.ef=this.ct(a,C.yB,a.ef,null)
 a.QI=this.ct(a,C.tg,a.QI,null)
 J.LE(a.Wf).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
-static:{TH:function(a){var z,y,x,w
+Da:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
+static:{zB:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5039,29 +5092,29 @@
 Ob:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.ef=J.NB(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
+z.ef=J.Q5(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-SS:{
+Rc:{
 "^":"TpZ:115;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(a.gPE(),null,null)
-z.QI=J.NB(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
+z.QI=J.Q5(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true}}],["","",,O,{
 "^":"",
 VY:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtT:function(a){return a.tY},
 Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
+this.ct(a,C.i4,0,1)},"$1","gBj",2,0,12,59],
 static:{E3U:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5073,14 +5126,14 @@
 return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"D13;Xx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"D13;Xx,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.fS())},
+J.SK(z).ml(new F.Jr())},
 pA:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,19,102],
 lE:function(a,b){var z,y,x
 z=J.Vs(b).dA.getAttribute("data-jump-target")
@@ -5095,13 +5148,13 @@
 QT:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
 J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,116,2,106,107],
-static:{fm:function(a){var z,y,x,w
+static:{FeK:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5114,17 +5167,17 @@
 D13:{
 "^":"uL+Pi;",
 $isd3:true},
-fS:{
+Jr:{
 "^":"TpZ:117;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,85,"call"],
+$1:[function(a){a.QW()},"$1",null,2,0,null,85,"call"],
 $isEH:true}}],["","",,T,{
 "^":"",
 uV:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new T.zG(a)).wM(c)
-else{J.Z6(z,null)
+if(b===!0)J.LE(z).ml(new T.WW(a)).wM(c)
+else{z.sZ3(null)
 c.$0()}},"$2","gus",4,0,118,119,120],
 static:{CvM:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -5132,8 +5185,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5143,7 +5196,7 @@
 C.vS.LX(a)
 C.vS.XI(a)
 return a}}},
-zG:{
+WW:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
@@ -5153,17 +5206,17 @@
 $isEH:true}}],["","",,U,{
 "^":"",
 NY:{
-"^":"WZq;AE,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"WZq;AE,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 geo:function(a){return a.AE},
 seo:function(a,b){a.AE=this.ct(a,C.nr,a.AE,b)},
 pA:[function(a,b){J.LE(a.AE).wM(b)},"$1","gvC",2,0,122,120],
-static:{q5n:function(a){var z,y,x,w
+static:{ui:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5178,9 +5231,9 @@
 $isd3:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;tH,uo,nx,oM,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-goE:function(a){return a.tH},
-soE:function(a,b){a.tH=this.ct(a,C.mr,a.tH,b)},
+"^":"SaM;GV,uo,nx,oM,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+goE:function(a){return a.GV},
+soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
 gO9:function(a){return a.uo},
 sO9:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
 gFR:function(a){return a.nx},
@@ -5190,26 +5243,26 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 tn:[function(a,b){var z=a.oM
-a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,19,59],
-Db:[function(a){var z=a.tH
-a.tH=this.ct(a,C.mr,z,z!==!0)
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,19,59],
+WM:[function(a){var z=a.GV
+a.GV=this.ct(a,C.mr,z,z!==!0)
 a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","goJ",0,0,17],
 AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
-this.AV(a,a.tH!==!0,this.goJ(a))}else{z=a.tH
-a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,49,50,85],
+this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,49,50,85],
 static:{U9:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.tH=!1
+a.GV=!1
 a.uo=!1
 a.nx=null
 a.oM=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5223,7 +5276,7 @@
 "^":"xc+Pi;",
 $isd3:true}}],["","",,H,{
 "^":"",
-DU:function(){return new P.lj("No element")},
+Wp: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)
@@ -5233,8 +5286,7 @@
 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()
+EHn:function(a,b,c){var z,y
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
@@ -5351,9 +5403,9 @@
 for(;y<z;++y){b.$1(this.Zv(0,y))
 if(z!==this.gB(this))throw H.b(P.a4(this))}},
 gl0:function(a){return J.xC(this.gB(this),0)},
-gqG:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
+gtH:function(a){if(J.xC(this.gB(this),0))throw H.b(H.Wp())
 return this.Zv(0,0)},
-grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
+grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.Wp())
 return this.Zv(0,J.bI(this.gB(this),1))},
 tg:function(a,b){var z,y
 z=this.gB(this)
@@ -5379,14 +5431,16 @@
 for(;v<z;++v){w.IN+=b
 u=this.Zv(0,v)
 w.IN+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}else{w=P.p9("")
+if(z!==this.gB(this))throw H.b(P.a4(this))}y=w.IN
+return y.charCodeAt(0)==0?y:y}else{w=P.p9("")
 if(typeof z!=="number")return H.s(z)
 v=0
 for(;v<z;++v){u=this.Zv(0,v)
 w.IN+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}},
+if(z!==this.gB(this))throw H.b(P.a4(this))}y=w.IN
+return y.charCodeAt(0)==0?y:y}},
 ad:function(a,b){return P.mW.prototype.ad.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5409,8 +5463,8 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y,x
-z=P.Ls(null,null,null,H.W8(this,"aL",0))
+Oe:function(a){var z,y,x
+z=P.fM(null,null,null,H.W8(this,"aL",0))
 y=0
 while(!0){x=this.gB(this)
 if(typeof x!=="number")return H.s(x)
@@ -5418,44 +5472,44 @@
 z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
-"^":"aL;Hb,ay,Hx",
+"^":"aL;Hb,bS,Hx",
 gUD:function(){var z,y
 z=J.q8(this.Hb)
 y=this.Hx
 if(y==null||J.xZ(y,z))return z
 return y},
-gdM:function(){var z,y
+gAs:function(){var z,y
 z=J.q8(this.Hb)
-y=this.ay
+y=this.bS
 if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
 z=J.q8(this.Hb)
-y=this.ay
+y=this.bS
 if(J.J5(y,z))return 0
 x=this.Hx
 if(x==null||J.J5(x,z))return J.bI(z,y)
 return J.bI(x,y)},
-Zv:function(a,b){var z=J.WB(this.gdM(),b)
+Zv:function(a,b){var z=J.WB(this.gAs(),b)
 if(J.u6(b,0)||J.J5(z,this.gUD()))throw H.b(P.TE(b,0,this.gB(this)))
 return J.i9(this.Hb,z)},
 eR:function(a,b){var z,y
 if(J.u6(b,0))throw H.b(P.N(b))
-z=J.WB(this.ay,b)
+z=J.WB(this.bS,b)
 y=this.Hx
 if(y!=null&&J.J5(z,y)){y=new H.MB()
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y}return H.c1(this.Hb,z,y,H.u3(this,0))},
-rh:function(a,b){var z,y,x
+qZ:function(a,b){var z,y,x
 if(b<0)throw H.b(P.N(b))
 z=this.Hx
-y=this.ay
+y=this.bS
 if(z==null)return H.c1(this.Hb,y,J.WB(y,b),H.u3(this,0))
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
 return H.c1(this.Hb,y,x,H.u3(this,0))}},
 Hd:function(a,b,c,d){var z,y,x
-z=this.ay
+z=this.bS
 y=J.Wx(z)
 if(y.C(z,0))throw H.b(P.N(z))
 x=this.Hx
@@ -5465,17 +5519,17 @@
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
-"^":"a;Hb,bd,QX,Ff",
-gl:function(){return this.Ff},
+"^":"a;Hb,SW,QX,lo",
+gl:function(){return this.lo},
 G:function(){var z,y,x,w
 z=this.Hb
 y=J.U6(z)
 x=y.gB(z)
-if(!J.xC(this.bd,x))throw H.b(P.a4(z))
+if(!J.xC(this.SW,x))throw H.b(P.a4(z))
 w=this.QX
 if(typeof x!=="number")return H.s(x)
-if(w>=x){this.Ff=null
-return!1}this.Ff=y.Zv(z,w);++this.QX
+if(w>=x){this.lo=null
+return!1}this.lo=y.Zv(z,w);++this.QX
 return!0}},
 i1:{
 "^":"mW;Hb,Oh",
@@ -5485,8 +5539,8 @@
 return z},
 gB:function(a){return J.q8(this.Hb)},
 gl0:function(a){return J.FN(this.Hb)},
-gqG:function(a){return this.Mi(J.bT(this.Hb))},
-grZ:function(a){return this.Mi(J.MQ(this.Hb))},
+gtH:function(a){return this.Mi(J.Es(this.Hb))},
+grZ:function(a){return this.Mi(J.OH(this.Hb))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
@@ -5495,13 +5549,13 @@
 "^":"i1;Hb,Oh",
 $isyN:true},
 MH:{
-"^":"Anv;Ff,CL,Oh",
+"^":"Anv;lo,CL,Oh",
 Mi:function(a){return this.Oh.$1(a)},
 G:function(){var z=this.CL
-if(z.G()){this.Ff=this.Mi(z.gl())
-return!0}this.Ff=null
+if(z.G()){this.lo=this.Mi(z.gl())
+return!0}this.lo=null
 return!1},
-gl:function(){return this.Ff},
+gl:function(){return this.lo},
 $asAnv:function(a,b){return[b]}},
 A8:{
 "^":"aL;ON,Oh",
@@ -5514,47 +5568,47 @@
 $isyN:true},
 U5:{
 "^":"mW;Hb,Oh",
-gA:function(a){var z=new H.vG(J.mY(this.Hb),this.Oh)
+gA:function(a){var z=new H.Mo(J.mY(this.Hb),this.Oh)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-vG:{
+Mo:{
 "^":"Anv;CL,Oh",
 Mi:function(a){return this.Oh.$1(a)},
 G:function(){for(var z=this.CL;z.G();)if(this.Mi(z.gl())===!0)return!0
 return!1},
 gl:function(){return this.CL.gl()}},
-oA:{
+Fm:{
 "^":"mW;Hb,Oh",
-gA:function(a){var z=new H.yY(J.mY(this.Hb),this.Oh,C.MS,null)
+gA:function(a){var z=new H.P8(J.mY(this.Hb),this.Oh,C.MS,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]}},
-yY:{
-"^":"a;CL,Oh,Br,Ff",
+P8:{
+"^":"a;CL,Oh,Qc,lo",
 Mi:function(a){return this.Oh.$1(a)},
-gl:function(){return this.Ff},
+gl:function(){return this.lo},
 G:function(){var z,y
-z=this.Br
+z=this.Qc
 if(z==null)return!1
-for(y=this.CL;!z.G();){this.Ff=null
-if(y.G()){this.Br=null
+for(y=this.CL;!z.G();){this.lo=null
+if(y.G()){this.Qc=null
 z=J.mY(this.Mi(y.gl()))
-this.Br=z}else return!1}this.Ff=this.Br.gl()
+this.Qc=z}else return!1}this.lo=this.Qc.gl()
 return!0}},
 AM:{
 "^":"mW;Hb,u3",
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
-return H.ke(this.Hb,this.u3+b,H.u3(this,0))},
+return H.p6(this.Hb,this.u3+b,H.u3(this,0))},
 gA:function(a){var z=this.Hb
-z=new H.b2(z.gA(z),this.u3)
+z=new H.Lh(z.gA(z),this.u3)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 jb:function(a,b,c){if(this.u3<0)throw H.b(P.KP(this.u3))},
-static:{ke:function(a,b,c){var z
+static:{p6:function(a,b,c){var z
 if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
 z.jb(a,b,c)
-return z}return H.GJ(a,b,c)},GJ:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
+return z}return H.Xn(a,b,c)},Xn:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
 z.jb(a,b,c)
 return z}}},
 wB:{
@@ -5565,7 +5619,7 @@
 if(J.J5(y,0))return y
 return 0},
 $isyN:true},
-b2:{
+Lh:{
 "^":"Anv;CL,u3",
 G:function(){var z,y
 for(z=this.CL,y=0;y<this.u3;++y)z.G()
@@ -5578,13 +5632,13 @@
 aN:function(a,b){},
 gl0:function(a){return!0},
 gB:function(a){return 0},
-gqG:function(a){throw H.b(H.DU())},
-grZ:function(a){throw H.b(H.DU())},
+gtH:function(a){throw H.b(H.Wp())},
+grZ:function(a){throw H.b(H.Wp())},
 tg:function(a,b){return!1},
 Vr:function(a,b){return!1},
 zV:function(a,b){return""},
 ad:function(a,b){return this},
-ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
+ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
 return this},
 tt:function(a,b){var z
@@ -5593,19 +5647,19 @@
 z.fixed$length=init
 z=H.VM(z,[H.u3(this,0)])}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){return P.Ls(null,null,null,H.u3(this,0))},
+Oe:function(a){return P.fM(null,null,null,H.u3(this,0))},
 $isyN:true},
 FuS:{
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
-wb:{
+TNQ:{
 "^":"a;",
 static:{bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.Ff)},Ck:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.Ff)===!0)return!0
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.lo)},Ck:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
 return!1},n3:function(a,b,c){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.Ff)
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.lo)
 return b},DQ:function(a,b){var z,y,x,w,v
 z=[]
 y=a.length
@@ -5616,14 +5670,14 @@
 if(y!==x)throw H.b(P.a4(a))}x=z.length
 if(x===y)return
 C.Nm.sB(a,x)
-for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},FU:function(a,b,c){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
-if(b.$1(y)===!0)return y}throw H.b(H.DU())},ig:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},xF:function(a,b,c){var z=J.Wx(b)
+for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},Sz:function(a,b,c){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
+if(b.$1(y)===!0)return y}throw H.b(H.Wp())},ig:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},K0:function(a,b,c){var z=J.Wx(b)
 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)
+H.K0(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))
@@ -5652,20 +5706,20 @@
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+aP:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 uk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 oq:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-JJ:{
+ReL:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
 Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+aP:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
@@ -5682,7 +5736,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+JJ;",
+"^":"ark+ReL;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5729,10 +5783,10 @@
 z=H.KT(z,[z,z]).Zg(a)
 if(z)return b.O8(a)
 else return b.cR(a)},
-DJ:function(a,b){var z=P.Dt(b)
-P.cH(C.ny,new P.w4(a,z))
+nd:function(a,b){var z=P.Dt(b)
+P.cH(C.ny,new P.Sv(a,z))
 return z},
-Ne:function(a,b){var z,y,x,w,v
+hz:function(a,b){var z,y,x,w,v
 z={}
 z.a=null
 z.b=null
@@ -5740,7 +5794,7 @@
 z.d=null
 z.e=null
 y=new P.j7(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.Ff.Rx(new P.Tw(z,b,z.c++),y)
+for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
 y=z.c
 if(y===0)return P.Ab(C.xD,null)
 w=Array(y)
@@ -5779,31 +5833,31 @@
 $.X3.hk(y,x)}},
 QEz:[function(a){},"$1","yy",2,0,19,20],
 Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,21,22,23,24],
-dL:[function(){},"$0","v3",0,0,17],
+ax:[function(){},"$0","No",0,0,17],
 FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
 c.$2(z,y)}},
 NX:function(a,b,c,d){var z=a.Gv()
-if(!!J.x(z).$isb8)z.wM(new P.dR(b,c,d))
+if(!!J.x(z).$isb8)z.wM(new P.ap(b,c,d))
 else b.ZL(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
 Bb:function(a,b,c){var z=a.Gv()
-if(!!J.x(z).$isb8)z.wM(new P.QX(b,c))
+if(!!J.x(z).$isb8)z.wM(new P.Ry(b,c))
 else b.In(c)},
 cH:function(a,b){var z
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 SZ:function(a,b){var z
-if(J.xC($.X3,C.NU))return $.X3.Ud(a,b)
+if(J.xC($.X3,C.NU))return $.X3.lB(a,b)
 z=$.X3
-return z.Ud(a,z.rO(b,!0))},
+return z.lB(a,z.rO(b,!0))},
 YF:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
 dp:function(a,b){var z=a.gVs()
-return H.zw(z<0?0:z,b)},
+return H.jW(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
@@ -5837,8 +5891,8 @@
 z=P.Us(c)
 try{y=d.$2(e,f)
 return y}finally{$.X3=z}},"$6","xd",12,0,33,26,27,28,30,8,9],
-nI:[function(a,b,c,d){return d},"$4","W7",8,0,34,26,27,28,30],
-cQt:[function(a,b,c,d){return d},"$4","H9",8,0,35,26,27,28,30],
+MU:[function(a,b,c,d){return d},"$4","u3Q",8,0,34,26,27,28,30],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,35,26,27,28,30],
 bD:[function(a,b,c,d){return d},"$4","Dk",8,0,36,26,27,28,30],
 ZK:[function(a,b,c,d){var z,y
 if(C.NU!==c)d=c.ce(d)
@@ -5849,18 +5903,18 @@
 $.k8.aw=y
 $.k8=y}},"$4","yA",8,0,37,26,27,28,30],
 h8X:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","zci",10,0,38,26,27,28,39,40],
-HwS:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","RN",10,0,41,26,27,28,39,40],
-JjS:[function(a,b,c,d){H.Af(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
+Gi:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","Uwa",10,0,41,26,27,28,39,40],
+JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
 CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
-E1:[function(a,b,c,d,e){var z,y
+qc:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-if(d==null)d=C.zb
+if(d==null)d=C.Qq
 else if(!J.x(d).$isyQ)throw H.b(P.u("ZoneSpecifications must be instantiated with the provided constructor."))
 if(e==null)z=!!J.x(c).$ism0?c.gSe():P.YM(null,null,null,null,null)
 else{z=P.YM(null,null,null,null,null)
-z.FV(0,e)}y=new P.l7(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
-y.bC(c,d,z)
-return y},"$5","OjX",10,0,45,26,27,28,46,47],
+z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.Ij(c,d,z)
+return y},"$5","xN",10,0,45,26,27,28,46,47],
 th:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
@@ -5895,10 +5949,10 @@
 static:{Uz:function(a,b){return new P.O6(a,P.HR(a,b))},HR:function(a,b){if(b!=null)return b
 if(!!J.x(a).$isXS)return a.gI4()
 return}}},
-Ik:{
+rk:{
 "^":"u2;BT"},
-LR:{
-"^":"Bx;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,fk",
+JIw:{
+"^":"Bx;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,LT",
 gBT:function(){return this.BT},
 uO:function(a){var z=this.ru
 if(typeof z!=="number")return z.i()
@@ -5906,7 +5960,7 @@
 fc:function(){var z=this.ru
 if(typeof z!=="number")return z.w()
 this.ru=z^1},
-gh0:function(){var z=this.ru
+ga3:function(){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
 Pa:function(){var z=this.ru
@@ -5917,10 +5971,10 @@
 return(z&4)!==0},
 jy:[function(){},"$0","gb9",0,0,17],
 ie:[function(){},"$0","gxl",0,0,17],
-static:{"^":"E2b,HCK,VCd"}},
+static:{"^":"E2b,HCK,id"}},
 WVu:{
 "^":"a;iE@,SJ@",
-gvq:function(a){var z=new P.Ik(this)
+gvq:function(a){var z=new P.rk(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gUF:function(){return!1},
@@ -5937,13 +5991,13 @@
 a.sSJ(a)
 a.siE(a)},
 MI:function(a,b,c,d){var z,y,x
-if((this.YM&4)!==0){if(c==null)c=P.v3()
+if((this.YM&4)!==0){if(c==null)c=P.No()
 z=new P.EM($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.q1()
 return z}z=$.X3
 y=d?1:0
-x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
+x=new P.JIw(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
 x.Cy(a,b,c,d,H.u3(this,0))
 x.SJ=x
@@ -5954,14 +6008,14 @@
 y.siE(x)
 this.SJ=x
 x.ru=this.YM&1
-if(this.iE===x)P.ot(this.Ld)
+if(this.iE===x)P.ot(this.bA)
 return x},
 rR:function(a){if(a.giE()===a)return
-if(a.gh0())a.Pa()
+if(a.ga3())a.Pa()
 else{this.pW(a)
 if((this.YM&2)===0&&this.iE===this)this.hg()}return},
-Pm:function(a){},
-Bu:function(a){},
+EB:function(a){},
+Mt:function(a){},
 Pq:function(){if((this.YM&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.YM>=4)throw H.b(this.Pq())
@@ -5972,14 +6026,14 @@
 if(z>=4)throw H.b(this.Pq())
 this.YM=z|4
 y=this.WH()
-this.PS()
+this.Dd()
 return y},
 Rg:function(a,b){this.MW(b)},
 MR:function(a,b){this.y7(a,b)},
-AN:function(){var z=this.Hz
+EC:function(){var z=this.Hz
 this.Hz=null
 this.YM&=4294967287
-C.jN.dS(z)},
+C.bP.tZ(z)},
 HI:function(a){var z,y,x,w
 z=this.YM
 if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
@@ -6003,7 +6057,7 @@
 hg:function(){if((this.YM&4)!==0&&this.Kj.YM===0)this.Kj.Xf(null)
 P.ot(this.Ro)}},
 zW:{
-"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;bA,Ro,YM,iE,SJ,Hz,Kj",
 MW:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.YM|=2
@@ -6012,39 +6066,39 @@
 if(this.iE===this)this.hg()
 return}this.HI(new P.tK(this,a))},
 y7:function(a,b){if(this.iE===this)return
-this.HI(new P.OR(this,a,b))},
-PS:function(){if(this.iE!==this)this.HI(new P.Bg(this))
+this.HI(new P.QG(this,a,b))},
+Dd:function(){if(this.iE!==this)this.HI(new P.Bg(this))
 else this.Kj.Xf(null)}},
 tK:{
 "^":"TpZ;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
 $signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-OR:{
+QG:{
 "^":"TpZ;a,b,c",
 $1:function(a){a.MR(this.b,this.c)},
 $isEH:true,
 $signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"TpZ;a",
-$1:function(a){a.AN()},
+$1:function(a){a.EC()},
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"GJ",args:[[P.LR,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"Mc",args:[[P.JIw,a]]}},this.a,"zW")}},
 DL:{
-"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;bA,Ro,YM,iE,SJ,Hz,Kj",
 MW:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
+for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
 y.$builtinTypeInfo=[null]
 z.C2(y)}},
 y7:function(a,b){var z
 for(z=this.iE;z!==this;z=z.giE())z.C2(new P.Dn(a,b,null))},
-PS:function(){var z=this.iE
+Dd:function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.C2(C.ZB)
 else this.Kj.Xf(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
-w4:{
+Sv:{
 "^":"TpZ:76;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.In(this.a.$0())}catch(x){w=H.Ru(x)
@@ -6076,17 +6130,17 @@
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-A0:{
+A5:{
 "^":"a;",
-$isA0:true},
+$isA5:true},
 Pf0:{
 "^":"a;",
-$isA0:true},
+$isA5:true},
 Zf:{
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.YM!==0)throw H.b(P.w("Future already completed"))
-z.Xf(b)},function(a){return this.j3(a,null)},"dS","$1","$0","gv6",0,2,128,22,20],
+z.Xf(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,128,22,20],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
@@ -6161,13 +6215,13 @@
 Nk:function(a,b){if(this.YM!==0)H.vh(P.w("Future already completed"))
 this.YM=1
 this.t9.wr(new P.ZL(this,a,b))},
-X8:function(a,b,c){this.Nk(a,b)},
 J9:function(a,b){this.Xf(a)},
+X8:function(a,b,c){this.Nk(a,b)},
 $isGc:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,oN1,NKU",Dt:function(a){return H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[b])
 z.J9(a,b)
-return z},pz:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
+return z},t5:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
 return z},k3:function(a,b){b.sKl(!0)
 a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){b.sKl(!0)
@@ -6325,11 +6379,11 @@
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
-wS:{
+cb:{
 "^":"a;",
-ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"wS",0)])},
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},133],
-lM:[function(a,b){return H.VM(new P.AE(b,this),[H.W8(this,"wS",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"xv",ret:P.wS,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},133],
+ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"cb",0)])},
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.cb,args:[{func:"Pw",args:[a]}]}},this.$receiver,"cb")},133],
+yx:[function(a,b){return H.VM(new P.Bgk(b,this),[H.W8(this,"cb",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"T6w",ret:P.cb,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},133],
 zV:function(a,b){var z,y,x
 z={}
 y=P.Dt(P.qU)
@@ -6342,7 +6396,7 @@
 z={}
 y=P.Dt(P.SQ)
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gFa())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.tG(y),y.gFa())
 return y},
 aN:function(a,b){var z,y
 z={}
@@ -6354,13 +6408,13 @@
 z={}
 y=P.Dt(P.SQ)
 z.a=null
-z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gFa())
+z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gFa())
 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.hh(z,y),y.gFa())
+this.KR(new P.B5(z),!0,new P.PI(z,y),y.gFa())
 return y},
 gl0:function(a){var z,y
 z={}
@@ -6369,32 +6423,32 @@
 z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gFa())
 return y},
 br:function(a){var z,y
-z=H.VM([],[H.W8(this,"wS",0)])
-y=P.Dt([P.WO,H.W8(this,"wS",0)])
-this.KR(new P.lv(this,z),!0,new P.VVy(z,y),y.gFa())
+z=H.VM([],[H.W8(this,"cb",0)])
+y=P.Dt([P.WO,H.W8(this,"cb",0)])
+this.KR(new P.lv(this,z),!0,new P.Ul(z,y),y.gFa())
 return y},
-zH:function(a){var z,y
-z=P.Ls(null,null,null,H.W8(this,"wS",0))
-y=P.Dt([P.Ol,H.W8(this,"wS",0)])
+Oe:function(a){var z,y
+z=P.fM(null,null,null,H.W8(this,"cb",0))
+y=P.Dt([P.z5,H.W8(this,"cb",0)])
 this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gFa())
 return y},
 eR:function(a,b){var z=H.VM(new P.pt(b,this),[null])
-z.mh(this,b,null)
+z.qI(this,b,null)
 return z},
-gqG:function(a){var z,y
+gtH:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"wS",0))
+y=P.Dt(H.W8(this,"cb",0))
 z.a=null
 z.a=this.KR(new P.lU(z,this,y),!0,new P.xp(y),y.gFa())
 return y},
 grZ:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"wS",0))
+y=P.Dt(H.W8(this,"cb",0))
 z.a=null
 z.b=!1
 this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gFa())
 return y},
-$iswS:true},
+$iscb:true},
 dW3:{
 "^":"TpZ;a,b,c,d,e",
 $1:[function(a){var z,y,x,w,v
@@ -6406,24 +6460,25 @@
 y=new H.oP(w,null)
 P.NX(x.a,this.d,z,y)}},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 QCh:{
 "^":"TpZ:12;f",
 $1:[function(a){this.f.yk(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Lp0:{
 "^":"TpZ:76;UI,bK",
-$0:[function(){this.UI.In(this.bK.IN)},"$0",null,0,0,null,"call"],
+$0:[function(){var z=this.bK.IN
+this.UI.In(z.charCodeAt(0)==0?z:z)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Sd:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.LB(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
+P.FE(new P.bi(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-LB:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+bi:{
 "^":"TpZ:76;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
@@ -6431,20 +6486,20 @@
 "^":"TpZ:135;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-DO:{
+tG:{
 "^":"TpZ:76;bK",
 $0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"TpZ;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,134,"call"],
+$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-Rl:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+at:{
 "^":"TpZ:76;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
-at:{
+mj:{
 "^":"TpZ:12;",
 $1:function(a){},
 $isEH:true},
@@ -6452,14 +6507,14 @@
 "^":"TpZ:76;UI",
 $0:[function(){this.UI.In(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ee:{
+Ia:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
 P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 WN:{
 "^":"TpZ:76;e,f",
 $0:function(){return this.e.$1(this.f)},
@@ -6468,15 +6523,15 @@
 "^":"TpZ:135;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-Ia:{
+BSd:{
 "^":"TpZ:76;bK",
 $0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
-PI:{
+B5:{
 "^":"TpZ:12;a",
 $1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-hh:{
+PI:{
 "^":"TpZ:76;a,b",
 $0:[function(){this.b.In(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -6492,8 +6547,8 @@
 "^":"TpZ;a,b",
 $1:[function(a){this.b.push(a)},"$1",null,2,0,null,124,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
-VVy:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+Ul:{
 "^":"TpZ:76;c,d",
 $0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -6501,7 +6556,7 @@
 "^":"TpZ;a,b",
 $1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,124,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
 yZ:{
 "^":"TpZ:76;c,d",
 $0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
@@ -6510,11 +6565,11 @@
 "^":"TpZ;a,b,c",
 $1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 xp:{
 "^":"TpZ:76;d",
 $0:[function(){var z,y,x,w
-try{x=H.DU()
+try{x=H.Wp()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
@@ -6526,13 +6581,13 @@
 z.b=!0
 z.a=a},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 eI:{
 "^":"TpZ:76;a,c",
 $0:[function(){var z,y,x,w
 x=this.a
 if(x.b){this.c.In(x.a)
-return}try{x=H.DU()
+return}try{x=H.Wp()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
@@ -6542,7 +6597,7 @@
 "^":"a;",
 $isyX:true},
 u2:{
-"^":"ezY;",
+"^":"aN;",
 k0:function(a,b,c,d){return this.BT.MI(a,b,c,d)},
 giO:function(a){return(H.eQ(this.BT)^892482866)>>>0},
 n:function(a,b){if(b==null)return!1
@@ -6553,30 +6608,30 @@
 Bx:{
 "^":"KA;BT<",
 cZ:function(){return this.gBT().rR(this)},
-jy:[function(){this.gBT().Pm(this)},"$0","gb9",0,0,17],
-ie:[function(){this.gBT().Bu(this)},"$0","gxl",0,0,17]},
+jy:[function(){this.gBT().EB(this)},"$0","gb9",0,0,17],
+ie:[function(){this.gBT().Mt(this)},"$0","gxl",0,0,17]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;dB,Tv<,EU,t9<,YM,Qe,fk",
+"^":"a;dB,Tv<,EU,t9<,YM,Qe,LT",
 fm:function(a,b){if(b==null)b=P.bx()
 this.Tv=P.VH(b,this.t9)},
 Fv:[function(a,b){var z=this.YM
 if((z&8)!==0)return
 this.YM=(z+128|4)>>>0
 if(b!=null)b.wM(this.gDQ(this))
-if(z<128&&this.fk!=null)this.fk.IO()
-if((z&4)===0&&(this.YM&32)===0)this.Ge(this.gb9())},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
+if(z<128&&this.LT!=null)this.LT.b7()
+if((z&4)===0&&(this.YM&32)===0)this.uz(this.gb9())},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
 QE:[function(a){var z=this.YM
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.YM=z
-if(z<128){if((z&64)!==0){z=this.fk
+if(z<128){if((z&64)!==0){z=this.LT
 z=!z.gl0(z)}else z=!1
-if(z)this.fk.t2(this)
+if(z)this.LT.t2(this)
 else{z=(this.YM&4294967291)>>>0
 this.YM=z
-if((z&32)===0)this.Ge(this.gxl())}}}},"$0","gDQ",0,0,17],
+if((z&32)===0)this.uz(this.gxl())}}}},"$0","gDQ",0,0,17],
 Gv:function(){var z=(this.YM&4294967279)>>>0
 this.YM=z
 if((z&8)!==0)return this.Qe
@@ -6585,39 +6640,39 @@
 gUF:function(){return this.YM>=128},
 WN:function(){var z=(this.YM|8)>>>0
 this.YM=z
-if((z&64)!==0)this.fk.IO()
-if((this.YM&32)===0)this.fk=null
+if((z&64)!==0)this.LT.b7()
+if((this.YM&32)===0)this.LT=null
 this.Qe=this.cZ()},
 Rg:function(a,b){var z=this.YM
 if((z&8)!==0)return
 if(z<32)this.MW(b)
-else this.C2(H.VM(new P.fZ(b,null),[null]))},
+else this.C2(H.VM(new P.LV(b,null),[null]))},
 MR:function(a,b){var z=this.YM
 if((z&8)!==0)return
 if(z<32)this.y7(a,b)
 else this.C2(new P.Dn(a,b,null))},
-AN:function(){var z=this.YM
+EC:function(){var z=this.YM
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.YM=z
-if(z<32)this.PS()
+if(z<32)this.Dd()
 else this.C2(C.ZB)},
 jy:[function(){},"$0","gb9",0,0,17],
 ie:[function(){},"$0","gxl",0,0,17],
 cZ:function(){return},
 C2:function(a){var z,y
-z=this.fk
+z=this.LT
 if(z==null){z=new P.Qk(null,null,0)
-this.fk=z}z.h(0,a)
+this.LT=z}z.h(0,a)
 y=this.YM
 if((y&64)===0){y=(y|64)>>>0
 this.YM=y
-if(y<128)this.fk.t2(this)}},
+if(y<128)this.LT.t2(this)}},
 MW:function(a){var z=this.YM
 this.YM=(z|32)>>>0
 this.t9.m1(this.dB,a)
 this.YM=(this.YM&4294967263)>>>0
-this.Iy((z&4)!==0)},
+this.QV((z&4)!==0)},
 y7:function(a,b){var z,y
 z=this.YM
 y=new P.x1(this,a,b)
@@ -6626,42 +6681,42 @@
 z=this.Qe
 if(!!J.x(z).$isb8)z.wM(y)
 else y.$0()}else{y.$0()
-this.Iy((z&4)!==0)}},
-PS:function(){var z,y
-z=new P.qB(this)
+this.QV((z&4)!==0)}},
+Dd:function(){var z,y
+z=new P.yP(this)
 this.WN()
 this.YM=(this.YM|16)>>>0
 y=this.Qe
 if(!!J.x(y).$isb8)y.wM(z)
 else z.$0()},
-Ge:function(a){var z=this.YM
+uz:function(a){var z=this.YM
 this.YM=(z|32)>>>0
 a.$0()
 this.YM=(this.YM&4294967263)>>>0
-this.Iy((z&4)!==0)},
-Iy:function(a){var z,y
-if((this.YM&64)!==0){z=this.fk
+this.QV((z&4)!==0)},
+QV:function(a){var z,y
+if((this.YM&64)!==0){z=this.LT
 z=z.gl0(z)}else z=!1
 if(z){z=(this.YM&4294967231)>>>0
 this.YM=z
-if((z&4)!==0)if(z<128){z=this.fk
+if((z&4)!==0)if(z<128){z=this.LT
 z=z==null||z.gl0(z)}else z=!1
 else z=!1
 if(z)this.YM=(this.YM&4294967291)>>>0}for(;!0;a=y){z=this.YM
-if((z&8)!==0){this.fk=null
+if((z&8)!==0){this.LT=null
 return}y=(z&4)!==0
 if(a===y)break
 this.YM=(z^32)>>>0
 if(y)this.jy()
 else this.ie()
 this.YM=(this.YM&4294967263)>>>0}z=this.YM
-if((z&64)!==0&&z<128)this.fk.t2(this)},
+if((z&64)!==0&&z<128)this.LT.t2(this)},
 Cy:function(a,b,c,d,e){var z=this.t9
 this.dB=z.cR(a)
 this.fm(0,b)
-this.EU=z.Al(c==null?P.v3():c)},
+this.EU=z.Al(c==null?P.No():c)},
 $isyX:true,
-static:{"^":"Xx,kMJ,Q9e,Ir9,nav,lkp,JAK,N3S,bsZ",MG:function(a,b,c,d,e){var z,y
+static:{"^":"Xx,kMJ,Q9e,Ir9,nav,Dr,JAK,N3S,bsZ",T6:function(a,b,c,d,e){var z,y
 z=$.X3
 y=d?1:0
 y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
@@ -6684,7 +6739,7 @@
 else w.m1(u,v)
 z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-qB:{
+yP:{
 "^":"TpZ:17;a",
 $0:[function(){var z,y
 z=this.a
@@ -6694,15 +6749,15 @@
 z.t9.ww(z.EU)
 z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-ezY:{
-"^":"wS;",
+aN:{
+"^":"cb;",
 KR:function(a,b,c,d){return this.k0(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-k0:function(a,b,c,d){return P.MG(a,b,c,d,H.u3(this,0))}},
+k0:function(a,b,c,d){return P.T6(a,b,c,d,H.u3(this,0))}},
 fIm:{
 "^":"a;aw@"},
-fZ:{
+LV:{
 "^":"fIm;P>,aw",
 dP:function(a){a.MW(this.P)}},
 Dn:{
@@ -6710,7 +6765,7 @@
 dP:function(a){a.y7(this.kc,this.I4)}},
 yRf:{
 "^":"a;",
-dP:function(a){a.PS()},
+dP:function(a){a.Dd()},
 gaw:function(){return},
 saw:function(a){throw H.b(P.w("No events after a done."))}},
 B3P:{
@@ -6718,17 +6773,17 @@
 t2:function(a){var z=this.YM
 if(z===1)return
 if(z>=1){this.YM=1
-return}P.rb(new P.CR(this,a))
+return}P.rb(new P.lg(this,a))
 this.YM=1},
-IO:function(){if(this.YM===1)this.YM=3}},
-CR:{
+b7:function(){if(this.YM===1)this.YM=3}},
+lg:{
 "^":"TpZ:76;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.YM
 z.YM=0
 if(y===3)return
-z.vG(this.b)},"$0",null,0,0,null,"call"],
+z.Ge(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Qk:{
 "^":"B3P;zR,N6,YM",
@@ -6737,7 +6792,7 @@
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
 this.N6=b}},
-vG:function(a){var z,y
+Ge:function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
@@ -6750,25 +6805,24 @@
 "^":"a;t9<,YM,EU",
 gUF:function(){return this.YM>=4},
 q1:function(){if((this.YM&2)!==0)return
-this.t9.wr(this.gKS())
+this.t9.wr(this.gpx())
 this.YM=(this.YM|2)>>>0},
 fm:function(a,b){},
 Fv:[function(a,b){this.YM+=4
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
 QE:[function(a){var z=this.YM
 if(z>=4){z-=4
 this.YM=z
 if(z<4&&(z&1)===0)this.q1()}},"$0","gDQ",0,0,17],
 Gv:function(){return},
-PS:[function(){var z=(this.YM&4294967293)>>>0
+Dd:[function(){var z=(this.YM&4294967293)>>>0
 this.YM=z
 if(z>=4)return
 this.YM=(z|1)>>>0
-z=this.EU
-if(z!=null)this.t9.ww(z)},"$0","gKS",0,0,17],
+this.t9.ww(this.EU)},"$0","gpx",0,0,17],
 $isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
-dR:{
+ap:{
 "^":"TpZ:76;a,b,c",
 $0:[function(){return this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -6776,12 +6830,12 @@
 "^":"TpZ:138;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
-QX:{
+Ry:{
 "^":"TpZ:76;a,b",
 $0:[function(){return this.a.In(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
-"^":"wS;",
+"^":"cb;",
 KR:function(a,b,c,d){var z,y,x,w
 b=!0===b
 z=H.W8(this,"og",0)
@@ -6795,29 +6849,29 @@
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 FC:function(a,b){b.Rg(0,a)},
-$aswS:function(a,b){return[b]}},
+$ascb:function(a,b){return[b]}},
 fB:{
-"^":"KA;m7,lI,dB,Tv,EU,t9,YM,Qe,fk",
+"^":"KA;HQ,lI,dB,Tv,EU,t9,YM,Qe,LT",
 Rg:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
 MR:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.MR.call(this,a,b)},
 jy:[function(){var z=this.lI
 if(z==null)return
-z.WJ(0)},"$0","gb9",0,0,17],
+z.zd(0)},"$0","gb9",0,0,17],
 ie:[function(){var z=this.lI
 if(z==null)return
 z.QE(0)},"$0","gxl",0,0,17],
 cZ:function(){var z=this.lI
 if(z!=null){this.lI=null
 z.Gv()}return},
-Iu:[function(a){this.m7.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},124],
-SW:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,139,23,24],
-oZ:[function(){this.AN()},"$0","gos",0,0,17],
+Iu:[function(a){this.HQ.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},124],
+wK:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,139,23,24],
+oZ:[function(){this.EC()},"$0","gos",0,0,17],
 JC:function(a,b,c,d,e,f,g){var z,y
 z=this.gwU()
 y=this.gPr()
-this.lI=this.m7.Sb.zC(z,this.gos(),y)},
+this.lI=this.HQ.Sb.zC(z,this.gos(),y)},
 $asKA:function(a,b){return[b]},
 $asyX:function(a,b){return[b]}},
 fk:{
@@ -6831,7 +6885,7 @@
 b.MR(y,x)
 return}if(z===!0)J.wx(b,a)},
 $asog:function(a){return[a,a]},
-$aswS:null},
+$ascb:null},
 c9:{
 "^":"og;xj,Sb",
 Eh:function(a){return this.xj.$1(a)},
@@ -6842,11 +6896,11 @@
 x=new H.oP(w,null)
 b.MR(y,x)
 return}J.wx(b,z)}},
-AE:{
+Bgk:{
 "^":"og;yj,Sb",
-bZ:function(a){return this.yj.$1(a)},
+hq:function(a){return this.yj.$1(a)},
 FC:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.bZ(a));w.G();){z=w.gl()
+try{for(w=J.mY(this.hq(a));w.G();){z=w.gl()
 J.wx(b,z)}}catch(v){w=H.Ru(v)
 y=w
 x=new H.oP(v,null)
@@ -6856,28 +6910,28 @@
 FC:function(a,b){var z=this.Km
 if(z>0){this.Km=z-1
 return}b.Rg(0,a)},
-mh:function(a,b,c){if(b<0)throw H.b(P.u(b))},
+qI:function(a,b,c){if(b<0)throw H.b(P.u(b))},
 $asog:function(a){return[a,a]},
-$aswS:null},
+$ascb:null},
 kWp:{
 "^":"a;"},
-Uf:{
+Ls:{
 "^":"a;M5,ig>"},
 n7:{
 "^":"a;"},
 yQ:{
-"^":"a;lR,cP,U1,jH,Ka,Xp,fbF,rb,Zqn,ib,JS,nw",
+"^":"a;lR,cP,Jl,jH,Ka,Xp,o2,yS,Zqn,ib,JS,nw",
 hk:function(a,b){return this.lR.$2(a,b)},
 Gr:function(a){return this.cP.$1(a)},
-FI:function(a,b){return this.U1.$2(a,b)},
+FI:function(a,b){return this.Jl.$2(a,b)},
 mg:function(a,b,c){return this.jH.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
 cR:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fbF.$1(a)},
-wr:function(a){return this.rb.$1(a)},
-RK:function(a,b){return this.rb.$2(a,b)},
+O8:function(a){return this.o2.$1(a)},
+wr:function(a){return this.yS.$1(a)},
+RK:function(a,b){return this.yS.$2(a,b)},
 uN:function(a,b){return this.Zqn.$2(a,b)},
-Ud:function(a,b){return this.ib.$2(a,b)},
+lB:function(a,b){return this.ib.$2(a,b)},
 Ch:function(a,b){return this.JS.$1(b)},
 iT:function(a){return this.nw.$1$specification(a)},
 $isyQ:true},
@@ -6895,8 +6949,8 @@
 "^":"a;",
 fC:function(a){return this.gF7()===a.gF7()},
 $ism0:true},
-l7:{
-"^":"m0;JY<,vr<,HG<,Tr<,kX<,c5<,Of<,x6<,Jy<,kP<,uI<,pB<,ye,eT>,Se<",
+FQ:{
+"^":"m0;JY<,W7<,HG<,O5<,kX<,c5<,Of<,x6<,Jy<,kP<,Gt<,pB<,ye,eT>,Se<",
 gyL:function(){var z=this.ye
 if(z!=null)return z
 z=new P.Id(this)
@@ -6926,12 +6980,12 @@
 else return new P.Yn(this,z)},
 ce:function(a){return this.xi(a,!0)},
 rO:function(a,b){var z=this.cR(a)
-if(b)return new P.eP(this,z)
-else return new P.aQ(this,z)},
+if(b)return new P.CN(this,z)
+else return new P.eP(this,z)},
 mS:function(a){return this.rO(a,!0)},
 PT:function(a,b){var z=this.O8(a)
 if(b)return new P.N9(this,z)
-else return new P.ap(this,z)},
+else return new P.aR(this,z)},
 t:function(a,b){var z,y,x,w
 z=this.Se
 y=z.t(0,b)
@@ -6946,13 +7000,13 @@
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
 c6:function(a,b){var z,y,x
-z=this.uI
+z=this.Gt
 y=z.M5
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
 iT:function(a){return this.c6(a,null)},
 Gr:function(a){var z,y,x
-z=this.vr
+z=this.W7
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,a)},
@@ -6967,7 +7021,7 @@
 x=P.Cw(y)
 return z.ig.$6(y,x,this,a,b,c)},
 Al:function(a){var z,y,x
-z=this.Tr
+z=this.O5
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,a)},
@@ -6991,7 +7045,7 @@
 y=z.M5
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
-Ud:function(a,b){var z,y,x
+lB:function(a,b){var z,y,x
 z=this.Jy
 y=z.M5
 x=P.Cw(y)
@@ -7001,20 +7055,20 @@
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,b)},
-bC:function(a,b,c){var z
-this.vr=this.eT.gvr()
+Ij:function(a,b,c){var z
+this.W7=this.eT.gW7()
 this.JY=this.eT.gJY()
 this.HG=this.eT.gHG()
 z=b.Ka
-this.Tr=z!=null?new P.Uf(this,z):this.eT.gTr()
+this.O5=z!=null?new P.Ls(this,z):this.eT.gO5()
 z=b.Xp
-this.kX=z!=null?new P.Uf(this,z):this.eT.gkX()
+this.kX=z!=null?new P.Ls(this,z):this.eT.gkX()
 this.c5=this.eT.gc5()
 this.Of=this.eT.gOf()
 this.x6=this.eT.gx6()
 this.Jy=this.eT.gJy()
 this.kP=this.eT.gkP()
-this.uI=this.eT.guI()
+this.Gt=this.eT.gGt()
 this.pB=this.eT.gpB()}},
 OJ:{
 "^":"TpZ:76;a,b",
@@ -7024,11 +7078,11 @@
 "^":"TpZ:76;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-eP:{
+CN:{
 "^":"TpZ:12;a,b",
 $1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
-aQ:{
+eP:{
 "^":"TpZ:12;c,d",
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
@@ -7036,7 +7090,7 @@
 "^":"TpZ:81;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
-ap:{
+aR:{
 "^":"TpZ:81;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
@@ -7046,20 +7100,20 @@
 $isEH:true},
 R81:{
 "^":"m0;",
-gvr:function(){return C.lk},
+gW7:function(){return C.lk},
 gJY:function(){return C.Yl},
 gHG:function(){return C.Gu},
-gTr:function(){return C.pj},
-gkX:function(){return C.F6},
+gO5:function(){return C.pj},
+gkX:function(){return C.pm},
 gc5:function(){return C.Xk},
 gOf:function(){return C.Zc},
 gx6:function(){return C.Sq},
-gJy:function(){return C.NA},
+gJy:function(){return C.rj},
 gkP:function(){return C.uo},
-guI:function(){return C.mc},
+gGt:function(){return C.mc},
 gpB:function(){return C.Rt},
 geT:function(a){return},
-gSe:function(){return $.OL()},
+gSe:function(){return $.wb()},
 gyL:function(){var z=$.Cb
 if(z!=null)return z
 z=new P.Id(this)
@@ -7093,11 +7147,11 @@
 rO:function(a,b){if(b)return new P.pQ(this,a)
 else return new P.Ky(this,a)},
 mS:function(a){return this.rO(a,!0)},
-PT:function(a,b){if(b)return new P.Ze(this,a)
-else return new P.dM(this,a)},
+PT:function(a,b){if(b)return new P.SJ(this,a)
+else return new P.Ze(this,a)},
 t:function(a,b){return},
 hk:function(a,b){return P.CK(null,null,this,a,b)},
-c6:function(a,b){return P.E1(null,null,this,a,b)},
+c6:function(a,b){return P.qc(null,null,this,a,b)},
 iT:function(a){return this.c6(a,null)},
 Gr:function(a){if($.X3===C.NU)return a.$0()
 return P.Ki(null,null,this,a)},
@@ -7110,8 +7164,8 @@
 O8:function(a){return a},
 wr:function(a){P.ZK(null,null,this,a)},
 uN:function(a,b){return P.YF(a,b)},
-Ud:function(a,b){return P.dp(a,b)},
-Ch:function(a,b){H.Af(b)},
+lB:function(a,b){return P.dp(a,b)},
+Ch:function(a,b){H.qw(b)},
 static:{"^":"ln,Cb"}},
 hj:{
 "^":"TpZ:76;a,b",
@@ -7129,25 +7183,25 @@
 "^":"TpZ:12;c,d",
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
-Ze:{
+SJ:{
 "^":"TpZ:81;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
-dM:{
+Ze:{
 "^":"TpZ:81;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true}}],["","",,P,{
 "^":"",
 EF:function(a,b,c){return H.dJ(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-TQ:[function(a,b){return J.xC(a,b)},"$2","fc",4,0,48,49,50],
+Ou4:[function(a,b){return J.xC(a,b)},"$2","bUo",4,0,48,49,50],
 T9:[function(a){return J.v1(a)},"$1","py",2,0,51,49],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
 return z}b=P.py()
 return P.uP(a,b,c,d,e)},
-Rd:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
+l1:function(a,b,c,d){return H.VM(new P.Rr(0,null,null,null,null),[d])},
 B4:function(a,b,c){var z,y
 if(P.nH(a)){if(b==="("&&c===")")return"(...)"
 return b+"..."+c}z=[]
@@ -7157,7 +7211,8 @@
 y.pop()}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
-return y.IN},
+y=y.IN
+return y.charCodeAt(0)==0?y:y},
 WE:function(a,b,c){var z,y
 if(P.nH(a))return b+"..."+c
 z=P.p9(b)
@@ -7165,7 +7220,8 @@
 y.push(a)
 try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
 y.pop()}z.KF(c)
-return z.gIN()},
+y=z.gIN()
+return y.charCodeAt(0)==0?y:y},
 nH:function(a){var z,y
 for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
 return!1},
@@ -7202,9 +7258,13 @@
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
 b.push(v)},
-L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
-Ls:function(a,b,c,d){return H.VM(new P.D0(0,null,null,null,null,null,0),[d])},
-Vi:function(a,b,c){var z,y,x,w,v
+L5:function(a,b,c,d,e){var z=new P.YB(0,null,null,null,null,null,0)
+z.$builtinTypeInfo=[d,e]
+return z},
+fM:function(a,b,c,d){var z=new P.D0(0,null,null,null,null,null,0)
+z.$builtinTypeInfo=[d]
+return z},
+fd:function(a,b,c){var z,y,x,w,v
 z=[]
 y=J.U6(a)
 x=y.gB(a)
@@ -7222,7 +7282,8 @@
 J.Me(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.Ex()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gIN()},
+z.pop()}z=y.gIN()
+return z.charCodeAt(0)==0?z:z},
 bA:{
 "^":"a;X5,Mb,cG,Cs,MV",
 gB:function(a){return this.X5},
@@ -7237,7 +7298,7 @@
 KY:function(a){var z=this.Cs
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
-FV:function(a,b){J.Me(b,new P.ef(this))},
+FV:function(a,b){J.Me(b,new P.DJ(this))},
 t:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)y=null
@@ -7268,6 +7329,11 @@
 if(w>=0)x[w+1]=b
 else{x.push(a,b);++this.X5
 this.MV=null}}},
+to:function(a,b,c){var z
+if(this.NZ(0,b))return this.t(0,b)
+z=c.$0()
+this.u(0,b,z)
+return z},
 Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
 else return this.qg(b)},
@@ -7333,7 +7399,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
-ef:{
+DJ:{
 "^":"TpZ;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
@@ -7557,12 +7623,12 @@
 return!1}else{this.fD=z.gv8(z)
 this.Qx=this.Qx.gtL()
 return!0}}}},
-jg:{
+Rr:{
 "^":"u3T;X5,Mb,cG,Cs,vw",
-iL:function(){var z=new P.jg(0,null,null,null,null)
+iL:function(){var z=new P.Rr(0,null,null,null,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=new P.cN(this,this.ij(),0,null)
+gA:function(a){var z=new P.cN(this,this.Ed(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return this.X5},
@@ -7579,8 +7645,8 @@
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-return this.GP(a)},
-GP:function(a){var z,y,x
+return this.Ix(a)},
+Ix:function(a){var z,y,x
 z=this.Cs
 if(z==null)return
 y=z[this.rk(a)]
@@ -7601,7 +7667,7 @@
 x=y}return this.bQ(x,b)}else return this.B7(0,b)},
 B7:function(a,b){var z,y,x
 z=this.Cs
-if(z==null){z=P.yT()
+if(z==null){z=P.Ym()
 this.Cs=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[b]
@@ -7628,7 +7694,7 @@
 this.cG=null
 this.Mb=null
 this.X5=0}},
-ij:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+Ed:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.vw
 if(z!=null)return z
 y=Array(this.X5)
@@ -7660,11 +7726,11 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
-$isOl:true,
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{yT:function(){var z=Object.create(null)
+static:{Ym:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
@@ -7704,21 +7770,21 @@
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-else return this.GP(a)},
-GP:function(a){var z,y,x
+else return this.Ix(a)},
+Ix:function(a){var z,y,x
 z=this.Cs
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
-return J.Nq(J.UQ(y,x))},
+return J.JU(J.UQ(y,x))},
 aN:function(a,b){var z,y
 z=this.HH
 y=this.HU
 for(;z!=null;){b.$1(z.gGc(z))
 if(y!==this.HU)throw H.b(P.a4(this))
 z=z.gtL()}},
-gqG:function(a){var z=this.HH
+gtH:function(a){var z=this.HH
 if(z==null)throw H.b(P.w("No elements"))
 return z.gGc(z)},
 grZ:function(a){var z=this.Nz
@@ -7802,9 +7868,9 @@
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
+for(y=0;y<z;++y)if(J.xC(J.JU(a[y]),b))return y
 return-1},
-$isOl:true,
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -7824,7 +7890,7 @@
 return!1}else{this.fD=z.gGc(z)
 this.Qx=this.Qx.gtL()
 return!0}}}},
-Yp:{
+Ui:{
 "^":"w2Y;G4",
 gB:function(a){return this.G4.length},
 t:function(a,b){var z=this.G4
@@ -7832,14 +7898,14 @@
 return z[b]}},
 u3T:{
 "^":"Vj5;",
-zH:function(a){var z=this.iL()
+Oe:function(a){var z=this.iL()
 z.FV(0,this)
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
+ez:[function(a,b){return H.K1(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
 ad:function(a,b){return H.VM(new H.U5(this,b),[H.W8(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
+yx:[function(a,b){return H.VM(new H.Fm(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -7853,13 +7919,14 @@
 y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.IN+=x}}return y.IN},
+y.IN+=x}}x=y.IN
+return x.charCodeAt(0)==0?x:x},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
 tt:function(a,b){return P.F(this,b,H.W8(this,"mW",0))},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.W8(this,"mW",0))
+Oe:function(a){var z=P.fM(null,null,null,H.W8(this,"mW",0))
 z.FV(0,this)
 return z},
 gB:function(a){var z,y
@@ -7868,13 +7935,13 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:function(a,b){return H.ke(this,b,H.W8(this,"mW",0))},
-gqG:function(a){var z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
+eR:function(a,b){return H.p6(this,b,H.W8(this,"mW",0))},
+gtH:function(a){var z=this.gA(this)
+if(!z.G())throw H.b(H.Wp())
 return z.gl()},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
+if(!z.G())throw H.b(H.Wp())
 do y=z.gl()
 while(z.G())
 return y},
@@ -7888,8 +7955,8 @@
 $isQV:true,
 $asQV:null},
 ark:{
-"^":"eD;"},
-eD:{
+"^":"E9h;"},
+E9h:{
 "^":"a+lD;",
 $isWO:true,
 $asWO:null,
@@ -7906,7 +7973,7 @@
 if(z!==this.gB(a))throw H.b(P.a4(a))}},
 gl0:function(a){return this.gB(a)===0},
 gor:function(a){return!this.gl0(a)},
-gqG:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
+gtH:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,0)},
 grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,this.gB(a)-1)},
@@ -7918,14 +7985,15 @@
 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
+zV:function(a,b){var z,y
 if(this.gB(a)===0)return""
 z=P.p9("")
 z.We(a,b)
-return z.IN},
+y=z.IN
+return y.charCodeAt(0)==0?y:y},
 ad:function(a,b){return H.VM(new H.U5(a,b),[H.W8(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
+yx:[function(a,b){return H.VM(new H.Fm(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.W8(a,"lD",0)])
@@ -7935,15 +8003,15 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y
-z=P.Ls(null,null,null,H.W8(a,"lD",0))
+Oe:function(a){var z,y
+z=P.fM(null,null,null,H.W8(a,"lD",0))
 for(y=0;y<this.gB(a);++y)z.h(0,this.t(a,y))
 return z},
 h:function(a,b){var z=this.gB(a)
 this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.Ff
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.lo
 x=this.gB(a)
 this.sB(a,x+1)
 this.u(a,x,y)}},
@@ -7951,7 +8019,7 @@
 for(z=0;z<this.gB(a);++z)if(J.xC(this.t(a,z),b)){this.YW(a,z,this.gB(a)-1,a,z+1)
 this.sB(a,this.gB(a)-1)
 return!0}return!1},
-uk:function(a,b){P.Vi(a,b,!1)},
+uk:function(a,b){P.fd(a,b,!1)},
 V1:function(a){this.sB(a,0)},
 GT:function(a,b){if(b==null)b=P.n4()
 H.ZE(a,0,this.gB(a)-1,b)},
@@ -7999,7 +8067,7 @@
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
+aP: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)
@@ -8039,11 +8107,11 @@
 gB:function(a){return J.q8(this.gvc(this))},
 gl0:function(a){return J.FN(this.gvc(this))},
 gor:function(a){return J.pO(this.gvc(this))},
-gUQ:function(a){return H.VM(new P.wU(this),[H.W8(this,"Yk",1)])},
+gUQ:function(a){return H.VM(new P.NV(this),[H.W8(this,"Yk",1)])},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isT8:true,
 $asT8:null},
-wU:{
+NV:{
 "^":"mW;ZD",
 gB:function(a){var z=this.ZD
 return J.q8(z.gvc(z))},
@@ -8051,10 +8119,10 @@
 return J.FN(z.gvc(z))},
 gor:function(a){var z=this.ZD
 return J.pO(z.gvc(z))},
-gqG:function(a){var z=this.ZD
-return z.t(0,J.bT(z.gvc(z)))},
+gtH:function(a){var z=this.ZD
+return z.t(0,J.Es(z.gvc(z)))},
 grZ:function(a){var z=this.ZD
-return z.t(0,J.MQ(z.gvc(z)))},
+return z.t(0,J.OH(z.gvc(z)))},
 gA:function(a){var z=this.ZD
 z=new P.Uq(J.mY(z.gvc(z)),z,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -8108,9 +8176,9 @@
 z.KF(": ")
 z.KF(b)},"$2",null,4,0,null,141,66,"call"],
 $isEH:true},
-nd:{
+Fw:{
 "^":"mW;E3,QN,Bq,Z1",
-gA:function(a){var z=new P.fO(this,this.Bq,this.Z1,this.QN,null)
+gA:function(a){var z=new P.KG(this,this.Bq,this.Z1,this.QN,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
@@ -8121,16 +8189,16 @@
 if(z!==this.Z1)H.vh(P.a4(this))}},
 gl0:function(a){return this.QN===this.Bq},
 gB:function(a){return(this.Bq-this.QN&this.E3.length-1)>>>0},
-gqG:function(a){var z,y
+gtH:function(a){var z,y
 z=this.QN
-if(z===this.Bq)throw H.b(H.DU())
+if(z===this.Bq)throw H.b(H.Wp())
 y=this.E3
 if(z>=y.length)return H.e(y,z)
 return y[z]},
 grZ:function(a){var z,y,x
 z=this.QN
 y=this.Bq
-if(z===y)throw H.b(H.DU())
+if(z===y)throw H.b(H.Wp())
 z=this.E3
 x=z.length
 y=(y-1&x-1)>>>0
@@ -8150,7 +8218,7 @@
 x=y+z
 w=this.E3
 v=w.length
-if(x>=v){u=P.ra(x)
+if(x>=v){u=P.uay(x)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
@@ -8192,7 +8260,7 @@
 bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 AR:function(){var z,y,x,w
 z=this.QN
-if(z===this.Bq)throw H.b(H.DU());++this.Z1
+if(z===this.Bq)throw H.b(H.Wp());++this.Z1
 y=this.E3
 x=y.length
 if(z>=x)return H.e(y,z)
@@ -8263,12 +8331,14 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"TNe",ra:function(a){var z
+static:{"^":"TNe",NZ2:function(a,b){var z=H.VM(new P.Fw(null,0,0,0),[b])
+z.Eo(a,b)
+return z},uay:function(a){var z
 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}}}},
-fO:{
+KG:{
 "^":"a;dk,pP,Z1,Dc,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
@@ -8290,7 +8360,7 @@
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.Ff)},
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.lo)},
 uk:function(a,b){var z,y,x
 z=[]
 for(y=this.gA(this);y.G();){x=y.gl()
@@ -8304,12 +8374,12 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"UyD",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
 bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
+yx:[function(a,b){return H.VM(new H.Fm(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 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
@@ -8320,21 +8390,22 @@
 y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.IN+=x}}return y.IN},
+y.IN+=x}}x=y.IN
+return x.charCodeAt(0)==0?x:x},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
-eR:function(a,b){return H.ke(this,b,H.u3(this,0))},
-gqG:function(a){var z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
+eR:function(a,b){return H.p6(this,b,H.u3(this,0))},
+gtH:function(a){var z=this.gA(this)
+if(!z.G())throw H.b(H.Wp())
 return z.gl()},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
+if(!z.G())throw H.b(H.Wp())
 do y=z.gl()
 while(z.G())
 return y},
-$isOl:true,
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -8346,7 +8417,7 @@
 jp:{
 "^":"oz;P*,nl,Bb,T8",
 $asoz:function(a,b){return[a]}},
-vX1:{
+Xt:{
 "^":"a;",
 oB:function(a){var z,y,x,w,v,u,t,s
 z=this.VR
@@ -8406,7 +8477,7 @@
 a.Bb=y.Bb
 y.Bb=null}this.VR=a}},
 Ba:{
-"^":"vX1;V2s,z4,VR,fu,hm,Z1,wq",
+"^":"Xt;V2s,z4,VR,fu,hm,Z1,wq",
 L4:function(a,b){return this.V2s.$2(a,b)},
 Bc:function(a){return this.z4.$1(a)},
 R2:function(a,b){return this.L4(a,b)},
@@ -8424,13 +8495,13 @@
 z=this.oB(b)
 if(J.xC(z,0)){this.VR.P=c
 return}this.Oa(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
-FV:function(a,b){H.bQ(b,new P.QG(this))},
+FV:function(a,b){H.bQ(b,new P.pn(this))},
 gl0:function(a){return this.VR==null},
 gor:function(a){return this.VR!=null},
 aN:function(a,b){var z,y,x
 z=H.u3(this,0)
 y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.Z1,this.wq,null),[z])
-y.Dd(this,[P.oz,z])
+y.ls(this,[P.oz,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
 b.$2(z.gnl(x),z.gP(x))}},
@@ -8444,7 +8515,7 @@
 return z},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isBa:true,
-$asvX1:function(a,b){return[a]},
+$asXt:function(a,b){return[a]},
 $asT8:null,
 $isT8:true,
 static:{GV:function(a,b,c,d){var z,y
@@ -8456,7 +8527,7 @@
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
-QG:{
+pn:{
 "^":"TpZ;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
@@ -8470,7 +8541,7 @@
 for(z=this.x5;a!=null;){z.push(a)
 a=a.Bb}},
 G:function(){var z,y,x
-z=this.OC
+z=this.xp
 if(this.Z1!==z.Z1)throw H.b(P.a4(z))
 y=this.x5
 if(y.length===0){this.Ju=null
@@ -8483,16 +8554,16 @@
 this.Ju=z
 this.Zq(z.T8)
 return!0},
-Dd:function(a,b){this.Zq(a.VR)}},
+ls:function(a,b){this.Zq(a.VR)}},
 nF:{
-"^":"mW;OC",
-gB:function(a){return this.OC.hm},
-gl0:function(a){return this.OC.hm===0},
+"^":"mW;xp",
+gB:function(a){return this.xp.hm},
+gl0:function(a){return this.xp.hm===0},
 gA:function(a){var z,y
-z=this.OC
+z=this.xp
 y=new P.DN(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Dd(z,H.u3(this,0))
+y.ls(z,H.u3(this,0))
 return y},
 $isyN:true},
 JO:{
@@ -8503,20 +8574,20 @@
 z=this.ZD
 y=new P.ZM(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Dd(z,H.u3(this,1))
+y.ls(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
+"^":"S6B;xp,x5,Z1,wq,Ju",
 Gf:function(a){return a.nl}},
 ZM:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
+"^":"S6B;xp,x5,Z1,wq,Ju",
 Gf:function(a){return a.P},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
+"^":"S6B;xp,x5,Z1,wq,Ju",
 Gf:function(a){return a},
 $asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
 "^":"",
@@ -8533,7 +8604,7 @@
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
+throw H.b(P.rr(String(y),null,null))}if(b==null)return P.KH(z)
 else return P.VQ(z,b)},
 tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
@@ -8571,16 +8642,16 @@
 gvc:function(a){var z
 if(this.LK==null){z=this.Mq
 return z.gvc(z)}z=this.oD()
-return H.c1(z,0,null,H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0))},
+return H.c1(z,0,null,H.u3(H.VM(new H.TNQ(),[H.u3(z,0)]),0))},
 gUQ:function(a){var z
 if(this.LK==null){z=this.Mq
-return z.gUQ(z)}return H.K1(this.oD(),new P.A5(this),null,null)},
+return z.gUQ(z)}return H.K1(this.oD(),new P.Ni(this),null,null)},
 u:function(a,b,c){var z,y
 if(this.LK==null)this.Mq.u(0,b,c)
 else if(this.NZ(0,b)){z=this.LK
 z[b]=c
 y=this.PF
-if(y==null?z!=null:y!==z)y[b]=null}else this.tZ().u(0,b,c)},
+if(y==null?z!=null:y!==z)y[b]=null}else this.XK().u(0,b,c)},
 FV:function(a,b){H.bQ(b,new P.E5(this))},
 NZ:function(a,b){if(this.LK==null)return this.Mq.NZ(0,b)
 if(typeof b!=="string")return!1
@@ -8591,11 +8662,11 @@
 this.u(0,b,z)
 return z},
 Rz:function(a,b){if(this.LK!=null&&!this.NZ(0,b))return
-return this.tZ().Rz(0,b)},
+return this.XK().Rz(0,b)},
 V1:function(a){var z
 if(this.LK==null)this.Mq.V1(0)
 else{z=this.Mq
-if(z!=null)J.Z8(z)
+if(z!=null)J.U2(z)
 this.LK=null
 this.PF=null
 this.Mq=P.Fl(null,null)}},
@@ -8611,7 +8682,7 @@
 oD:function(){var z=this.Mq
 if(z==null){z=Object.keys(this.PF)
 this.Mq=z}return z},
-tZ:function(){var z,y,x,w,v
+XK:function(){var z,y,x,w,v
 if(this.LK==null)return this.Mq
 z=P.Fl(null,null)
 y=this.oD()
@@ -8630,7 +8701,7 @@
 $asFo:function(){return[null,null]},
 $isT8:true,
 $asT8:function(){return[null,null]}},
-A5:{
+Ni:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
@@ -8638,41 +8709,41 @@
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
-Uk:{
+Ukr:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Uk;",
-$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Ukr;",
+$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
 Ud:{
 "^":"XS;Ct,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
 else return"Converting object did not return an encodable object."},"$0","gCR",0,0,73],
-static:{NM:function(a,b){return new P.Ud(a,b)}}},
+static:{Gy:function(a,b){return new P.Ud(a,b)}}},
 K8:{
 "^":"Ud;Ct,FN",
 bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gCR",0,0,73],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Uk;Fs<,Ha",
-cW:function(a,b){return P.jc(a,this.gP1().Fs)},
-iQ:function(a){return this.cW(a,null)},
-N7:function(a,b){var z=this.gZE()
+"^":"Ukr;J2<,xq",
+cW:function(a,b){return P.jc(a,this.gJh().J2)},
+kV:function(a){return this.cW(a,null)},
+Co:function(a,b){var z=this.gZE()
 return P.Vg(a,z.Wl,z.UM)},
-KP:function(a){return this.N7(a,null)},
-gZE:function(){return C.cb},
-gP1:function(){return C.A3},
-$asUk:function(){return[P.a,P.qU]}},
+KP:function(a){return this.Co(a,null)},
+gZE:function(){return C.Sr},
+gJh:function(){return C.A3},
+$asUkr:function(){return[P.a,P.qU]}},
 ojF:{
 "^":"wIe;UM,Wl",
 $aswIe:function(){return[P.a,P.qU]}},
-c5:{
-"^":"wIe;Fs<",
+Mx:{
+"^":"wIe;J2<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;Ha,qR,SK",
-HT:function(a){return this.Ha.$1(a)},
+"^":"a;xq,qR,SK",
+HT:function(a){return this.xq.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
@@ -8726,15 +8797,15 @@
 rl:function(a){var z,y,x,w
 if(!this.Jc(a)){this.WD(a)
 try{z=this.HT(a)
-if(!this.Jc(z)){x=P.NM(a,null)
+if(!this.Jc(z)){x=P.Gy(a,null)
 throw H.b(x)}x=this.SK
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.NM(a,y))}}},
+throw H.b(P.Gy(a,y))}}},
 Jc:function(a){var z,y,x,w
 z={}
-if(typeof a==="number"){if(!C.CD.gzr(a))return!1
+if(typeof a==="number"){if(!C.CD.gx8(a))return!1
 this.qR.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.qR.KF("true")
 return!0}else if(a===!1){this.qR.KF("false")
@@ -8762,11 +8833,12 @@
 E5:function(a){var z=this.SK
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,No,HVe,Wk,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"Gsm,hyY,IE,Jyf,fc,HVe,Wk,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z,y
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).rl(a)
-return z.IN}}},
+y=z.IN
+return y.charCodeAt(0)==0?y:y}}},
 tF:{
 "^":"TpZ:82;a,b",
 $2:[function(a,b){var z,y,x
@@ -8780,21 +8852,19 @@
 z.rl(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
 u5F:{
-"^":"Ziv;QA",
+"^":"Ziv;ns",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
+gZE:function(){return new P.E3()}},
+E3:{
 "^":"wIe;",
-Sw:function(a){var z,y,x
+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])
+if(typeof y!=="number"||Math.floor(y)!==y)H.vh(P.u("Invalid length "+H.d(y)))
+y=new Uint8Array(y)
 x=new P.Rw(0,0,y)
 if(x.Gx(a,0,z.gB(a))!==z.gB(a))x.O6(z.j(a,J.bI(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.o9)},
+return C.Jm.aM(y,0,x.o9)},
 $aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
 Rw:{
 "^":"a;UfS,o9,Zj",
@@ -8866,18 +8936,19 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;QA",
-Sw:function(a){var z,y
+"^":"wIe;ns",
+WJ:function(a){var z,y,x
 z=P.p9("")
-y=new P.Dd(this.QA,z,!0,0,0,0)
+y=new P.Dd(this.ns,z,!0,0,0,0)
 y.ME(a,0,J.q8(a))
 y.fZ()
-return z.IN},
+x=z.IN
+return x.charCodeAt(0)==0?x:x},
 $aswIe:function(){return[[P.WO,P.KN],P.qU]}},
 Dd:{
-"^":"a;QA,C4,YN,Dp,rw,pt",
+"^":"a;ns,C4,YN,Dp,rw,pt",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.rw>0){if(this.QA!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence",null,null))
+fZ:function(){if(this.rw>0){if(!this.ns)throw H.b(P.rr("Unfinished UTF-8 octet sequence",null,null))
 this.C4.KF(H.mx(65533))
 this.Dp=0
 this.rw=0
@@ -8891,10 +8962,10 @@
 this.pt=0
 w=new P.wh(c)
 v=new P.yn(this,a,b,c)
-$loop$0:for(u=this.C4,t=this.QA!==!0,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
+$loop$0:for(u=this.C4,t=!this.ns,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+if(p.i(q,192)!==128){if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.YN=!1
 p=H.mx(65533)
 u.IN+=p
@@ -8902,10 +8973,10 @@
 break $multibyte$2}else{z=(z<<6|p.i(q,63))>>>0;--y;++r}}while(y>0)
 p=x-1
 if(p<0||p>=4)return H.e(C.Gb,p)
-if(z<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
+if(z<=C.Gb[p]){if(t)throw H.b(P.rr("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
 z=65533
 y=0
-x=0}if(z>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
+x=0}if(z>1114111){if(t)throw H.b(P.rr("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
 z=65533}if(!this.YN||z!==65279){p=H.mx(z)
 u.IN+=p}this.YN=!1}}for(;r<c;r=n){o=w.$2(a,r)
 if(J.xZ(o,0)){this.YN=!1
@@ -8916,7 +8987,7 @@
 r=n}n=r+1
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.C(q,0)){if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
+if(p.C(q,0)){if(t)throw H.b(P.rr("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
 p=H.mx(65533)
 u.IN+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
 y=1
@@ -8927,7 +8998,7 @@
 continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){z=p.i(q,7)
 y=3
 x=3
-continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+continue $loop$0}if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.YN=!1
 p=H.mx(65533)
 u.IN+=p
@@ -8950,8 +9021,8 @@
 z=a===0&&b===J.q8(this.c)
 y=this.b
 x=this.c
-if(z)y.C4.KF(P.HM(x))
-else y.C4.KF(P.HM(J.Fd(x,a,b)))},
+if(z)y.C4.KF(P.nB(x))
+else y.C4.KF(P.nB(J.Fd(x,a,b)))},
 $isEH:true}}],["","",,P,{
 "^":"",
 Te:function(a){return},
@@ -8960,7 +9031,7 @@
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
 z.IN="\""
-for(y=a.length,x=0,w="\"";x<y;++x){v=C.xB.j(a,x)
+for(y=a.length,x=0,w="\"";x<y;++x){v=C.yo.j(a,x)
 if(v<=31)if(v===10)w=z.IN+="\\n"
 else if(v===13)w=z.IN+="\\r"
 else if(v===9)w=z.IN+="\\t"
@@ -8973,7 +9044,7 @@
 else{w=H.mx(v)
 w=z.IN+=w}}y=w+"\""
 z.IN=y
-return y}return"Instance of '"+H.lh(a)+"'"},
+return y.charCodeAt(0)==0?y:y}return"Instance of '"+H.lh(a)+"'"},
 eG:function(a){return new P.HG(a)},
 kC:[function(a,b){return a==null?b==null:a===b},"$2","XK",4,0,54],
 xvm:[function(a){return H.CU(a)},"$1","mbf",2,0,55],
@@ -8986,9 +9057,9 @@
 FL:function(a){var z,y
 z=H.d(a)
 y=$.oK
-if(y==null)H.Af(z)
+if(y==null)H.qw(z)
 else y.$1(z)},
-HM:function(a){return H.eT(a.constructor!==Array?P.F(a,!0,null):a)},
+nB:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a.gOB(a),b)},
@@ -9026,14 +9097,14 @@
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
 else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,73],
 h:function(a,b){return P.Wu(J.WB(this.rq,b.gVs()),this.aL)},
-gGt:function(){return H.KL(this)},
-gS6:function(){return H.ch(this)},
-gBM:function(){return H.Sw(this)},
+gX3:function(){return H.KL(this)},
+gcO:function(){return H.ch(this)},
+gIv:function(){return H.Sw(this)},
 EK:function(){H.o2(this)},
 RM:function(a,b){if(J.xZ(J.yH(a),8640000000000000))throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,Vp,Eu,p2W,oXf,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,ek0,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
+static:{"^":"bS,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,bmS,o4I,T3F,ek0,yfk,lme",Gl:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.Vq("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.ci()
 x=z.pX
 if(1>=x.length)return H.e(x,1)
@@ -9049,7 +9120,7 @@
 if(6>=x.length)return H.e(x,6)
 r=y.$1(x[6])
 if(7>=x.length)return H.e(x,7)
-q=J.Dv(J.vX(new P.Rq().$1(x[7]),1000))
+q=J.NQ(J.vX(new P.Rq().$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
 o=x.length
@@ -9066,8 +9137,8 @@
 if(typeof l!=="number")return H.s(l)
 s=J.bI(s,n*l)}k=!0}else k=!1
 j=H.fu(w,v,u,t,s,r,q,k)
-if(j==null)throw H.b(P.cD("Time out of range",a,null))
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
+if(j==null)throw H.b(P.rr("Time out of range",a,null))
+return P.Wu(p?j+1:j,k)}else throw H.b(P.rr("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -9089,9 +9160,9 @@
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
-Vf:{
-"^":"lf;",
-$isVf:true},
+CP:{
+"^":"FK;",
+$isCP:true},
 "+double":0,
 a6:{
 "^":"a;m5<",
@@ -9123,7 +9194,7 @@
 Vy:function(a){return P.ii(0,0,Math.abs(this.m5),0,0,0)},
 J:function(a){return P.ii(0,0,-this.m5,0,0,0)},
 $isa6:true,
-static:{"^":"Bp7,zi,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,Wr,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
 "^":"TpZ:14;",
 $1:function(a){if(a>=100000)return H.d(a)
@@ -9169,7 +9240,7 @@
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
 v.IN+=typeof u==="string"?u:H.d(u)}this.ae.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.IN+"]"},"$0","gCR",0,0,73],
+return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+H.d(z.a)+"]"},"$0","gCR",0,0,73],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
@@ -9252,8 +9323,8 @@
 m=""
 l=""}k=z.Nj(w,n,o)
 if(typeof n!=="number")return H.s(n)
-return y+m+k+l+"\n"+C.xB.U(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,73],
-static:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
+return y+m+k+l+"\n"+C.yo.U(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,73],
+static:{rr:function(a,b,c){return new P.oe(a,b,c)}}},
 eV:{
 "^":"a;",
 bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,73],
@@ -9261,13 +9332,13 @@
 qo:{
 "^":"a;oc>",
 bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gCR",0,0,73],
-t:function(a,b){var z=H.vA(b,"expando$values")
-return z==null?null:H.vA(z,this.V2())},
-u:function(a,b,c){var z=H.vA(b,"expando$values")
+t:function(a,b){var z=H.of(b,"expando$values")
+return z==null?null:H.of(z,this.V2())},
+u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
 H.wV(b,"expando$values",z)}H.wV(z,this.V2(),c)},
 V2:function(){var z,y
-z=H.vA(this,"expando$key")
+z=H.of(this,"expando$key")
 if(z==null){y=$.Km
 $.Km=y+1
 z="expando$key$"+y
@@ -9277,7 +9348,7 @@
 "^":"a;",
 $isEH:true},
 KN:{
-"^":"lf;",
+"^":"FK;",
 $isKN:true},
 "+int":0,
 QV:{
@@ -9302,9 +9373,9 @@
 "^":"a;",
 bu:[function(a){return"null"},"$0","gCR",0,0,73]},
 "+Null":0,
-lf:{
+FK:{
 "^":"a;",
-$islf:true},
+$isFK:true},
 "+num":0,
 a:{
 "^":";",
@@ -9317,15 +9388,15 @@
 Od:{
 "^":"a;",
 $isOd:true},
-Ol:{
+z5:{
 "^":"mW;",
-$isOl:true,
+$isz5:true,
 $isyN:true},
 BpP:{
 "^":"a;"},
 VV:{
 "^":"a;n2,Mw",
-D5:function(a){var z,y
+wE:function(a){var z,y
 z=this.n2==null
 if(!z&&this.Mw==null)return
 y=$.hG
@@ -9347,17 +9418,17 @@
 "^":"a;",
 $isqU:true},
 "+String":0,
-ysG:{
-"^":"a;Y4,R0,So,ft",
+Kg:{
+"^":"a;Y4,R7,So,ft",
 gl:function(){return this.ft},
 G:function(){var z,y,x,w,v,u
 z=this.So
-this.R0=z
+this.R7=z
 y=this.Y4
 x=J.U6(y)
 if(z===x.gB(y)){this.ft=null
-return!1}w=x.j(y,this.R0)
-v=this.R0+1
+return!1}w=x.j(y,this.R7)
+v=this.R7+1
 if((w&64512)===55296&&v<x.gB(y)){u=x.j(y,v)
 if((u&64512)===56320){this.So=v+1
 this.ft=65536+((w&1023)<<10>>>0)+(u&1023)
@@ -9379,7 +9450,8 @@
 y=z.gl()
 this.IN+=typeof y==="string"?y:H.d(y)}}},
 V1:function(a){this.IN=""},
-bu:[function(a){return this.IN},"$0","gCR",0,0,73],
+bu:[function(a){var z=this.IN
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73],
 PD:function(a){if(typeof a==="string")this.IN=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
@@ -9392,23 +9464,27 @@
 "^":"a;",
 $isLz:true},
 q5:{
-"^":"a;Kk,QB,Ee,Fi,ku,xu,ys,o6,nO",
-gJf:function(a){var z=this.Kk
+"^":"a;Kk,Ni,Ee,Fi,ku,xu,ys,o6,nO",
+gJf:function(a){var z,y
+z=this.Kk
 if(z==null)return""
-if(J.Qe(z).nC(z,"["))return C.xB.Nj(z,1,z.length-1)
+y=J.Qe(z)
+if(y.nC(z,"["))return y.Nj(z,1,J.bI(y.gB(z),1))
 return z},
-gtp:function(a){var z=this.QB
-if(z==null)return P.Co(this.Fi)
+gtp:function(a){var z=this.Ni
+if(z==null)return P.SN(this.Fi)
 return z},
 gIi:function(a){return this.Ee},
-pi:function(a,b){if(a==="")return"/"+b
-return C.xB.Nj(a,0,C.xB.cn(a,"/")+1)+b},
-jI:function(a){if(a.length>0&&C.xB.j(a,0)===58)return!0
-return C.xB.OY(a,"/.")!==-1},
-jn:function(a){var z,y,x,w,v
+Bs:function(a,b){var z=J.x(a)
+if(z.n(a,""))return"/"+H.d(b)
+return z.Nj(a,0,z.cn(a,"/")+1)+H.d(b)},
+jI:function(a){var z=J.U6(a)
+if(J.xZ(z.gB(a),0)&&z.j(a,0)===58)return!0
+return z.OY(a,"/.")!==-1},
+mE:function(a){var z,y,x,w,v
 if(!this.jI(a))return a
 z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.Ff
+for(y=J.BQ(a,"/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.lo
 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
@@ -9424,38 +9500,38 @@
 if(""!==y){z.KF(y)
 z.KF(":")}x=this.Kk
 w=x==null
-if(!w||C.xB.nC(this.Ee,"//")||y==="file"){z.KF("//")
+if(!w||J.co(this.Ee,"//")||y==="file"){z.KF("//")
 y=this.ku
-if(C.xB.gor(y)){z.KF(y)
+if(J.pO(y)){z.KF(y)
 z.KF("@")}if(!w)z.KF(x)
-y=this.QB
+y=this.Ni
 if(y!=null){z.KF(":")
 z.KF(y)}}z.KF(this.Ee)
 y=this.xu
 if(y!=null){z.KF("?")
 z.KF(y)}y=this.ys
 if(y!=null){z.KF("#")
-z.KF(y)}return z.IN},"$0","gCR",0,0,73],
+z.KF(y)}y=z.IN
+return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isq5)return!1
-if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(this.ku===b.ku){y=this.gJf(this)
-x=z.gJf(b)
-if(y==null?x==null:y===x){y=this.gtp(this)
+if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(J.xC(this.ku,b.ku))if(J.xC(this.gJf(this),z.gJf(b))){y=this.gtp(this)
 z=z.gtp(b)
-if(y==null?z==null:y===z)if(this.Ee===b.Ee){z=this.xu
+if(y==null?z==null:y===z)if(J.xC(this.Ee,b.Ee)){z=this.xu
 y=z==null
 x=b.xu
 w=x==null
 if(!y===!w){if(y)z=""
-if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.ys
+if(J.xC(z,w?"":x)){z=this.ys
 y=z==null
 x=b.ys
 w=x==null
 if(!y===!w){if(y)z=""
-z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
-else z=!1}else z=!1}else z=!1
+z=J.xC(z,w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
+else z=!1}else z=!1
+else z=!1
 else z=!1
 else z=!1
 return z},
@@ -9468,7 +9544,7 @@
 v=this.ys
 return z.$2(this.Fi,z.$2(this.ku,z.$2(y,z.$2(x,z.$2(this.Ee,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,zk,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",Co:function(a){if(a==="http")return 80
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,xF,SpW,GPf,JA7,iTk,Uo0,wo,SQU,rvM,fbQ",SN:function(a){if(a==="http")return 80
 if(a==="https")return 443
 return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z={}
@@ -9489,7 +9565,7 @@
 x=0
 break}if(u===47){x=v===0?2:1
 y=0
-break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
+break}if(u===58){if(v===0)P.Xz(a,0,"Invalid empty scheme")
 z.a=P.iy(a,v);++v
 if(v===w){z.f=-1
 x=0}else{if(v>=w)H.vh(P.N(v))
@@ -9502,7 +9578,7 @@
 if(x===2){t=v+1
 z.e=t
 if(t===w){z.f=-1
-x=0}else{u=C.xB.j(a,t)
+x=0}else{u=C.yo.j(a,t)
 z.f=u
 if(u===47){++z.e
 new P.BH(z,a,-1).$0()
@@ -9514,73 +9590,69 @@
 if(u===63||u===35)break
 z.f=-1}s=z.a
 r=z.c
-q=P.qd(a,y,z.e,null,r!=null,s==="file")
+q=P.re(a,y,z.e,null,r!=null,s==="file")
 s=z.f
-if(s===63){p=C.xB.XU(a,"#",z.e+1)
+if(s===63){p=C.yo.XU(a,"#",z.e+1)
 s=z.e+1
 if(p<0){o=P.AN(a,s,w,null)
 n=null}else{o=P.AN(a,s,p,null)
-n=P.jr(a,p+1,w)}}else{n=s===35?P.jr(a,z.e+1,w):null
+n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
 o=null}w=z.a
 s=z.b
-return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.Co(b))return
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},Xz:function(a,b,c){throw H.b(P.rr(c,a,b))},Ec:function(a,b){if(a!=null&&a===P.SN(b))return
 return a},L7:function(a,b,c,d){var z,y
 if(a==null)return
 if(b===c)return""
-if(C.xB.j(a,b)===91){z=c-1
-if(C.xB.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
+if(C.yo.j(a,b)===91){z=c-1
+if(C.yo.j(a,z)!==93)P.Xz(a,b,"Missing end `]` to match `[` in host")
 P.eg(a,b+1,z)
-return C.xB.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
+return C.yo.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
 if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a,b,c)
-return"["+a+"]"}}return P.cq(a,b,c)},cq:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
-for(z=b,y=z,x=null,w=!0;z<c;){a.toString
-if(z<0)H.vh(P.N(z))
-v=a.length
-if(z>=v)H.vh(P.N(z))
-u=a.charCodeAt(z)
-if(u===37){t=P.Yi(a,z,!0)
-v=t==null
-if(v&&w){z+=3
-continue}if(x==null){x=new P.Rn("")
-x.IN=""}s=C.xB.Nj(a,y,z)
-if(!w)s=s.toLowerCase()
-x.toString
-x.IN=x.IN+s
-if(v){t=C.xB.Nj(a,z,z+3)
-r=3}else if(t==="%"){t="%25"
-r=1}else r=3
-x.IN+=t
-z+=r
-y=z
-w=!0}else{if(u<127){q=u>>>4
-if(q>=8)return H.e(C.aa,q)
-q=(C.aa[q]&C.jn.iK(1,u&15))!==0}else q=!1
-if(q){if(w&&65<=u&&90>=u){if(x==null){x=new P.Rn("")
-x.IN=""}if(y<z){v=C.xB.Nj(a,y,z)
-x.toString
-x.IN=x.IN+v
-y=z}w=!1}++z}else{if(u<=93){q=u>>>4
-if(q>=8)return H.e(C.rz,q)
-q=(C.rz[q]&C.jn.iK(1,u&15))!==0}else q=!1
-if(q)P.iV(a,z,"Invalid character")
-else{if((u&64512)===55296&&z+1<c){q=z+1
-if(q<0)H.vh(P.N(q))
-if(q>=v)H.vh(P.N(q))
-p=a.charCodeAt(q)
+return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+for(z=a.length,y=b,x=y,w=null,v=!0;y<c;){if(y<0)H.vh(P.N(y))
+if(y>=z)H.vh(P.N(y))
+u=a.charCodeAt(y)
+if(u===37){t=P.Yi(a,y,!0)
+s=t==null
+if(s&&v){y+=3
+continue}if(w==null){w=new P.Rn("")
+w.IN=""}r=C.yo.Nj(a,x,y)
+if(!v)r=r.toLowerCase()
+w.IN=w.IN+r
+if(s){t=C.yo.Nj(a,y,y+3)
+q=3}else if(t==="%"){t="%25"
+q=1}else q=3
+w.IN+=t
+y+=q
+x=y
+v=!0}else{if(u<127){s=u>>>4
+if(s>=8)return H.e(C.aa,s)
+s=(C.aa[s]&C.jn.iK(1,u&15))!==0}else s=!1
+if(s){if(v&&65<=u&&90>=u){if(w==null){w=new P.Rn("")
+w.IN=""}if(x<y){s=C.yo.Nj(a,x,y)
+w.IN=w.IN+s
+x=y}v=!1}++y}else{if(u<=93){s=u>>>4
+if(s>=8)return H.e(C.rz,s)
+s=(C.rz[s]&C.jn.iK(1,u&15))!==0}else s=!1
+if(s)P.Xz(a,y,"Invalid character")
+else{if((u&64512)===55296&&y+1<c){s=y+1
+if(s<0)H.vh(P.N(s))
+if(s>=z)H.vh(P.N(s))
+p=a.charCodeAt(s)
 if((p&64512)===56320){u=(65536|(u&1023)<<10|p&1023)>>>0
-r=2}else r=1}else r=1
-if(x==null){x=new P.Rn("")
-x.IN=""}s=C.xB.Nj(a,y,z)
-if(!w)s=s.toLowerCase()
-x.toString
-x.IN=x.IN+s
-v=P.mC(u)
-x.IN+=v
-z+=r
-y=z}}}}if(x==null)return J.Nj(a,b,c)
-if(y<c){s=J.Nj(a,y,c)
-x.KF(!w?s.toLowerCase():s)}return x.bu(0)},iy:function(a,b){var z,y,x,w,v,u,t,s
+q=2}else q=1}else q=1
+if(w==null){w=new P.Rn("")
+w.IN=""}r=C.yo.Nj(a,x,y)
+if(!v)r=r.toLowerCase()
+w.IN=w.IN+r
+s=P.xo(u)
+w.IN+=s
+y+=q
+x=y}}}}if(w==null)return C.yo.Nj(a,b,c)
+if(x<c){r=C.yo.Nj(a,x,c)
+w.KF(!v?r.toLowerCase():r)}z=w.IN
+return z.charCodeAt(0)==0?z:z},iy:function(a,b){var z,y,x,w,v,u,t,s
 if(b===0)return""
 a.toString
 z=a.length
@@ -9589,21 +9661,22 @@
 x=y>=97
 if(!(x&&y<=122))w=y>=65&&y<=90
 else w=!0
-if(!w)P.iV(a,0,"Scheme not starting with alphabetic character")
+if(!w)P.Xz(a,0,"Scheme not starting with alphabetic character")
 for(w=97<=y,v=122>=y,u=0;u<b;++u){if(u>=z)H.vh(P.N(u))
 t=a.charCodeAt(u)
 if(t<128){s=t>>>4
-if(s>=8)return H.e(C.qq,s)
-s=(C.qq[s]&C.jn.iK(1,t&15))!==0}else s=!1
-if(!s)P.iV(a,u,"Illegal scheme character")
+if(s>=8)return H.e(C.mKy,s)
+s=(C.mKy[s]&C.jn.iK(1,t&15))!==0}else s=!1
+if(!s)P.Xz(a,u,"Illegal scheme character")
 if(w&&v)x=!1}a=J.Nj(a,0,b)
 return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
-return P.Xc(a,b,c,C.jx)},qd:function(a,b,c,d,e,f){var z,y
+return P.Xc(a,b,c,C.jx)},re:function(a,b,c,d,e,f){var z,y
 z=a==null
 if(z&&!0)return f?"/":""
 z=!z
-if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.UU()).zV(0,"/")
-if(C.xB.gl0(y)){if(f)return"/"}else if((f||e)&&C.xB.j(y,0)!==47)return"/"+y
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.bP.ez(d,new P.Kd()).zV(0,"/")
+z=J.U6(y)
+if(z.gl0(y)===!0){if(f)return"/"}else if((f||e)&&z.j(y,0)!==47)return"/"+H.d(y)
 return y},AN:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
@@ -9612,8 +9685,9 @@
 if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.jN.aN(d,new P.Sz(z,x))
-return x.IN},jr:function(a,b,c){if(a==null)return
+C.bP.aN(d,new P.Ue(z,x))
+z=x.IN
+return z.charCodeAt(0)==0?z:z},o6:function(a,b,c){if(a==null)return
 return P.Xc(a,b,c,C.o5)},qr:function(a){if(57>=a)return 48<=a
 a|=32
 return 97<=a&&102>=a},RD:function(a){if(57>=a)return a-48
@@ -9622,7 +9696,6 @@
 y=a.length
 if(z>=y)return"%"
 x=b+1
-a.toString
 if(x<0)H.vh(P.N(x))
 if(x>=y)H.vh(P.N(x))
 w=a.charCodeAt(x)
@@ -9634,8 +9707,8 @@
 if(z>=8)return H.e(C.B2,z)
 z=(C.B2[z]&C.jn.iK(1,u&15))!==0}else z=!1
 if(z)return H.mx(c&&65<=u&&90>=u?(u|32)>>>0:u)
-if(w>=97||v>=97)return J.Nj(a,b,b+3).toUpperCase()
-return},mC:function(a){var z,y,x,w,v,u,t,s
+if(w>=97||v>=97)return C.yo.Nj(a,b,b+3).toUpperCase()
+return},xo:function(a){var z,y,x,w,v,u,t,s
 if(a<128){z=Array(3)
 z.fixed$length=init
 z[0]=37
@@ -9661,46 +9734,44 @@
 t="0123456789ABCDEF".charCodeAt(u&15)
 if(s>=y)return H.e(z,s)
 z[s]=t
-v+=3}}return H.eT(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-for(z=b,y=z,x=null;z<c;){a.toString
-if(z<0)H.vh(P.N(z))
-w=a.length
-if(z>=w)H.vh(P.N(z))
-v=a.charCodeAt(z)
+v+=3}}return H.LY(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+for(z=a.length,y=b,x=y,w=null;y<c;){if(y<0)H.vh(P.N(y))
+if(y>=z)H.vh(P.N(y))
+v=a.charCodeAt(y)
 if(v<127){u=v>>>4
 if(u>=8)return H.e(d,u)
 u=(d[u]&C.jn.iK(1,v&15))!==0}else u=!1
-if(u)++z
-else{if(v===37){t=P.Yi(a,z,!1)
-if(t==null){z+=3
+if(u)++y
+else{if(v===37){t=P.Yi(a,y,!1)
+if(t==null){y+=3
 continue}if("%"===t){t="%25"
 s=1}else s=3}else{if(v<=93){u=v>>>4
 if(u>=8)return H.e(C.rz,u)
 u=(C.rz[u]&C.jn.iK(1,v&15))!==0}else u=!1
-if(u){P.iV(a,z,"Invalid character")
+if(u){P.Xz(a,y,"Invalid character")
 t=null
-s=null}else{if((v&64512)===55296){u=z+1
+s=null}else{if((v&64512)===55296){u=y+1
 if(u<c){if(u<0)H.vh(P.N(u))
-if(u>=w)H.vh(P.N(u))
+if(u>=z)H.vh(P.N(u))
 r=a.charCodeAt(u)
 if((r&64512)===56320){v=(65536|(v&1023)<<10|r&1023)>>>0
 s=2}else s=1}else s=1}else s=1
-t=P.mC(v)}}if(x==null){x=new P.Rn("")
-x.IN=""}w=C.xB.Nj(a,y,z)
-x.toString
-x.IN=x.IN+w
-x.IN+=typeof t==="string"?t:H.d(t)
+t=P.xo(v)}}if(w==null){w=new P.Rn("")
+w.IN=""}u=C.yo.Nj(a,x,y)
+w.IN=w.IN+u
+w.IN+=typeof t==="string"?t:H.d(t)
 if(typeof s!=="number")return H.s(s)
-z+=s
-y=z}}if(x==null)return J.Nj(a,b,c)
-if(y<c)x.KF(J.Nj(a,y,c))
-return x.bu(0)},Ms:function(a,b){return H.n3(J.BQ(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
+y+=s
+x=y}}if(w==null)return C.yo.Nj(a,b,c)
+if(x<c)w.KF(C.yo.Nj(a,x,c))
+z=w.IN
+return z.charCodeAt(0)==0?z:z},WX:function(a,b){return H.n3(J.BQ(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
 z=new P.JV()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
 return H.VM(new H.A8(y,new P.to(z)),[null,null]).br(0)},eg:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 if(c==null)c=J.q8(a)
-z=new P.x8(a)
+z=new P.kZ(a)
 y=new P.ZN(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
@@ -9711,34 +9782,32 @@
 if(typeof s!=="number")return H.s(s)
 if(!(u<s))break
 s=a
-s.toString
 if(u<0)H.vh(P.N(u))
 r=J.q8(s)
 if(typeof r!=="number")return H.s(r)
 if(u>=r)H.vh(P.N(u))
 if(s.charCodeAt(u)===58){if(u===b){++u
 s=a
-s.toString
 if(u<0)H.vh(P.N(u))
 if(u>=J.q8(s))H.vh(P.N(u))
 if(s.charCodeAt(u)!==58)z.$2("invalid start colon.",u)
 w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",u)
-J.bi(x,-1)
-t=!0}else J.bi(x,y.$2(w,u))
+J.dH(x,-1)
+t=!0}else J.dH(x,y.$2(w,u))
 w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
 q=J.xC(w,c)
-p=J.xC(J.MQ(x),-1)
+p=J.xC(J.OH(x),-1)
 if(q&&!p)z.$2("expected a part after last `:`",c)
-if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
+if(!q)try{J.dH(x,y.$2(w,c))}catch(o){H.Ru(o)
 try{v=P.Dy(J.Nj(a,w,c))
-s=J.Eh(J.UQ(v,0),8)
+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.Eh(J.UQ(v,2),8)
+J.dH(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)
+J.dH(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.$2("invalid end of IPv6 address.",w)}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 n=Array(16)
 n.$builtinTypeInfo=[P.KN]
@@ -9762,20 +9831,20 @@
 s=s.i(l,255)
 if(r>=16)return H.e(n,r)
 n[r]=s
-m+=2}++u}return n},jW:function(a,b,c,d){var z,y,x,w,v,u,t
+m+=2}++u}return n},Mp:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
-x=c.gZE().Sw(b)
-for(w=0;w<x.length;++w){v=x[w]
-u=J.Wx(v)
-if(u.C(v,128)){t=u.m(v,4)
+x=c.gZE().WJ(b)
+for(w=x.length,v=0;v<w;++v){u=x[v]
+if(u<128){t=u>>>4
 if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.iK(1,u.i(v,15)))!==0}else t=!1
-if(t){u=H.mx(v)
-y.IN+=u}else if(d&&u.n(v,32)){u=H.mx(43)
-y.IN+=u}else{u=H.mx(37)
-y.IN+=u
-z.$2(v,y)}}return y.IN},tN:function(a,b){var z,y,x,w
+t=(a[t]&C.jn.iK(1,u&15))!==0}else t=!1
+if(t){t=H.mx(u)
+y.IN+=t}else if(d&&u===32){t=H.mx(43)
+y.IN+=t}else{t=H.mx(37)
+y.IN+=t
+z.$2(u,y)}}z=y.IN
+return z.charCodeAt(0)==0?z:z},tN:function(a,b){var z,y,x,w
 for(z=J.Qe(a),y=0,x=0;x<2;++x){w=z.j(a,b+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
@@ -9802,8 +9871,8 @@
 if(x+3>w)throw H.b(P.u("Truncated URI"))
 u.push(P.tN(a,x+1))
 x+=2}else if(c&&v===43)u.push(32)
-else u.push(v);++x}}t=b.QA
-return new P.GY(t).Sw(u)}}},
+else u.push(v);++x}}t=b.ns
+return new P.GY(t).WJ(u)}}},
 hP2:{
 "^":"TpZ:147;",
 $1:function(a){a.C(0,128)
@@ -9825,7 +9894,7 @@
 if(r===47||r===63||r===35)break
 if(r===64){t=z.e
 u=-1}else if(r===58)u=z.e
-else if(r===91){q=C.xB.XU(x,"]",z.e+1)
+else if(r===91){q=C.yo.XU(x,"]",z.e+1)
 if(q===-1){z.e=w
 z.f=v
 u=-1
@@ -9836,45 +9905,47 @@
 y=t+1}if(u>=0){o=u+1
 if(o<z.e)for(n=0;o<z.e;++o){if(o>=w)H.vh(P.N(o))
 m=x.charCodeAt(o)
-if(48>m||57<m)P.iV(x,o,"Invalid port number")
+if(48>m||57<m)P.Xz(x,o,"Invalid port number")
 n=n*10+(m-48)}else n=null
-z.d=P.JF(n,z.a)
+z.d=P.Ec(n,z.a)
 p=u}z.c=P.L7(x,y,p,!0)
 s=z.e
-if(s<w)z.f=C.xB.j(x,s)},
+if(s<w)z.f=C.yo.j(x,s)},
 $isEH:true},
-UU:{
+Kd:{
 "^":"TpZ:12;",
-$1:function(a){return P.jW(C.yk,a,C.xM,!1)},
+$1:function(a){return P.Mp(C.jr,a,C.xM,!1)},
 $isEH:true},
-Sz:{
+Ue:{
 "^":"TpZ:81;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
 z=this.b
-z.KF(P.jW(C.B2,a,C.xM,!0))
+z.KF(P.Mp(C.B2,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.B2,b,C.xM,!0))},
+z.KF(P.Mp(C.B2,b,C.xM,!0))},
 $isEH:true},
 XZ:{
 "^":"TpZ:148;",
-$2:function(a,b){return b*31+J.v1(a)&1073741823},
+$2:function(a,b){var z=J.v1(a)
+if(typeof z!=="number")return H.s(z)
+return b*31+z&1073741823},
 $isEH:true},
 qz:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
 y=z.OY(b,"=")
-if(y===-1){if(!z.n(b,""))J.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
+if(y===-1){if(!z.n(b,""))J.qQ(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
 z=this.a
-J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
+J.qQ(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
 $isEH:true},
 JV:{
 "^":"TpZ:44;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
+$1:function(a){throw H.b(P.rr("Illegal IPv4 address, "+a,null,null))},
 $isEH:true},
 to:{
 "^":"TpZ:12;a",
@@ -9884,16 +9955,16 @@
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
 return z},"$1",null,2,0,null,149,"call"],
 $isEH:true},
-x8:{
+kZ:{
 "^":"TpZ:150;a",
-$2:function(a,b){throw H.b(P.cD("Illegal IPv6 address, "+a,this.a,b))},
+$2:function(a,b){throw H.b(P.rr("Illegal IPv6 address, "+a,this.a,b))},
 $1:function(a){return this.$2(a,null)},
 $isEH:true},
 ZN:{
 "^":"TpZ:100;b,c",
 $2:function(a,b){var z,y
 if(b-a>4)this.c.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
-z=H.BU(J.Nj(this.b,a,b),16,null)
+z=H.BU(C.yo.Nj(this.b,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.c.$2("each part must be in the range of `0x0..0xFFFF`",a)
 return z},
@@ -9901,8 +9972,8 @@
 rI:{
 "^":"TpZ:81;",
 $2:function(a,b){var z=J.Wx(a)
-b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
+b.KF(H.mx(C.yo.j("0123456789ABCDEF",z.m(a,4))))
+b.KF(H.mx(C.yo.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["","",,W,{
 "^":"",
 Q8:function(a,b,c,d){var z,y,x
@@ -9912,25 +9983,25 @@
 if(typeof y!=="string"){y=d
 y=typeof y==="number"}else y=!0}else y=!0
 else y=!0
-if(y)try{d=P.pf(d)
+if(y)try{d=P.jl(d)
 J.z7Y(z,a,b,c,d)}catch(x){H.Ru(x)
 J.z7Y(z,a,b,c,null)}else J.z7Y(z,a,b,c,null)
 return z},
 r3:function(a,b){return document.createElement(a)},
-qw:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+Kz:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
 lt:function(a,b,c,d,e,f,g,h){var z,y,x
-z=W.fJ
+z=W.O7
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
 C.W3.i3(x,"GET",a,!0)
-z=H.VM(new W.RO(x,C.LF.fA,!1),[null])
+z=H.VM(new W.vG(x,"load",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new W.bU(y,x)),z.el),[H.u3(z,0)]).DN()
-z=H.VM(new W.RO(x,C.JN.fA,!1),[null])
+z=H.VM(new W.vG(x,"error",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(y.gYJ()),z.el),[H.u3(z,0)]).DN()
 x.send()
 return y.MM},
-Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Iq(a),2))},
-P0:function(a,b){var z,y
+Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(a),2))},
+D7:function(a,b){var z,y
 z=typeof a!=="string"
 if((!z||a==null)&&!0)return new WebSocket(a)
 y=H.RB(b,"$isWO",[P.qU],"$asWO")
@@ -9939,39 +10010,39 @@
 z=!z||a==null
 if(z)return new WebSocket(a,b)
 throw H.b(P.u("Incorrect number or type of arguments"))},
-VC:function(a,b){a=536870911&a+b
+Zm: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
+xj:function(a){var z
 if(a==null)return
 if("postMessage" in a){z=W.P1(a)
-if(!!J.x(z).$isPZ)return z
+if(!!J.x(z).$isFU)return z
 return}else return a},
-Pd:function(a){if(!!J.x(a).$isYN)return a
+Pd:function(a){if(!!J.x(a).$isSy)return a
 return P.o7(a,!0)},
-v8:function(a,b){return new W.uY(a,b)},
+Rl:function(a,b){return new W.uY(a,b)},
 z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
-Hx:[function(a){return J.o6(a)},"$1","oo",2,0,12,56],
-Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
-Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Dc(d)
+Hx:[function(a){return J.qq(a)},"$1","HM",2,0,12,56],
+Hw:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","NB",8,0,57,56,58,59,60],
+wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
-x=J.KE(d,"created")
+x=J.YC(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.aN(W.r3("article",null))
+J.MZ(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
 if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Rl(x,y),1))}
 t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.oo(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
+t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.NB(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
 Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
@@ -9979,44 +10050,43 @@
 if(!v)q.extends=e
 b.registerElement(c,q)},
 Yt:function(a){if(J.xC($.X3,C.NU))return a
-if(a==null)return
 return $.X3.rO(a,!0)},
-Iq:function(a){if(J.xC($.X3,C.NU))return a
+K2:function(a){if(J.xC($.X3,C.NU))return a
 return $.X3.PT(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|uV|WZq|NY|SaM|JI|Tk|pva|ZP|cda|nJ|KAf|Eg|i7|waa|Gk|V10|J3|V11|MJ|T53|DK|V12|BS|V13|Vb|V14|Ly|V15|Im|pR|V16|EZ|V17|L4|Mb|V18|mO|DE|V19|U1|V20|H8|WS|qh|V21|oF|V22|Q6|uE|V23|Zn|V24|n5|V25|Ma|wN|V26|ds|V27|qM|ZzR|av|V28|uz|V29|kK|oa|V30|St|V31|IW|V32|Qh|V33|Oz|V34|Z4|V35|qk|V36|vj|LU|V37|CX|V38|qn|V39|I2|V40|FB|V41|md|V42|Bm|V43|Ya|V44|Ww|ye|V45|G1|V46|fl|V47|UK|V48|wM|V49|NK|V50|Zx|V51|qV|V52|F1|V53|ov|V54|vr|oEY|kn|V55|fI|V56|zM|V57|Rk|V58|Ti|V59|Um|V60|VZ|V61|WG|V62|f7|ImK|CY|V63|nm|V64|Vu|V65|Pa|V66|D2|I5|V67|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|uV|WZq|NY|SaM|JI|Tk|pva|ZP|cda|nJ|KAf|Eg|i7|waa|Gk|V10|J3|V11|MJ|T53|DK|V12|BS|V13|Vb|V14|Ly|V15|Im|pR|V16|EZ|V17|L4|Mb|V18|mO|DE|V19|U1|V20|H8|WS|qh|V21|oF|V22|Q6|uE|V23|Zn|V24|n5|V25|Ma|wN|V26|ds|V27|qM|ZzR|av|V28|uz|V29|kK|oa|V30|St|V31|IW|V32|Qh|V33|Oz|V34|Z4|V35|qk|V36|vj|LU|V37|CX|V38|qn|V39|I2|V40|FB|V41|md|V42|Bm|V43|Ya|V44|Ww|ye|V45|G1|V46|fl|V47|UK|V48|wM|V49|NK|V50|Zx|V51|qV|V52|NT|V53|F1|V54|ov|V55|vr|oEY|kn|V56|fI|V57|zM|V58|Rk|V59|Ti|V60|Um|V61|VZ|V62|WG|V63|f7|Ce|ImK|CY|V64|nm|V65|Vu|V66|Pa|V67|D2|I5|V68|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.QI]},
+$asWO:function(){return[W.M5K]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[W.QI]},
+$asQV:function(){return[W.M5K]},
 "%":"EntryArray"},
 Ps:{
-"^":"Bo;N:target%,t5:type=,mH:href%,aB:protocol=",
+"^":"Bo;N:target%,t5:type=,LU:href%,A8:protocol=",
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAnchorElement"},
-fY:{
-"^":"Bo;N:target%,mH:href%,aB:protocol=",
+fYK:{
+"^":"Bo;N:target%,LU:href%,A8:protocol=",
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAreaElement"},
 rZg:{
-"^":"Bo;mH:href%,N:target%",
+"^":"Bo;LU:href%,N:target%",
 "%":"HTMLBaseElement"},
 O4:{
-"^":"Gv;yT:size=,t5:type=",
+"^":"Gv;ky:size=,t5:type=",
 $isO4:true,
 "%":";Blob"},
 QPB:{
 "^":"Bo;",
-$isPZ:true,
+$isFU:true,
 "%":"HTMLBodyElement"},
-Ox:{
+IFv:{
 "^":"Bo;oc:name%,t5:type=,P:value%",
 "%":"HTMLButtonElement"},
-Ny9:{
+Nu:{
 "^":"Bo;fg:height%,R:width}",
 gVE:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
@@ -10025,7 +10095,7 @@
 "%":";CanvasRenderingContext"},
 Gcw:{
 "^":"Y5K;",
-A8:function(a,b,c,d,e,f,g,h){var z
+kN:function(a,b,c,d,e,f,g,h){var z
 if(g!=null)z=!0
 else z=!1
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
@@ -10036,18 +10106,17 @@
 "%":"Comment;CharacterData"},
 BI:{
 "^":"ea;tT:code=",
-$isBI:true,
 "%":"CloseEvent"},
-di:{
+y4f:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-DG4:{
+Rb:{
 "^":"ea;NJ:_dartDetail}",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
 GM:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$isDG4:true,
+$isRb:true,
 "%":"CustomEvent"},
 vHT:{
 "^":"Bo;bG:options=",
@@ -10060,66 +10129,66 @@
 "^":"Bo;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDialogElement"},
-YN:{
+Sy:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
-d2:function(a,b,c){return a.importNode(b,c)},
-XT:function(a,b){return a.querySelector(b)},
-VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isYN:true,
+ek:function(a,b,c){return a.importNode(b,c)},
+Wk:function(a,b){return a.querySelector(b)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+$isSy:true,
 "%":"XMLDocument;Document"},
 hsw:{
 "^":"KV;",
-gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
+gqu:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.P0(a,new W.OB(a)),[null])
 return a._docChildren},
-VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-XT:function(a,b){return a.querySelector(b)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Wk:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
 cmJ:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
-BK:{
+Nh:{
 "^":"Gv;G1:message=",
 goc:function(a){var z=a.name
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
-$isBK:true,
+$isNh:true,
 "%":"DOMException"},
 h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,ke:nextElementSibling=",
+"^":"KV;ka:title},xr:className%,jO:id=,q5:tagName=,ke:nextElementSibling=",
 gQg:function(a){return new W.E9(a)},
-gks:function(a){return new W.VG(a,a.children)},
-VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+gqu:function(a){return new W.VG(a,a.children)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
 gD7:function(a){return P.T7(C.CD.yu(C.CD.RE(a.offsetLeft)),C.CD.yu(C.CD.RE(a.offsetTop)),C.CD.yu(C.CD.RE(a.offsetWidth)),C.CD.yu(C.CD.RE(a.offsetHeight)),null)},
 Es:function(a){},
-Lx:function(a){},
-wN:function(a,b,c,d){},
+dQ:function(a){},
+aC:function(a,b,c,d){},
 gqn:function(a){return a.localName},
 gKD:function(a){return a.namespaceURI},
 bu:[function(a){return a.localName},"$0","gCR",0,0,73],
-xZ:function(a,b){if(!!a.matches)return a.matches(b)
+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.wK(z,b))return!0
+jn:function(a,b){var z=a
+do{if(J.YN(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
-TL:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
+er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-XT:function(a,b){return a.querySelector(b)},
-gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
-gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
+Wk:function(a,b){return a.querySelector(b)},
+gVY:function(a){return H.VM(new W.eu(a,"mousedown",!1),[null])},
+gf0:function(a){return H.VM(new W.eu(a,"mousemove",!1),[null])},
 LX:function(a){},
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 "%":";Element"},
 fC:{
 "^":"Bo;fg:height%,oc:name%,t5:type=,R:width}",
@@ -10129,17 +10198,17 @@
 "%":"ErrorEvent"},
 ea:{
 "^":"Gv;dl:_selector},Ii:path=,Ea:timeStamp=,t5:type=",
-gF0:function(a){return W.qc(a.currentTarget)},
-gN:function(a){return W.qc(a.target)},
-e6:function(a){return a.preventDefault()},
+gXQ:function(a){return W.xj(a.currentTarget)},
+gN:function(a){return W.xj(a.target)},
+TI:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
-PZ:{
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
+FU:{
 "^":"Gv;",
 On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-Ph:function(a,b){return a.dispatchEvent(b)},
+jR:function(a,b){return a.dispatchEvent(b)},
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isPZ:true,
+$isFU:true,
 "%":";EventTarget"},
 Ao:{
 "^":"Bo;P9:elements=,oc:name%,t5:type=",
@@ -10148,22 +10217,22 @@
 "^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
-QU:{
+AaI:{
 "^":"cmJ;tT:code=",
 "%":"FileError"},
 H05:{
-"^":"PZ;kc:error=",
+"^":"FU;kc:error=",
 gyG:function(a){var z=a.result
-if(!!J.x(z).$isaI)return H.z4(z,0,null)
+if(!!J.x(z).$isaI)return H.GG(z,0,null)
 return z},
 "%":"FileReader"},
-jH:{
+YuD:{
 "^":"Bo;B:length=,oc:name%,N:target%",
 "%":"HTMLFormElement"},
-u9:{
+iGN:{
 "^":"Bo;ih:color%",
 "%":"HTMLHRElement"},
-us:{
+UT:{
 "^":"Gv;B:length=",
 "%":"History"},
 xnd:{
@@ -10174,7 +10243,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -10189,20 +10258,20 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 Vbi:{
-"^":"YN;",
+"^":"Sy;",
 gQr:function(a){return a.head},
-smk:function(a,b){a.title=b},
+ska:function(a,b){a.title=b},
 "%":"HTMLDocument"},
-fJ:{
+O7:{
 "^":"waV;il:responseText=,pf:status=",
 gn9:function(a){return W.Pd(a.response)},
 Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 i3:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
-$isfJ:true,
+$isO7:true,
 "%":"XMLHttpRequest"},
 waV:{
-"^":"PZ;",
+"^":"FU;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
 "^":"Bo;fg:height%,oc:name%,R:width}",
@@ -10215,54 +10284,54 @@
 "^":"Bo;fg:height%,EE:isMap=,R:width}",
 j3:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
-Mi:{
-"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,yT:size=,t5:type=,P:value%,R:width}",
+Sc:{
+"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,ky:size=,t5:type=,P:value%,R:width}",
 RR:function(a,b){return a.accept.$1(b)},
-$isMi:true,
+$isSc:true,
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 $isKV:true,
 "%":"HTMLInputElement"},
 AD:{
-"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+"^":"w6O;w4:altKey=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
 "%":"KeyboardEvent"},
 In:{
 "^":"Bo;oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wPF:{
+pL:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 Ogt:{
-"^":"Bo;mH:href%,t5:type=",
+"^":"Bo;LU:href%,t5:type=",
 "%":"HTMLLinkElement"},
 u8r:{
-"^":"Gv;mH:href=,aB:protocol=",
+"^":"Gv;LU:href=,A8:protocol=",
 VD:function(a){return a.reload()},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"Location"},
-jJ:{
+M6O:{
 "^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
 ftg:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-WJ:[function(a){return a.pause()},"$0","gX0",0,0,17],
+zd:[function(a){return a.pause()},"$0","gX0",0,0,17],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"dZ5<"}},
 mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Wyx:{
+Y7:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
-aBv:{
+wq:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
 fJn:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 D80:{
-"^":"PZ;jO:id=,ph:label=",
+"^":"FU;jO:id=,ph:label=",
 "%":"MediaStream"},
 VhH:{
 "^":"ea;vq:stream=",
@@ -10270,8 +10339,7 @@
 cxu:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-gFF:function(a){return W.qc(a.source)},
-$iscxu:true,
+gFF:function(a){return W.xj(a.source)},
 "%":"MessageEvent"},
 EeC:{
 "^":"Bo;rz:content=,oc:name%",
@@ -10279,33 +10347,28 @@
 QbE:{
 "^":"Bo;A5:max=,Bp:min=,P:value%",
 "%":"HTMLMeterElement"},
-PGY:{
-"^":"ea;",
-$isPGY:true,
-"%":"MIDIConnectionEvent"},
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bnE:{
 "^":"Imr;",
-EZ:function(a,b,c){return a.send(b,c)},
+LV:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 Imr:{
-"^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
-giG:function(a){return H.VM(new W.RO(a,C.iw.fA,!1),[null])},
+"^":"FU;jO:id=,oc:name=,t5:type=,Ye:version=",
+giG:function(a){return H.VM(new W.vG(a,"disconnect",!1),[null])},
 "%":"MIDIInput;MIDIPort"},
-AjY:{
-"^":"w6O;YK:altKey=,EV:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+v3:{
+"^":"w6O;w4:altKey=,Ay:button=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
 gD7:function(a){var z,y
 if(!!a.offsetX)return H.VM(new P.hL(a.offsetX,a.offsetY),[null])
-else{if(!J.x(W.qc(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
-z=W.qc(a.target)
-y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.nN(J.tG(z)))
+else{if(!J.x(W.xj(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
+z=W.xj(a.target)
+y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.mB(z)))
 return H.VM(new P.hL(J.XHl(y.x),J.XHl(y.y)),[null])}},
-$isAjY:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-x76:{
+H9:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
 jh:function(a,b,c,d,e,f,g,h,i){var z,y
@@ -10329,16 +10392,16 @@
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"PZ;NL:firstChild=,uD:nextSibling=,J8:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
-gUN:function(a){return new W.wi(a)},
+"^":"FU;NL:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
+gdH:function(a){return new W.OB(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
-Tk:function(a,b){var z,y
+YP:function(a,b){var z,y
 try{z=a.parentNode
-J.LW(z,b,a)}catch(y){H.Ru(y)}return a},
+J.jk(z,b,a)}catch(y){H.Ru(y)}return a},
 aD:function(a,b,c){var z,y,x
 z=J.x(b)
-if(!!z.$iswi){z=b.uR
+if(!!z.$isOB){z=b.uR
 if(z===a)throw H.b(P.u(b))
 for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
 D4:function(a){var z
@@ -10347,8 +10410,8 @@
 return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gCR",0,0,73],
 mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-FO:function(a,b,c){return a.insertBefore(b,c)},
-AS:function(a,b,c){return a.replaceChild(b,c)},
+mK:function(a,b,c){return a.insertBefore(b,c)},
+OP:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
 BH3:{
@@ -10359,7 +10422,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -10382,11 +10445,11 @@
 l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-lq:{
+Qlt:{
 "^":"Bo;vH:index=,ph:label%,P:value%",
-$islq:true,
+$isQlt:true,
 "%":"HTMLOptionElement"},
-Xp:{
+wL2:{
 "^":"Bo;oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 HDy:{
@@ -10394,7 +10457,6 @@
 "%":"HTMLParamElement"},
 niR:{
 "^":"ea;",
-$isniR:true,
 "%":"PopStateEvent"},
 S8:{
 "^":"Gv;tT:code=,G1:message=",
@@ -10407,7 +10469,6 @@
 "%":"HTMLProgressElement"},
 ew7:{
 "^":"ea;ox:loaded=",
-$isew7:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 bXi:{
 "^":"ew7;O3:url=",
@@ -10415,12 +10476,12 @@
 j24:{
 "^":"Bo;t5:type=",
 "%":"HTMLScriptElement"},
-bs:{
-"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},yT:size=,t5:type=,P:value%",
+zk:{
+"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},ky:size=,t5:type=,P:value%",
 gbG:function(a){var z=W.vD(a.querySelectorAll("option"),null)
 z=z.ad(z,new W.xv())
-return H.VM(new P.Yp(P.F(z,!0,H.W8(z,"mW",0))),[null])},
-$isbs:true,
+return H.VM(new P.Ui(P.F(z,!0,H.W8(z,"mW",0))),[null])},
+$iszk:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"hsw;",
@@ -10433,18 +10494,18 @@
 zD9:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-y0:{
+r5:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
 "^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-er:{
+KKC:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 AsS:{
 "^":"Gv;",
-FV:function(a,b){H.bQ(b,new W.AA(a))},
+FV:function(a,b){H.bQ(b,new W.lN(a))},
 NZ:function(a,b){return a.getItem(b)!=null},
 t:function(a,b){return a.getItem(b)},
 u:function(a,b,c){a.setItem(b,c)},
@@ -10460,7 +10521,7 @@
 this.aN(a,new W.wQ(z))
 return z},
 gUQ:function(a){var z=[]
-this.aN(a,new W.rs(z))
+this.aN(a,new W.We(z))
 return z},
 gB:function(a){return a.length},
 gl0:function(a){return a.key(0)==null},
@@ -10483,7 +10544,7 @@
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableElement"},
 Iv:{
-"^":"Bo;RH:rowIndex=",
+"^":"Bo;Cw:rowIndex=",
 iF:function(a,b){return a.insertCell(b)},
 $isIv:true,
 "%":"HTMLTableRowElement"},
@@ -10491,13 +10552,13 @@
 "^":"Bo;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableSectionElement"},
-OH:{
+yY:{
 "^":"Bo;rz:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|k5d|hg"},
-Un:{
+$isyY:true,
+"%":";HTMLTemplateElement;GLL|k5d|G0"},
+kJ:{
 "^":"nx;",
-$isUn:true,
+$iskJ:true,
 "%":"CDATASection|Text"},
 FBi:{
 "^":"Bo;oc:name%,vp:rows=,t5:type=,P:value%",
@@ -10506,7 +10567,7 @@
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
 y6:{
-"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+"^":"w6O;w4:altKey=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
 "%":"TouchEvent"},
 RHt:{
 "^":"Bo;fY:kind=,ph:label%",
@@ -10519,13 +10580,13 @@
 "^":"ftg;fg:height%,R:width}",
 "%":"HTMLVideoElement"},
 EKW:{
-"^":"PZ;aB:protocol=,O3:url=",
+"^":"FU;A8:protocol=,O3:url=",
 XW:function(a,b,c){return a.close(b,c)},
 xO:function(a){return a.close()},
 wR:function(a,b){return a.send(b)},
 "%":"WebSocket"},
 K5:{
-"^":"PZ;bq:history=,oc:name%,pf:status%",
+"^":"FU;bq:history=,oc:name%,pf:status%",
 ne:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
 Wq:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
 for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
@@ -10534,14 +10595,14 @@
 b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 xO:function(a){return a.close()},
-xc:function(a,b,c,d){a.postMessage(P.pf(b),c)
+xc:function(a,b,c,d){a.postMessage(P.jl(b),c)
 return},
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 $isK5:true,
-$isPZ:true,
+$isFU:true,
 "%":"DOMWindow|Window"},
-U3:{
+UM:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
 FR:{
@@ -10566,19 +10627,19 @@
 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)
+w=W.Zm(W.Zm(W.Zm(W.Zm(0,z),y),x),w)
 v=536870911&w+((67108863&w)<<3>>>0)
 v^=v>>>11
 return 536870911&v+((16383&v)<<15>>>0)},
-gTt:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
+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,
+$isFU:true,
 "%":"HTMLFrameSetElement"},
-Cy:{
+rhM:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -10586,7 +10647,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -10608,7 +10669,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -10639,22 +10700,22 @@
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.Ff)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.lo)},
 GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
 Jd:function(a){return this.GT(a,null)},
 uk:function(a,b){this.aO(b,!1)},
 aO:function(a,b){var z,y,x
 z=this.dA
-if(b){z=J.Mx(z)
-y=z.ad(z,new W.dz(a))}else{z=J.Mx(z)
-y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Mp(x.gl())},
+if(b){z=J.dd(z)
+y=z.ad(z,new W.dz(a))}else{z=J.dd(z)
+y=z.ad(z,a)}for(z=H.VM(new H.Mo(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Rv(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.nO(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
 if(!!J.x(b).$ish4){z=this.dA
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},
-xe:function(a,b,c){var z,y,x
+aP:function(a,b,c){var z,y,x
 if(b>this.jS.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.jS
 y=z.length
@@ -10664,17 +10725,17 @@
 x.insertBefore(c,z[b])}},
 Mh:function(a,b,c){throw H.b(P.nO(null))},
 V1:function(a){J.Wf(this.dA)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)this.dA.removeChild(z)
+f4:function(a){var z=this.grZ(this)
+this.dA.removeChild(z)
 return z},
-gqG:function(a){var z=this.dA.firstElementChild
+gtH:function(a){var z=this.dA.firstElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 grZ:function(a){var z=this.dA.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asark:function(){return[W.h4]},
-$aseD:function(){return[W.h4]},
+$asE9h:function(){return[W.h4]},
 $asWO:function(){return[W.h4]},
 $asQV:function(){return[W.h4]}},
 dz:{
@@ -10682,19 +10743,19 @@
 $1:function(a){return this.a.$1(a)!==!0},
 $isEH:true},
 wz:{
-"^":"ark;jt,xa",
-gB:function(a){return this.jt.length},
-t:function(a,b){var z=this.jt
+"^":"ark;mk,xa",
+gB:function(a){return this.mk.length},
+t:function(a,b){var z=this.mk
 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)},
-gqG:function(a){return C.t5.gqG(this.jt)},
-grZ:function(a){return C.t5.grZ(this.jt)},
-gDD:function(a){return W.or(this.xa)},
-S8:function(a,b){var z=C.t5.ad(this.jt,new W.ty())
+gtH:function(a){return C.z0.gtH(this.mk)},
+grZ:function(a){return C.z0.grZ(this.mk)},
+gDD:function(a){return W.Uk(this.xa)},
+S8:function(a,b){var z=C.z0.ad(this.mk,new W.ty())
 this.xa=P.F(z,!0,H.W8(z,"mW",0))},
 $isWO:true,
 $asWO:null,
@@ -10708,7 +10769,7 @@
 "^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-QI:{
+M5K:{
 "^":"Gv;"},
 RAp:{
 "^":"Gv+lD;",
@@ -10726,7 +10787,7 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"TpZ:12;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,151,"call"],
+$1:[function(a){return J.CA(a)},"$1",null,2,0,null,151,"call"],
 $isEH:true},
 bU2:{
 "^":"TpZ:81;a",
@@ -10748,9 +10809,9 @@
 "^":"TpZ:81;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
-wi:{
+OB:{
 "^":"ark;uR",
-gqG:function(a){var z=this.uR.firstChild
+gtH:function(a){var z=this.uR.firstChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 grZ:function(a){var z=this.uR.lastChild
@@ -10758,8 +10819,8 @@
 return z},
 h:function(a,b){this.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.Ff)},
-xe:function(a,b,c){var z,y,x
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.lo)},
+aP:function(a,b,c){var z,y,x
 if(b>this.uR.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.uR
 y=z.childNodes
@@ -10771,7 +10832,7 @@
 z=this.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.r5(z,c,y[b])},
+J.qD(z,c,y[b])},
 Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 Rz:function(a,b){var z
 if(!J.x(b).$isKV)return!1
@@ -10791,7 +10852,7 @@
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 z.replaceChild(c,y[b])},
-gA:function(a){return C.t5.gA(this.uR.childNodes)},
+gA:function(a){return C.z0.gA(this.uR.childNodes)},
 GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
 Jd:function(a){return this.GT(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
@@ -10801,9 +10862,9 @@
 t:function(a,b){var z=this.uR.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-$iswi:true,
+$isOB:true,
 $asark:function(){return[W.KV]},
-$aseD:function(){return[W.KV]},
+$asE9h:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
@@ -10822,9 +10883,9 @@
 $asQV:function(){return[W.KV]}},
 xv:{
 "^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$islq},
+$1:function(a){return!!J.x(a).$isQlt},
 $isEH:true},
-AA:{
+lN:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
@@ -10832,7 +10893,7 @@
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
-rs:{
+We:{
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
@@ -10866,11 +10927,11 @@
 $asQV:function(){return[W.vKL]}},
 a7B:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.Za(this))},
+FV:function(a,b){J.Me(b,new W.ZcQ(this))},
 V1:function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.Ff)},
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.lo)},
 aN:function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 b.$2(y,this.t(0,y))}},
 gvc:function(a){var z,y,x,w
 z=this.dA.attributes
@@ -10888,7 +10949,7 @@
 gor:function(a){return this.gB(this)!==0},
 $isT8:true,
 $asT8:function(){return[P.qU,P.qU]}},
-Za:{
+ZcQ:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
@@ -10905,25 +10966,25 @@
 gB:function(a){return this.gvc(this).length},
 O2:function(a){return a.namespaceURI==null}},
 nFk:{
-"^":"As3;RN,AL",
-DG:function(){var z=P.Ls(null,null,null,P.qU)
-this.AL.aN(0,new W.jL(z))
+"^":"As3;a7,AL",
+DG:function(){var z=P.fM(null,null,null,P.qU)
+this.AL.aN(0,new W.pd(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.RN,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.Ff,z)},
+for(y=this.a7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.fm(y.lo,z)},
 H9:function(a){this.AL.aN(0,new W.uS(a))},
-Rz:function(a,b){return this.jA(new W.FcD(b))},
-jA:function(a){return this.AL.es(0,!1,new W.hD(a))},
-b1:function(a){this.AL=H.VM(new H.A8(P.F(this.RN,!0,null),new W.FK()),[null,null])},
-static:{or:function(a){var z=new W.nFk(a,null)
+Rz:function(a,b){return this.Fm(new W.FcD(b))},
+Fm:function(a){return this.AL.es(0,!1,new W.cf(a))},
+b1:function(a){this.AL=H.VM(new H.A8(P.F(this.a7,!0,null),new W.Zu()),[null,null])},
+static:{Uk:function(a){var z=new W.nFk(a,null)
 z.b1(a)
 return z}}},
-FK:{
+Zu:{
 "^":"TpZ:12;",
 $1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-jL:{
+pd:{
 "^":"TpZ:12;a",
 $1:function(a){return this.a.FV(0,a.DG())},
 $isEH:true},
@@ -10935,40 +10996,38 @@
 "^":"TpZ:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
-hD:{
+cf:{
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
 "^":"As3;dA",
 DG:function(){var z,y,x
-z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.Ff)
+z=P.fM(null,null,null,P.qU)
+for(y=J.ufU(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.iY(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
-J.Pw(this.dA,a.zV(0," "))}},
-FkO:{
-"^":"a;fA"},
-RO:{
-"^":"wS;bi,fA,el",
+J.fm(this.dA,a.zV(0," "))}},
+vG:{
+"^":"cb;bi,fA,el",
 KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.fA,W.Yt(a),this.el)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.DN()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
-Cqa:{
-"^":"RO;bi,fA,el",
-xZ:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"wS",0)])
-return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"wS",0),null])},
-$iswS:true},
+eu:{
+"^":"vG;bi,fA,el",
+WO:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"cb",0)])
+return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"cb",0),null])},
+$iscb:true},
 ie:{
 "^":"TpZ:12;a",
-$1:function(a){return J.tPf(J.l2(a),this.a)},
+$1:function(a){return J.vI(J.l2(a),this.a)},
 $isEH:true},
 tS:{
 "^":"TpZ:12;b",
-$1:[function(a){J.A6L(a,this.b)
+$1:[function(a){J.A6(a,this.b)
 return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
@@ -10980,14 +11039,14 @@
 return},
 Fv:[function(a,b){if(this.bi==null)return;++this.UU
 this.EO()
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
 gUF:function(){return this.UU>0},
 QE:[function(a){if(this.bi==null||this.UU<=0)return;--this.UU
 this.DN()},"$0","gDQ",0,0,17],
 DN:function(){var z=this.H2
 if(z!=null&&this.UU<=0)J.cZ(this.bi,this.fA,z,this.el)},
 EO:function(){var z=this.H2
-if(z!=null)J.we(this.bi,this.fA,z,this.el)}},
+if(z!=null)J.GJ(this.bi,this.fA,z,this.el)}},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.W8(a,"Gm",0)])},
@@ -10995,7 +11054,7 @@
 FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.GT(a,null)},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+aP:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
@@ -11009,44 +11068,44 @@
 $isQV:true,
 $asQV:null},
 uB:{
-"^":"ark;xN",
-gA:function(a){return H.VM(new W.LV(J.mY(this.xN)),[null])},
-gB:function(a){return this.xN.length},
-h:function(a,b){J.bi(this.xN,b)},
-Rz:function(a,b){return J.V1(this.xN,b)},
-V1:function(a){J.Z8(this.xN)},
-t:function(a,b){var z=this.xN
+"^":"ark;HA",
+gA:function(a){return H.VM(new W.Qg(J.mY(this.HA)),[null])},
+gB:function(a){return this.HA.length},
+h:function(a,b){J.dH(this.HA,b)},
+Rz:function(a,b){return J.V1(this.HA,b)},
+V1:function(a){J.U2(this.HA)},
+t:function(a,b){var z=this.HA
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.xN
+u:function(a,b,c){var z=this.HA
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.wg(this.xN,b)},
-GT:function(a,b){J.uF(this.xN,b)},
+sB:function(a,b){J.Vw(this.HA,b)},
+GT:function(a,b){J.uF(this.HA,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.DP(this.xN,b,c)},
+XU:function(a,b,c){return J.DP(this.HA,b,c)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.xN,b,c)},
+Pk:function(a,b,c){return J.ff(this.HA,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){return J.Vk(this.xN,b,c)},
-YW:function(a,b,c,d,e){J.CP(this.xN,b,c,d,e)},
+aP:function(a,b,c){return J.V2(this.HA,b,c)},
+YW:function(a,b,c,d,e){J.L0(this.HA,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-oq:function(a,b,c){J.Cz(this.xN,b,c)}},
-LV:{
-"^":"a;qD",
-G:function(){return this.qD.G()},
-gl:function(){return this.qD.QZ}},
+oq:function(a,b,c){J.Cz(this.HA,b,c)}},
+Qg:{
+"^":"a;iB",
+G:function(){return this.iB.G()},
+gl:function(){return this.iB.Ff}},
 W9:{
-"^":"a;NX,vN,G3,QZ",
+"^":"a;NX,bd,G3,Ff",
 G:function(){var z,y
 z=this.G3+1
-y=this.vN
-if(z<y){this.QZ=J.UQ(this.NX,z)
+y=this.bd
+if(z<y){this.Ff=J.UQ(this.NX,z)
 this.G3=z
-return!0}this.QZ=null
+return!0}this.Ff=null
 this.G3=y
 return!1},
-gl:function(){return this.QZ}},
+gl:function(){return this.Ff}},
 uY:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z=H.Va(this.b)
@@ -11059,17 +11118,17 @@
 gbq:function(a){return W.zK(this.uU.history)},
 geT:function(a){return W.P1(this.uU.parent)},
 xO:function(a){return this.uU.close()},
-xc:function(a,b,c,d){this.uU.postMessage(P.pf(b),c)},
+xc:function(a,b,c,d){this.uU.postMessage(P.jl(b),c)},
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-$isPZ:true,
+$isFU:true,
 static:{P1:function(a){if(a===window)return a
 else return new W.dW(a)}}},
-VP:{
-"^":"a;nA",
+IV:{
+"^":"a;nAT",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.VP(a)}}}}],["","",,P,{
+else return new W.IV(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -11077,10 +11136,10 @@
 "%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
-"^":"tpr;N:target=,mH:href=",
+"^":"tpr;N:target=,LU:href=",
 "%":"SVGAElement"},
 ZJQ:{
-"^":"Rc;mH:href=",
+"^":"dh;LU:href=",
 "%":"SVGAltGlyphElement"},
 jwG:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -11088,13 +11147,13 @@
 lvr:{
 "^":"d5G;t5:type=,UQ:values=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
-pfc:{
+vA:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-lF:{
+pyf:{
 "^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
-EfE:{
+B3:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
@@ -11110,7 +11169,7 @@
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 meI:{
-"^":"d5G;fg:height=,yG:result=,x=,y=,mH:href=",
+"^":"d5G;fg:height=,yG:result=,x=,y=,LU:href=",
 "%":"SVGFEImageElement"},
 oBW:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -11124,57 +11183,57 @@
 Ubr:{
 "^":"d5G;x=,y=",
 "%":"SVGFEPointLightElement"},
-bMB:{
+zu:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 HAk:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
-Rg:{
+Qya:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 juM:{
 "^":"d5G;t5:type=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 OE5:{
-"^":"d5G;fg:height=,x=,y=,mH:href=",
+"^":"d5G;fg:height=,x=,y=,LU:href=",
 "%":"SVGFilterElement"},
 l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
+d0D:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
 "^":"d5G;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 rEM:{
-"^":"tpr;fg:height=,x=,y=,mH:href=",
+"^":"tpr;fg:height=,x=,y=,LU:href=",
 "%":"SVGImageElement"},
 NBZ:{
 "^":"d5G;fg:height=,x=,y=",
 "%":"SVGMaskElement"},
 Gr5:{
-"^":"d5G;fg:height=,x=,y=,mH:href=",
+"^":"d5G;fg:height=,x=,y=,LU:href=",
 "%":"SVGPatternElement"},
-NJ3:{
-"^":"en;fg:height=,x=,y=",
+fQ:{
+"^":"d0D;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
-"^":"d5G;t5:type=,mH:href=",
+"^":"d5G;t5:type=,LU:href=",
 "%":"SVGScriptElement"},
 EUL:{
 "^":"d5G;t5:type=",
-smk:function(a,b){a.title=b},
+ska:function(a,b){a.title=b},
 "%":"SVGStyleElement"},
 d5G:{
 "^":"h4;",
-gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
+gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.Ci(a)
 return a._cssClassSet},
-gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
-gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
-$isPZ:true,
+gqu:function(a){return H.VM(new P.P0(a,new W.OB(a)),[W.h4])},
+gVY:function(a){return H.VM(new W.eu(a,"mousedown",!1),[null])},
+gf0:function(a){return H.VM(new W.eu(a,"mousemove",!1),[null])},
+$isFU:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
 static:{"^":"SHk<"}},
 hy:{
@@ -11186,24 +11245,24 @@
 "^":"tpr;",
 "%":";SVGTextContentElement"},
 Rk4:{
-"^":"mHq;mH:href=",
+"^":"mHq;LU:href=",
 "%":"SVGTextPathElement"},
-Rc:{
+dh:{
 "^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-o4:{
-"^":"tpr;fg:height=,x=,y=,mH:href=",
+pyk:{
+"^":"tpr;fg:height=,x=,y=,LU:href=",
 "%":"SVGUseElement"},
 cuU:{
-"^":"d5G;mH:href=",
+"^":"d5G;LU:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-O7:{
+Ci:{
 "^":"As3;LO",
 DG:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,P.qU)
+y=P.fM(null,null,null,P.qU)
 if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.Ff)
+for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.iY(x.lo)
 if(w.length!==0)y.h(0,w)}return y},
 p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
@@ -11211,9 +11270,9 @@
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["","",,P,{
 "^":"",
-hq:{
+XY:{
 "^":"a;",
-$ishq:true}}],["","",,P,{
+$isXY:true}}],["","",,P,{
 "^":"",
 z8:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
@@ -11279,7 +11338,7 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},XY:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
+return P.ND(new x())},kW:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
 return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(H.VM(new P.PL(0,null,null,null,null),[null,null])).$1(a)}}},
 Xb:{
 "^":"TpZ:12;a",
@@ -11305,7 +11364,7 @@
 $isr7:true,
 static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
 GD:{
-"^":"WkF;S1",
+"^":"F6;S1",
 t:function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
 else z=!1
@@ -11320,9 +11379,9 @@
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
 h:function(a,b){this.V7("push",[b])},
 FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
-xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
+aP:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
 this.V7("splice",[b,0,c])},
-oq:function(a,b,c){P.ze(b,c,this.gB(this))
+oq:function(a,b,c){P.UP(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)
@@ -11332,14 +11391,14 @@
 if(y===0)return
 if(e<0)throw H.b(P.u(e))
 x=[b,y]
-C.Nm.FV(x,J.Ld(d,e).rh(0,y))
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
 this.V7("splice",x)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[])},
 Jd:function(a){return this.GT(a,null)},
-static:{ze:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
+static:{UP: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))}}},
-WkF:{
+F6:{
 "^":"E4+lD;",
 $isWO:true,
 $asWO:null,
@@ -11369,10 +11428,10 @@
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["","",,P,{
 "^":"",
-Zm:function(a,b){a=536870911&a+b
+VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-xk:function(a){a=536870911&a+((67108863&a)<<3>>>0)
+Up: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
@@ -11399,7 +11458,7 @@
 return Math.random()*a>>>0}},
 kh:{
 "^":"a;xx,vz",
-SR:function(){var z,y,x,w,v,u
+xv:function(){var z,y,x,w,v,u
 z=this.xx
 y=4294901760*z
 x=(y&4294967295)>>>0
@@ -11412,19 +11471,19 @@
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.SR()
-return(this.xx&z)>>>0}do{this.SR()
+if((a&z)===0){this.xv()
+return(this.xx&z)>>>0}do{this.xv()
 y=this.xx
 x=y%a}while(y-x+a>=4294967296)
 return x},
-mK:function(a){var z,y,x,w,v,u,t,s
+FO: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.Cl(y.W(a,x),4294967296)
+a=J.Ts(y.W(a,x),4294967296)
 y=J.Wx(a)
 w=y.i(a,4294967295)
-a=J.Cl(y.W(a,w),4294967296)
+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.BU(v-u,4294967296)&4294967295
@@ -11447,12 +11506,12 @@
 this.xx=(t^u)>>>0
 this.vz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
 if(this.vz===0&&this.xx===0)this.xx=23063
-this.SR()
-this.SR()
-this.SR()
-this.SR()},
-static:{"^":"tgM,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
-z.mK(a)
+this.xv()
+this.xv()
+this.xv()
+this.xv()},
+static:{"^":"dK,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
+z.FO(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
@@ -11470,7 +11529,7 @@
 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))},
+return P.Up(P.VC(P.VC(0,z),y))},
 g:function(a,b){var z,y,x,w
 z=this.x
 y=J.RE(b)
@@ -11520,8 +11579,8 @@
 z=y===z.gG6(b)&&this.Bb+this.R===z.gT8(b)&&y+this.fg===z.gQG(b)}else z=!1
 return z},
 giO:function(a){var z=this.G6
-return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
-gTt:function(a){var z=new P.hL(this.gBb(this),this.G6)
+return P.Up(P.VC(P.VC(P.VC(P.VC(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
+gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
@@ -11536,7 +11595,7 @@
 moY:{
 "^":"a;JH",
 static:{"^":"aRn,aLE,Rwl"}},
-V2:{
+Wy:{
 "^":"a;",
 $isAS:true}}],["","",,H,{
 "^":"",
@@ -11547,14 +11606,14 @@
 return a},
 aRu:function(a){a.toString
 return a},
-z4:function(a,b,c){H.Hj(a,b,c)
+GG:function(a,b,c){H.Hj(a,b,c)
 return new Uint8Array(a,b)},
-bf:{
+WZ:{
 "^":"Gv;H3:byteLength=",
-gbx:function(a){return C.uh},
+gbx:function(a){return C.E0},
 kq:function(a,b,c){H.Hj(a,b,c)
 return new DataView(a,b)},
-$isbf:true,
+$isWZ:true,
 $isaI:true,
 "%":"ArrayBuffer"},
 eH:{
@@ -11570,32 +11629,32 @@
 return c},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;b0B|ObS|Ip|Dg|fjp|GVy|Pg"},
+"%":";ArrayBufferView;we|ObS|GVy|Dg|fjp|Ipv|Pg"},
 dfL:{
 "^":"eH;",
-gbx:function(a){return C.nW},
+gbx:function(a){return C.T1},
 mt:function(a,b,c){throw H.b(P.f("Uint64 accessor not supported by dart2js."))},
 $isAS:true,
 "%":"DataView"},
 zU7:{
 "^":"Dg;",
-gbx:function(a){return C.kq},
+gbx:function(a){return C.ra},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]},
+$asQV:function(){return[P.CP]},
 "%":"Float32Array"},
 K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.nC},
+gbx:function(a){return C.Ev},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]},
+$asQV:function(){return[P.CP]},
 "%":"Float64Array"},
 xja:{
 "^":"Pg;",
@@ -11612,7 +11671,7 @@
 "%":"Int16Array"},
 dE5:{
 "^":"Pg;",
-gbx:function(a){return C.QP},
+gbx:function(a){return C.J0},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11625,7 +11684,7 @@
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
-gbx:function(a){return C.laj},
+gbx:function(a){return C.qB},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11636,7 +11695,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Int8Array"},
-pd:{
+wfF:{
 "^":"Pg;",
 gbx:function(a){return C.M5},
 t:function(a,b){var z=a.length
@@ -11649,7 +11708,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Uint16Array"},
-Pqh:{
+N2:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
 t:function(a,b){var z=a.length
@@ -11664,7 +11723,7 @@
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
-gbx:function(a){return C.YZ},
+gbx:function(a){return C.hD},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
@@ -11676,9 +11735,9 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"CanvasPixelArray|Uint8ClampedArray"},
-V6:{
+V6a:{
 "^":"Pg;",
-gbx:function(a){return C.Wr},
+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.aq(a,b,z)
@@ -11691,7 +11750,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":";Uint8Array"},
-b0B:{
+we:{
 "^":"eH;",
 gB:function(a){return a.length},
 SM:function(a,b,c,d,e){var z,y,x
@@ -11707,7 +11766,7 @@
 a.set(d,b)},
 $isXj:true},
 Dg:{
-"^":"Ip;",
+"^":"GVy;",
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11719,16 +11778,16 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true},
 ObS:{
-"^":"b0B+lD;",
+"^":"we+lD;",
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]}},
-Ip:{
+$asQV:function(){return[P.CP]}},
+GVy:{
 "^":"ObS+SU7;"},
 Pg:{
-"^":"GVy;",
+"^":"Ipv;",
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 a[b]=c},
@@ -11742,43 +11801,43 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 fjp:{
-"^":"b0B+lD;",
+"^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-GVy:{
+Ipv:{
 "^":"fjp+SU7;"}}],["","",,H,{
 "^":"",
-Af:function(a){if(typeof dartPrint=="function"){dartPrint(a)
+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)}}],["","",,G,{
 "^":"",
 Tk:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{aMd:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.BB.LX(a)
-C.BB.XI(a)
+C.vo.LX(a)
+C.vo.XI(a)
 return a}}}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"pva;Ew,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"pva;Ew,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkc:function(a){return a.Ew},
 skc:function(a,b){a.Ew=this.ct(a,C.yh,a.Ew,b)},
 static:{Yw:function(a){var z,y,x,w
@@ -11787,7 +11846,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -11802,9 +11861,9 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"cda;a3,Ek,Ln,y4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-ga4:function(a){return a.a3},
-sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
+"^":"cda;fn,Ek,Ln,y4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+ga4:function(a){return a.fn},
+sa4:function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},
 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},
@@ -11813,22 +11872,22 @@
 sFR:function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},
 gCf:function(a){return a.y4},
 sCf:function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},
-hE:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
+hE:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isSc").value
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
-if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,116,2,106,107],
-kk:[function(a,b,c,d){var z,y,x
-J.fD(b)
-z=a.a3
-a.a3=this.ct(a,C.mi,z,"")
+if(J.xC(z,"1-line")){z=J.JA(a.fn,"\n"," ")
+a.fn=this.ct(a,C.mi,a.fn,z)}},"$3","gxb",6,0,116,2,106,107],
+jc:[function(a,b,c,d){var z,y,x
+J.jD(b)
+z=a.fn
+a.fn=this.ct(a,C.mi,z,"")
 if(a.Ln!=null){y=P.Fl(null,null)
 x=R.tB(y)
-J.kW(x,"expr",z)
-J.Vk(a.y4,0,x)
+J.qQ(x,"expr",z)
+J.V2(a.y4,0,x)
 this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,116,2,106,107],
-o5:[function(a,b){var z=J.VU(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,152,2],
+o5:[function(a,b){var z=J.MI(J.l2(b),"expr")
+a.fn=this.ct(a,C.mi,a.fn,z)},"$1","gHo",2,0,152,2],
 static:{Rpj:function(a){var z,y,x,w,v
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -11838,26 +11897,26 @@
 v=P.Fl(null,null)
 a.Ek="1-line"
 a.y4=z
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.Jh.LX(a)
-C.Jh.XI(a)
+C.GhT.LX(a)
+C.GhT.XI(a)
 return a}}},
 cda:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"TpZ:12;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){J.qQ(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"KAf;fe,l1,bY,jv,oy,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"KAf;fe,l1,bY,jv,oy,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gO9:function(a){return a.fe},
 sO9:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
@@ -11874,7 +11933,7 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gDf",6,0,84,49,50,85],
+this.LY(a,a.jv).ml(new R.Ou(a)).wM(new R.VO(a))}},"$3","gDf",6,0,84,49,50,85],
 static:{Ola:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11886,40 +11945,40 @@
 a.bY=null
 a.jv=""
 a.oy=null
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.lQ.LX(a)
-C.lQ.XI(a)
+C.qL.LX(a)
+C.qL.XI(a)
 return a}}},
 KAf:{
 "^":"xc+Pi;",
 $isd3:true},
-Kz:{
+Ou:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.oy=J.NB(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-uv:{
+VO:{
 "^":"TpZ:76;b",
 $0:[function(){var z=this.b
-z.fe=J.NB(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
+z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{hSW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -11931,7 +11990,7 @@
 return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"waa;KV,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"waa;KV,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
 pA:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,19,102],
@@ -11941,22 +12000,22 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.LTI.LX(a)
-C.LTI.XI(a)
+C.D4.LX(a)
+C.D4.XI(a)
 return a}}},
 waa:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"V10;DC,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V10;DC,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
 pA:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,19,102],
@@ -11966,45 +12025,45 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.n0.LX(a)
-C.n0.XI(a)
+C.N3.LX(a)
+C.N3.XI(a)
 return a}}},
 V10:{
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"V11;Zc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gQR:function(a){return a.Zc},
-sQR:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
+"^":"V11;Zc,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gng:function(a){return a.Zc},
+sng:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{IfX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.ls6.LX(a)
-C.ls6.XI(a)
+C.Hb.LX(a)
+C.Hb.XI(a)
 return a}}},
 V11:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"T53;PQ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"T53;PQ,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gU4:function(a){return a.PQ},
 sU4:function(a,b){a.PQ=this.ct(a,C.QK,a.PQ,b)},
 static:{v9:function(a){var z,y,x,w
@@ -12014,8 +12073,8 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.PQ=!0
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12030,18 +12089,18 @@
 $isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V12;P6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V12;P6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
 pA:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
+Da:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
 static:{nz:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12073,9 +12132,9 @@
 if(typeof z!=="number")return H.s(z)
 return new O.Hz(a,(y*x+z)*4)}}},
 x2:{
-"^":"a;Yu<,yT>"},
+"^":"a;Yu<,ky>"},
 Vb:{
-"^":"V13;N2,WC,rn,Tl,GE,Cv,PA,oj,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V13;N2,WC,rn,Tl,GE,Cv,PA,oj,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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},
@@ -12086,10 +12145,10 @@
 a.N2=z
 z=J.Q9(z)
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gL2(a)),z.el),[H.u3(z,0)]).DN()
-z=J.GW(a.N2)
+z=J.PQ(a.N2)
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gok(a)),z.el),[H.u3(z,0)]).DN()},
 Zt:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.Ff
+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},
 OU:function(a,b,c,d){var z=J.BQ(c,"@")
@@ -12100,7 +12159,7 @@
 DO:function(a,b,c){var z,y,x,w,v,u,t,s,r
 for(z=J.mY(J.UQ(b,"members")),y=a.Cv,x=a.Tl,w=a.GE;z.G();){v=z.gl()
 if(!J.x(v).$isdy){N.QM("").To(H.d(v))
-continue}u=H.BU(C.Nm.grZ(J.BQ(v.TU,"/")),null,null)
+continue}u=H.BU(C.Nm.grZ(J.BQ(v.r0,"/")),null,null)
 t=u==null?C.Xh:P.n2(u)
 s=[t.j1(128),t.j1(128),t.j1(128),255]
 r=J.BQ(v.bN,"@")
@@ -12108,7 +12167,7 @@
 y.u(0,u,r[0])
 x.u(0,u,s)
 w.u(0,this.Zt(a,s),u)}this.OU(a,c,"Free",$.R2())
-this.OU(a,0,"",$.Qg())},
+this.OU(a,0,"",$.vl())},
 Tm:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.rn
 y=J.eY(a.WC)
@@ -12144,15 +12203,15 @@
 bD:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=this.Tm(a,z.gD7(b))
-x=H.d(y.yT)+"B @ 0x"+J.u1(y.Yu,16)
+x=H.d(y.ky)+"B @ 0x"+J.u1(y.Yu,16)
 z=z.gD7(b)
 z=O.x6(a.WC,z)
 w=z.y5
 v=a.Cv.t(0,a.GE.t(0,this.Zt(a,C.yp.Yc(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
 a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gL2",2,0,152,87],
-qM:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gok",2,0,152,87],
+Vq:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.wg(a.oj)))+"/address/"+z},"$1","gok",2,0,152,87],
 UV:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.N2==null)return
@@ -12161,19 +12220,19 @@
 z=a.N2.parentElement
 z.toString
 x=P.T7(C.CD.yu(C.CD.RE(z.clientLeft)),C.CD.yu(C.CD.RE(z.clientTop)),C.CD.yu(C.CD.RE(z.clientWidth)),C.CD.yu(C.CD.RE(z.clientHeight)),null).R
-z=J.Cl(J.Cl(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
+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.rn=z
 w=J.q8(y)
 if(typeof w!=="number")return H.s(w)
 v=P.J(z*w,6000)
-w=P.f9(J.Ry(a.N2).createImageData(x,v))
+w=P.f9(J.rN(a.N2).createImageData(x,v))
 a.WC=w
 J.vP(a.N2,J.eY(w))
-J.OE(a.N2,J.OB(a.WC))
-this.Ky(a,0)},
-Ky:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+J.OE(a.N2,J.Jv(a.WC))
+this.JX(a,0)},
+JX:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.UQ(a.oj,"pages")
 y=J.U6(z)
 x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
@@ -12184,7 +12243,7 @@
 v=w+x
 x=y.gB(z)
 if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.OB(a.WC)
+if(!(b>=x)){x=J.Jv(a.WC)
 if(typeof x!=="number")return H.s(x)
 x=v>x}else x=!0
 if(x)return
@@ -12214,18 +12273,18 @@
 l=C.CD.Z(x,l)
 new P.hL(m,l).$builtinTypeInfo=[null]
 if(!(l<v))break
-x=$.Qg()
+x=$.vl()
 m=y+4
 C.yp.zB(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Ry(a.N2)
+u=new O.Hz(r,m)}y=J.rN(a.N2)
 x=a.WC
-J.kZ(y,x,0,0,0,w,J.eY(x),v)
-P.DJ(new O.R5(a,b),null)},
+J.nb(y,x,0,0,0,w,J.eY(x),v)
+P.nd(new O.nW(a,b),null)},
 pA:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.pM()).wM(b)},"$1","gvC",2,0,19,102],
-YS7:[function(a,b){P.DJ(new O.oc(a),null)},"$1","gRh",2,0,19,59],
-static:{"^":"nK,Os,SoT,WBO",teo:function(a){var z,y,x,w,v,u,t
+J.wg(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).wM(b)},"$1","gvC",2,0,19,102],
+YS7:[function(a,b){P.nd(new O.oc(a),null)},"$1","gRs",2,0,19,59],
+static:{"^":"nK,dg,SoT,WBO",dF:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
@@ -12237,7 +12296,7 @@
 a.Tl=z
 a.GE=y
 a.Cv=x
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=w
@@ -12250,32 +12309,32 @@
 V13:{
 "^":"uL+Pi;",
 $isd3:true},
-R5:{
+nW:{
 "^":"TpZ:76;a,b",
-$0:function(){J.AC(this.a,this.b+1)},
+$0:function(){J.tE(this.a,this.b+1)},
 $isEH:true},
 aG:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.oj=J.NB(z,C.QH,z.oj,a)},"$1",null,2,0,null,155,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
-pM:{
+z4:{
 "^":"TpZ:81;",
 $2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,156,"call"],
 $isEH:true},
 oc:{
 "^":"TpZ:76;a",
-$0:function(){J.oO(this.a)},
+$0:function(){J.J2g(this.a)},
 $isEH:true}}],["","",,K,{
 "^":"",
 UC:{
-"^":"Vz;oH,vp,zz,pT,Rj,Vg,fn",
+"^":"Vz;oH,vp,GD,pT,Rj,Vg,ij",
 Ey:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.DA(J.UQ(J.hI(z[a]),b))}return G.Vz.prototype.Ey.call(this,a,b)}},
 Ly:{
-"^":"V14;MF,uY,Xe,jF,FX,Uv,Rp,Na,Ol,Sk,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V14;MF,uY,Xe,JN,FX,qD,Rp,Na,Ol,Sk,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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},
@@ -12289,15 +12348,15 @@
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.yD(null,P.L5(null,null,null,null,null))
+y=new G.qu(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.jF=y
+a.JN=y
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.yD(null,P.L5(null,null,null,null,null))
+z=new G.qu(null,P.L5(null,null,null,null,null))
 z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.Uv=z
+a.qD=z
 a.Na=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Y1:function(a){var z,y,x,w
+Qf: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")
@@ -12317,28 +12376,28 @@
 s=y.gxQ().gEJ().wf
 r=y.gxQ().gl().wY
 q=y.gxQ().gl().wf
-J.an(a.Rp,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.II(a.Rp)},
-As:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.Rp),c)
+J.Ip(a.Rp,new G.c0([y,"",x,w,v,u,"",t,s,r,q]))}J.zq(a.Rp)},
+lD:function(a,b,c){var z,y,x,w,v,u
+z=J.UQ(J.x3(a.Rp),c)
 y=J.RE(b)
 x=J.RE(z)
-J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
+J.PP(J.UQ(J.dd(J.UQ(y.gqu(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.Q5,w))break c$0
-u=J.UQ(y.gks(b),w)
+c$0:{if(C.Nm.tg(C.jb,w))break c$0
+u=J.UQ(y.gqu(b),w)
 v=J.RE(u)
-v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
+v.ska(u,J.AG(J.UQ(x.gUQ(z),w)))
 v.sa4(u,a.Rp.Gu(c,w))}++w}},
 ya:function(a){var z,y,x,w,v,u,t,s
-z=J.Mx(a.Na)
-if(z.gB(z)>a.Rp.gzz().length){z=J.Mx(a.Na)
-y=z.gB(z)-a.Rp.gzz().length
-for(x=0;x<y;++x)J.Mx(a.Na).mv(0)}else{z=J.Mx(a.Na)
-if(z.gB(z)<a.Rp.gzz().length){z=a.Rp.gzz().length
-w=J.Mx(a.Na)
+z=J.dd(a.Na)
+if(z.gB(z)>a.Rp.gGD().length){z=J.dd(a.Na)
+y=z.gB(z)-a.Rp.gGD().length
+for(x=0;x<y;++x)J.dd(a.Na).f4(0)}else{z=J.dd(a.Na)
+if(z.gB(z)<a.Rp.gGD().length){z=a.Rp.gGD().length
+w=J.dd(a.Na)
 v=z-w.gB(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
 z=J.RE(u)
@@ -12357,42 +12416,42 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.Mx(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
+J.dd(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gGD().length;++x){z=a.Rp.gGD()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
-this.As(a,J.Mx(a.Na).t(0,x),s)}},
+this.lD(a,J.dd(a.Na).t(0,x),s)}},
 BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.Rp.gxp()
+if(!!J.x(d).$isv6){z=a.Rp.gn4()
 y=d.cellIndex
 x=a.Rp
-if(z==null?y!=null:z!==y){x.sxp(y)
+if(z==null?y!=null:z!==y){x.sn4(y)
 a.Rp.sT3(!0)}else x.sT3(!x.gT3())
-J.II(a.Rp)
+J.zq(a.Rp)
 this.ya(a)}},"$3","gQq",6,0,105,2,106,107],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).wM(b)},"$1","gvC",2,0,19,102],
+J.wg(z).cv("/allocationprofile").ml(this.gbM(a)).wM(b)},"$1","gvC",2,0,19,102],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).wM(b)},"$1","gyW",2,0,19,102],
+J.wg(z).cv("/allocationprofile?gc=full").ml(this.gbM(a)).wM(b)},"$1","gzH",2,0,19,102],
 eJ8:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).wM(b)},"$1","gNb",2,0,19,102],
-Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,157,158],
+J.wg(z).cv("/allocationprofile?reset=true").ml(this.gbM(a)).wM(b)},"$1","gNb",2,0,19,102],
+un:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gbM",2,0,157,158],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
-z=J.aT(z)
+z=J.wg(z)
 z=this.ct(a,C.rB,a.Sk,z)
 a.Sk=z
-z.Bs(J.UQ(a.Ol,"heaps"))
+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.Xe.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-x=J.aT(a.Ol)
+x=J.wg(a.Ol)
 z=a.Xe
 w=x.gUY().gSU()
 z=z.Yb
@@ -12400,7 +12459,7 @@
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.Xe
-z=J.bI(x.gUY().gkV(),x.gUY().gSU())
+z=J.bI(x.gUY().gbZ(),x.gUY().gSU())
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
@@ -12420,7 +12479,7 @@
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.FX
-z=J.bI(x.gxQ().gkV(),x.gxQ().gSU())
+z=J.bI(x.gxQ().gbZ(),x.gxQ().gSU())
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
@@ -12431,42 +12490,42 @@
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-this.Y1(a)
+this.Qf(a)
 this.FS(a)
 this.ya(a)
-a.jF.Am(0,a.Xe)
-a.Uv.Am(0,a.FX)
+a.JN.Am(0,a.Xe)
+a.qD.Am(0,a.FX)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
+this.ct(a,C.DS,0,1)},"$1","gwh",2,0,19,59],
 ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,159,160],
+return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,159,160],
 NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,159,160],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gBo",2,0,159,160],
 o7:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,159,160],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.Xe=new G.Kf(z)
+a.Xe=new G.eM(z)
 z.V7("addColumn",["string","Type"])
 a.Xe.Yb.V7("addColumn",["number","Size"])
 z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.FX=new G.Kf(z)
+a.FX=new G.eM(z)
 z.V7("addColumn",["string","Type"])
 a.FX.Yb.V7("addColumn",["number","Size"])
-z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.Tp()),new G.Kt("",G.Tp()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.OA()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.OA()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.OA()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.OA())],z,[],0,!0,null,null))
+z=H.VM([],[G.c0])
+z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.NZt()),new G.Kt("",G.NZt()),new G.Kt("Accumulated Size (New)",G.RC()),new G.Kt("Accumulated Instances",G.nI()),new G.Kt("Current Size",G.RC()),new G.Kt("Current Instances",G.nI()),new G.Kt("",G.NZt()),new G.Kt("Accumulator Size (Old)",G.RC()),new G.Kt("Accumulator Instances",G.nI()),new G.Kt("Current Size",G.RC()),new G.Kt("Current Instances",G.nI())],z,[],0,!0,null,null))
 a.Rp=z
-z.sxp(2)},
+z.sn4(2)},
 static:{EDe:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12475,7 +12534,7 @@
 w=P.Fl(null,null)
 a.MF="---"
 a.uY="---"
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12490,24 +12549,24 @@
 "^":"uL+Pi;",
 $isd3:true}}],["","",,P,{
 "^":"",
-pf:function(a){var z,y
+jl:function(a){var z,y
 z=[]
-y=new P.kd(new P.wF([],z),new P.rG(z),new P.yhO(z)).$1(a)
+y=new P.Tm(new P.wF([],z),new P.rG(z),new P.Os(z)).$1(a)
 new P.Qa().$0()
 return y},
 o7:function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.D6(z),new P.m5(z)).$1(a)},
+return new P.xL(b,new P.GW([],z),new P.D6(z),new P.m5(z)).$1(a)},
 f9:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.nl(a.data,a.height,a.width)},
-QO:function(a){if(!!J.x(a).$isnl)return{data:a.Rn,height:a.fg,width:a.R}
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isqS)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)
+if(z==null){z=J.QY(window.navigator.userAgent,"Opera",0)
+$.Qz=z}z=z!==!0&&J.QY(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
 wF:{
 "^":"TpZ:51;b,c",
@@ -12525,7 +12584,7 @@
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
-yhO:{
+Os:{
 "^":"TpZ:162;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
@@ -12535,7 +12594,7 @@
 "^":"TpZ:76;",
 $0:function(){},
 $isEH:true},
-kd:{
+Tm:{
 "^":"TpZ:12;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
@@ -12548,8 +12607,9 @@
 if(!!y.$iswL)throw H.b(P.nO("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
+if(!!y.$isXV)return a
 if(!!y.$isSg)return a
-if(!!y.$isbf)return a
+if(!!y.$isWZ)return a
 if(!!y.$iseH)return a
 if(!!y.$isT8){x=this.f.$1(a)
 w=this.UI.$1(x)
@@ -12573,7 +12633,7 @@
 "^":"TpZ:81;a,Gq",
 $2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
-CA:{
+GW:{
 "^":"TpZ:51;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
@@ -12609,7 +12669,7 @@
 if(y!=null)return y
 y=P.Fl(null,null)
 this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
+for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
 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
@@ -12623,9 +12683,9 @@
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
 return y}return a},
 $isEH:true},
-nl:{
+qS:{
 "^":"a;Rn>,fg>,R>",
-$isnl:true,
+$isqS:true,
 $isSg:true},
 As3:{
 "^":"a;",
@@ -12640,8 +12700,8 @@
 return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,163,30],
 ad:function(a,b){var z=this.DG()
 return H.VM(new H.U5(z,b),[H.u3(z,0)])},
-lM:[function(a,b){var z=this.DG()
-return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,164,30],
+yx:[function(a,b){var z=this.DG()
+return H.VM(new H.Fm(z,b),[H.u3(z,0),null])},"$1","git",2,0,164,30],
 Vr:function(a,b){return this.DG().Vr(0,b)},
 gl0:function(a){return this.DG().X5===0},
 gor:function(a){return this.DG().X5!==0},
@@ -12657,7 +12717,7 @@
 return y},
 FV:function(a,b){this.H9(new P.rl(b))},
 uk:function(a,b){this.H9(new P.Jg(b))},
-gqG:function(a){var z=this.DG().HH
+gtH:function(a){var z=this.DG().HH
 if(z==null)H.vh(P.w("No elements"))
 return z.gGc(z)},
 grZ:function(a){var z=this.DG().Nz
@@ -12665,27 +12725,27 @@
 return z.gGc(z)},
 tt:function(a,b){return this.DG().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y
+Oe:function(a){var z,y
 z=this.DG()
 y=z.iL()
 y.FV(0,z)
 return y},
 eR:function(a,b){var z=this.DG()
-return H.ke(z,b,H.u3(z,0))},
+return H.p6(z,b,H.u3(z,0))},
 V1:function(a){this.H9(new P.uQ())},
 H9:function(a){var z,y
 z=this.DG()
 y=a.$1(z)
 this.p5(z)
 return y},
-$isOl:true,
-$asOl:function(){return[P.qU]},
+$isz5:true,
+$asz5:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,165,"call"],
+$1:[function(a){return J.dH(a,this.a)},"$1",null,2,0,null,165,"call"],
 $isEH:true},
 rl:{
 "^":"TpZ:12;a",
@@ -12697,23 +12757,23 @@
 $isEH:true},
 uQ:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,165,"call"],
+$1:[function(a){return J.U2(a)},"$1",null,2,0,null,165,"call"],
 $isEH:true},
-D7:{
-"^":"ark;im,kG",
-gd3:function(){var z=this.kG
+P0:{
+"^":"ark;im,vN",
+gd3:function(){var z=this.vN
 return P.F(z.ad(z,new P.hT()),!0,W.h4)},
 aN:function(a,b){H.bQ(this.gd3(),b)},
 u:function(a,b,c){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.DG(z[b],c)},
+J.vR(z[b],c)},
 sB:function(a,b){var z=this.gd3().length
 if(b>=z)return
 else if(b<0)throw H.b(P.u("Invalid list length"))
 this.oq(0,b,z)},
-h:function(a,b){this.kG.uR.appendChild(b)},
+h:function(a,b){this.vN.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.kG.uR;z.G();)y.appendChild(z.Ff)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.vN.uR;z.G();)y.appendChild(z.lo)},
 tg:function(a,b){if(!J.x(b).$ish4)return!1
 return b.parentNode===this.im},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
@@ -12721,22 +12781,22 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 oq:function(a,b,c){H.bQ(C.Nm.aM(this.gd3(),b,c),new P.rK())},
-V1:function(a){J.Wf(this.kG.uR)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)J.Mp(z)
+V1:function(a){J.Wf(this.vN.uR)},
+f4:function(a){var z=this.grZ(this)
+if(z!=null)J.Rv(z)
 return z},
-xe:function(a,b,c){this.kG.xe(0,b,c)},
+aP:function(a,b,c){this.vN.aP(0,b,c)},
 UG:function(a,b,c){var z,y
-z=this.kG.uR
+z=this.vN.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.r5(z,c,y[b])},
+J.qD(z,c,y[b])},
 Rz:function(a,b){var z,y,x
 if(!J.x(b).$ish4)return!1
 for(z=0;z<this.gd3().length;++z){y=this.gd3()
 if(z>=y.length)return H.e(y,z)
 x=y[z]
-if(x===b){J.Mp(x)
+if(x===b){J.Rv(x)
 return!0}}return!1},
 gB:function(a){return this.gd3().length},
 t:function(a,b){var z=this.gd3()
@@ -12750,23 +12810,23 @@
 $isEH:true},
 rK:{
 "^":"TpZ:12;",
-$1:function(a){return J.Mp(a)},
+$1:function(a){return J.Rv(a)},
 $isEH:true}}],["","",,O,{
 "^":"",
 Im:{
-"^":"V15;ee,jw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V15;ee,jw,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.ee},
 snv:function(a,b){a.ee=this.ct(a,C.kY,a.ee,b)},
-gV8:function(a){return J.UQ(a.ee,"slot")},
-gyg:function(a){var z=J.UQ(a.ee,"slot")
+gnS:function(a){return J.UQ(a.ee,"slot")},
+guh:function(a){var z=J.UQ(a.ee,"slot")
 return typeof z==="number"},
-gWk:function(a){return!!J.x(J.UQ(a.ee,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.ee,"slot"),"type"),"@Field")},
+gB3:function(a){return!!J.x(J.UQ(a.ee,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.ee,"slot"),"type"),"@Field")},
 gFF:function(a){return J.UQ(a.ee,"source")},
 gyK:function(a){return a.jw},
 syK:function(a,b){a.jw=this.ct(a,C.uO,a.jw,b)},
-rT:[function(a,b){return J.aT(J.UQ(a.ee,"source")).cv(J.WB(J.eS(J.UQ(a.ee,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cC(a))},"$1","gi0",2,0,111,32],
+yg:[function(a,b){return J.wg(J.UQ(a.ee,"source")).cv(J.WB(J.eS(J.UQ(a.ee,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cCu(a))},"$1","gi0",2,0,111,32],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-vQ:[function(a,b,c){if(b===!0)this.rT(a,100).ml(new O.qm(a)).wM(c)
+vQ:[function(a,b,c){if(b===!0)this.yg(a,100).ml(new O.qm(a)).wM(c)
 else{a.jw=this.ct(a,C.uO,a.jw,null)
 c.$0()}},"$2","gus",4,0,118,119,120],
 static:{eka:function(a){var z,y,x,w
@@ -12775,7 +12835,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12788,22 +12848,22 @@
 V15:{
 "^":"uL+Pi;",
 $isd3:true},
-cC:{
+cCu:{
 "^":"TpZ:114;a",
 $1:[function(a){var z,y,x
 z=this.a
 y=J.UQ(a,"references")
 x=Q.pT(null,null)
 x.FV(0,y)
-z.jw=J.NB(z,C.uO,z.jw,x)},"$1",null,2,0,null,155,"call"],
+z.jw=J.Q5(z,C.uO,z.jw,x)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 qm:{
 "^":"TpZ:12;a",
-$1:[function(a){J.NB(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){J.Q5(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,B,{
 "^":"",
 pR:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gJp:function(a){var z=a.tY
 if(z!=null)if(J.xC(J.zH(z),"Sentinel"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
@@ -12813,42 +12873,42 @@
 return Q.xI.prototype.gJp.call(this,a)},
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new B.tV(a)).wM(c)
+if(b===!0)J.LE(z).ml(new B.Js(a)).wM(c)
 else{z.stJ(null)
-J.Z6(z,null)
+J.vF(z,null)
 c.$0()}},"$2","gus",4,0,118,119,120],
-static:{luW:function(a){var z,y,x,w
+static:{lu:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.uRw.LX(a)
-C.uRw.XI(a)
+C.hM.LX(a)
+C.hM.XI(a)
 return a}}},
-tV:{
+Js:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
-if(a.gPE()!=null){J.DF(a,a.gPE())
-a.sTE(a.gPE())}z=this.a
+if(a.gPE()!=null){J.WI(a,a.gPE())
+a.szz(a.gPE())}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
 y.ct(z,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,Z,{
 "^":"",
 EZ:{
-"^":"V16;VQ,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V16;VQ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 ghf:function(a){return a.VQ},
 shf:function(a,b){a.VQ=this.ct(a,C.fn,a.VQ,b)},
-vV:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+vV:[function(a,b){return J.wg(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
 pA:[function(a,b){J.LE(a.VQ).wM(b)},"$1","gvC",2,0,122,120],
 static:{CoW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -12856,7 +12916,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12871,7 +12931,7 @@
 $isd3:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V17;PM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V17;PM,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
 pA:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,19,102],
@@ -12881,50 +12941,50 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.j1o.LX(a)
-C.j1o.XI(a)
+C.j1.LX(a)
+C.j1.XI(a)
 return a}}},
 V17:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{RVI:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Ag.LX(a)
-C.Ag.XI(a)
+C.aj2.LX(a)
+C.aj2.XI(a)
 return a}}},
 mO:{
-"^":"V18;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V18;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{Ch:function(a){var z,y,x,w
+static:{V6:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12938,15 +12998,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{lIg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12957,119 +13017,119 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V19;yR,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V19;yR,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
 pA:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,19,102],
-nS:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gqw",0,0,17],
+T9:[function(a){J.LE(a.yR).wM(new E.Jj(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.c3
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.mZ
 if(z!=null){z.Gv()
-a.c3=null}},
+a.mZ=null}},
 static:{TiU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.VLs.LX(a)
-C.VLs.XI(a)
+C.x4.LX(a)
+C.x4.XI(a)
 return a}}},
 V19:{
 "^":"uL+Pi;",
 $isd3:true},
-XB:{
+Jj:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 H8:{
-"^":"V20;OS,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V20;OS,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPB:function(a){return a.OS},
 sPB:function(a,b){a.OS=this.ct(a,C.yL,a.OS,b)},
 pA:[function(a,b){J.LE(a.OS).wM(b)},"$1","gvC",2,0,19,102],
-nS:[function(a){J.LE(a.OS).wM(new E.cP(a))},"$0","gqw",0,0,17],
+T9:[function(a){J.LE(a.OS).wM(new E.uN(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.c3
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.mZ
 if(z!=null){z.Gv()
-a.c3=null}},
+a.mZ=null}},
 static:{ZhX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.tO.LX(a)
-C.tO.XI(a)
+C.GII.LX(a)
+C.GII.XI(a)
 return a}}},
 V20:{
 "^":"uL+Pi;",
 $isd3:true},
-cP:{
+uN:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 WS:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{jS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.bP.LX(a)
-C.bP.XI(a)
+C.Ug.LX(a)
+C.Ug.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{cua:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.IXz.LX(a)
-C.IXz.XI(a)
+C.wK.LX(a)
+C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V21;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V21;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
@@ -13079,7 +13139,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13093,7 +13153,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V22;uv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V22;uv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
 pA:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,19,102],
@@ -13103,7 +13163,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13117,36 +13177,36 @@
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{egu:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Fw.LX(a)
-C.Fw.XI(a)
+C.js.LX(a)
+C.js.XI(a)
 return a}}},
 Zn:{
-"^":"V23;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V23;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{kf:function(a){var z,y,x,w
+static:{n0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13160,9 +13220,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V24;h1,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gHy:function(a){return a.h1},
-sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
+"^":"V24;h1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gyW:function(a){return a.h1},
+syW:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
 pA:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,19,102],
 static:{iOo:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -13170,7 +13230,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13184,7 +13244,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V25;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V25;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
@@ -13194,7 +13254,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13208,15 +13268,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{ML:function(a){var z,y,x,w
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{wZ7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13227,25 +13287,25 @@
 C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V26;wT,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V26;wT,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
 pA:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,19,102],
-O7:[function(a){J.LE(a.wT).wM(new E.mj(a))},"$0","gdH",0,0,17],
+O7:[function(a){J.LE(a.wT).wM(new E.As(a))},"$0","gyT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.c3
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gyT(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.mZ
 if(z!=null){z.Gv()
-a.c3=null}},
+a.mZ=null}},
 static:{pIf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13258,23 +13318,23 @@
 V26:{
 "^":"uL+Pi;",
 $isd3:true},
-mj:{
+As:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qM:{
-"^":"V27;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V27;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{tX:function(a){var z,y,x,w
+static:{TEI:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13288,7 +13348,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 av:{
-"^":"ZzR;CB,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"ZzR;CB,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gEQ:function(a){return a.CB},
 sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
 static:{R7:function(a){var z,y,x,w
@@ -13298,41 +13358,41 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.CB=!1
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.OkI.LX(a)
-C.OkI.XI(a)
+C.Wa.LX(a)
+C.Wa.XI(a)
 return a}}},
 ZzR:{
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V28;RX,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V28;RX,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpE:function(a){return a.RX},
 Fn:function(a){return this.gpE(a).$0()},
 spE:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
 pA:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,19,102],
-O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gdH",0,0,17],
+O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gyT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.c3
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gyT(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.mZ
 if(z!=null){z.Gv()
-a.c3=null}},
+a.mZ=null}},
 static:{z1:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13348,40 +13408,40 @@
 Cc:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,X,{
 "^":"",
 Se:{
-"^":"Y2;B1>,SF,H,Zn<,vs<,zg<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
-gtT:function(a){return J.on(this.H)},
-Pz:function(a){var z,y,x,w,v,u,t,s
+"^":"Y2;B1>,X1,H,Zn<,mj<,ki<,Vh<,ZX<,eT,yt,qu,oH,PU,aZ,Lk,Vg,ij",
+gtT:function(a){return J.tX(this.H)},
+Pz:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
 y=J.UQ(z,"threshold")
-x=this.ks
+x=this.qu
 if(x.length>0)return
-for(w=this.H,v=J.mY(J.Mx(w)),u=this.SF;v.G();){t=v.gl()
-s=J.L9(t.gAv(),w.gAv())
+for(w=this.H,v=J.mY(J.dd(w)),u=this.X1,t=u.Av;v.G();){s=v.gl()
+r=J.X9(s.gAv(),w.gAv())
 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},
+if(!(r>y||J.X9(J.tX(s).gDu(),t)>y))continue
+x.push(X.i3(z,u,s,this))}},
+aY:function(){},
+Nh:function(){return J.q8(J.dd(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
-this.ZX=G.J8(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
+this.ZX=G.J8(J.X9(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.G0(z.gAv(),this.SF.Av)
-else this.vs=G.G0(z.gAv(),d.H.gAv())
-this.zg=G.G0(z.gAv(),this.SF.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+if(J.xC(J.Iz(y.gtT(z)),C.oA)){this.Zn="Tag (category)"
+if(d==null)this.mj=G.dj(z.gAv(),this.X1.Av)
+else this.mj=G.dj(z.gAv(),d.H.gAv())
+this.ki=G.dj(z.gAv(),this.X1.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.AA))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
-if(d==null)this.vs=G.G0(z.gAv(),this.SF.Av)
-else this.vs=G.G0(z.gAv(),d.H.gAv())
-this.zg=G.G0(y.gtT(z).gDu(),this.SF.Av)}z=this.oH
-z.push(this.vs)
-z.push(this.zg)},
-static:{SJ:function(a,b,c,d){var z,y
+if(d==null)this.mj=G.dj(z.gAv(),this.X1.Av)
+else this.mj=G.dj(z.gAv(),d.H.gAv())
+this.ki=G.dj(y.gtT(z).gDu(),this.X1.Av)}z=this.oH
+z.push(this.mj)
+z.push(this.ki)},
+static:{i3:function(a,b,c,d){var z,y
 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)
@@ -13389,7 +13449,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V29;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V29;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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},
@@ -13398,16 +13458,16 @@
 sLW:function(a,b){a.WT=this.ct(a,C.Gs,a.WT,b)},
 gUo:function(a){return a.Uw},
 sUo:function(a,b){a.Uw=this.ct(a,C.Dj,a.Uw,b)},
-gP2:function(a){return a.Ik},
-sP2:function(a,b){a.Ik=this.ct(a,C.YD,a.Ik,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)},
+gXc:function(a){return a.TM},
+sXc: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
@@ -13424,14 +13484,14 @@
 if(typeof w!=="number")return H.s(w)
 z=C.CD.Sy(1000000/w,0)
 a.Ik=this.ct(a,C.YD,a.Ik,z)
-z=G.mG(J.UQ(a.oi,"timeSpan"))
+z=G.mGl(J.UQ(a.oi,"timeSpan"))
 a.ev=this.ct(a,C.zz,a.ev,z)
 z=a.XX
 v=C.YI.bu(z*100)+"%"
 a.fE=this.ct(a,C.aH,a.fE,v)
-J.aT(a.oi).N3(a.oi)
-J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,19,59],
+J.wg(a.oi).f9(a.oi)
+J.qQ(a.oi,"threshold",z)
+this.Zb(a)},"$1","gwh",2,0,19,59],
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
@@ -13439,31 +13499,31 @@
 this.Zb(a)},
 ov:[function(a,b){this.pA(a,null)},"$1","gb6",2,0,19,59],
 pA:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
+J.wg(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
 Zb:function(a){if(a.oi==null)return
 this.FG(a)},
 FG:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gqo()
+z=J.wg(a.oi).gqo()
 if(z==null)return
-try{a.Hm.G7(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
+try{a.Hm.rT(X.i3(a.oi,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.oP(w,null)
-N.QM("").r0("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
+N.QM("").OW("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
 Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
-ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+ZZ:[function(a,b){return C.Jp[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
 wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.IO(z)
+v=J.JC(z)
 if(typeof v!=="number")return v.W()
-w.lo(v-1)}catch(u){w=H.Ru(u)
+w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
-static:{"^":"B6",jD:function(a){var z,y,x,w
+N.QM("").OW("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+static:{"^":"B6",CM:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13478,7 +13538,7 @@
 a.XX=0.0002
 a.TM="uv"
 a.Xg="#tableTree"
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13494,19 +13554,19 @@
 Xy:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.oi=J.NB(z,C.vb,z.oi,a)},"$1",null,2,0,null,166,"call"],
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,166,"call"],
 $isEH:true}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{Zgg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13518,7 +13578,7 @@
 return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V30;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V30;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y,x,w
@@ -13527,7 +13587,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13541,25 +13601,25 @@
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V31;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V31;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return J.Ho(a.ow)},"$1","gX0",2,0,167,13],
+Fv:[function(a,b){return J.Ag(a.ow)},"$1","gX0",2,0,167,13],
 qW:[function(a,b){$.Kh.pZ(a.ow)
 return J.df(a.ow)},"$1","gDQ",2,0,167,13],
 PyB:[function(a,b){$.Kh.pZ(a.ow)
-return J.UR(a.ow)},"$1","gLc",2,0,167,13],
-XQ:[function(a,b){$.Kh.pZ(a.ow)
-return J.MU(a.ow)},"$1","gqF",2,0,167,13],
+return J.v7(a.ow)},"$1","gLc",2,0,167,13],
+lMu:[function(a,b){$.Kh.pZ(a.ow)
+return J.J1(a.ow)},"$1","gqF",2,0,167,13],
 Cx:[function(a,b){$.Kh.pZ(a.ow)
 return J.Fy(a.ow)},"$1","gZp",2,0,167,13],
-static:{dmb:function(a){var z,y,x,w
+static:{v8:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13573,7 +13633,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Qh:{
-"^":"V32;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V32;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y,x,w
@@ -13582,7 +13642,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13596,7 +13656,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V33;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V33;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{TSH:function(a){var z,y,x,w
@@ -13605,7 +13665,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13618,10 +13678,10 @@
 V33:{
 "^":"uL+Pi;",
 $isd3:true},
-vT:{
-"^":"a;NK,aF",
+OD:{
+"^":"a;Y0,ZF",
 eC:function(a){var z,y,x,w,v,u
-z=this.NK.Yb
+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.RE(a),x=J.mY(y.gvc(a));x.G();){w=x.gl()
@@ -13633,28 +13693,28 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 Z4:{
-"^":"V34;wd,iw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V34;wd,iw,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
 o4:[function(a,b){var z,y,x
 if(a.wd==null)return
-if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
+if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.OD(new G.eM(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.aF
-if(x==null){x=new G.yD(null,P.L5(null,null,null,null,null))
+x=z.ZF
+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.aF=x}x.Am(0,z.NK)}},"$1","ghU",2,0,19,59],
+z.ZF=x}x.Am(0,z.Y0)}},"$1","ghU",2,0,19,59],
 static:{d7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13669,14 +13729,14 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 Lr:{
-"^":"a;KK,S2",
+"^":"a;Yi,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.KK.Yb
+z=this.Yi.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=J.mY(a.gaf());y.G();){x=y.Ff
+for(y=J.mY(a.gfJ());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.Q0(a.gaf(),"Idle")
+w=J.za(a.gfJ(),"Idle")
 v=a.gvh()
 for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
@@ -13701,29 +13761,29 @@
 if(u>=y.length)return H.e(y,u)
 y=y[u].XE
 if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.X9(y[q],r)*100))}++q}}y=[]
 C.Nm.FV(y,C.Nm.ez(s,P.En()))
 y=new P.GD(y)
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V35;TO,Cn,LR,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V35;TO,pF,e6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
-Pd:[function(a){a.TO.xB().ml(new L.LX(a))},"$0","gxD",0,0,17],
+return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+Pd:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gxD",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.Cn=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.Cn
+a.pF=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.pF
 if(z!=null){z.Gv()
-a.Cn=null}},
+a.pF=null}},
 pA:[function(a,b){J.LE(a.TO).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
+Da:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
 Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,167,13],
-qW:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,167,13],
+qW:[function(a,b){return a.TO.cv("resume").ml(new L.CZ(a))},"$1","gDQ",2,0,167,13],
 static:{Qtp:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -13731,16 +13791,16 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.LR=new L.Lr(new G.Kf(z),null)
-a.f4=[]
+a.e6=new L.Lr(new G.eM(z),null)
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.hys.LX(a)
-C.hys.XI(a)
+C.Xe.LX(a)
+C.Xe.XI(a)
 return a}}},
 V35:{
 "^":"uL+Pi;",
@@ -13749,50 +13809,50 @@
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
-y=z.LR
+y=z.e6
 y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null){if(y.S2==null){w=P.L5(null,null,null,null,null)
-v=new G.yD(null,w)
+v=new G.qu(null,w)
 v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(0,y.KK)}if(z.Cn!=null)z.Cn=P.cH(P.ii(0,0,0,0,0,1),J.vc(z))},"$1",null,2,0,null,168,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(0,y.Yi)}if(z.pF!=null)z.pF=P.cH(P.ii(0,0,0,0,0,1),J.vc(z))},"$1",null,2,0,null,168,"call"],
 $isEH:true},
 CV:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-Vq:{
+CZ:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,Z,{
 "^":"",
 xh:{
 "^":"a;ue,GO",
-KW:function(a,b){var z,y,x,w,v,u,t,s
+Qp: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.RE(a),x=J.mY(y.gvc(a)),w=this.ue,v=b+1;x.G();){u=x.gl()
 t=y.t(a,u)
 s=J.x(t)
-if(!!s.$isT8){s=C.xB.U("  ",b)
+if(!!s.$isT8){s=C.yo.U("  ",b)
 w.IN+=s
 s="\""+H.d(u)+"\": {\n"
 w.IN+=s
-this.KW(t,v)
-s=C.xB.U("  ",b)
+this.Qp(t,v)
+s=C.yo.U("  ",b)
 s=w.IN+=s
-w.IN=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
+w.IN=s+"}\n"}else if(!!s.$isWO){s=C.yo.U("  ",b)
 w.IN+=s
 s="\""+H.d(u)+"\": [\n"
 w.IN+=s
 this.J7(t,v)
-s=C.xB.U("  ",b)
+s=C.yo.U("  ",b)
 s=w.IN+=s
-w.IN=s+"]\n"}else{s=C.xB.U("  ",b)
+w.IN=s+"]\n"}else{s=C.yo.U("  ",b)
 w.IN+=s
 s="\""+H.d(u)+"\": "+H.d(t)
 s=w.IN+=s
@@ -13803,24 +13863,24 @@
 z.h(0,a)
 for(y=J.mY(a),x=this.ue,w=b+1;y.G();){v=y.gl()
 u=J.x(v)
-if(!!u.$isT8){u=C.xB.U("  ",b)
+if(!!u.$isT8){u=C.yo.U("  ",b)
 u=x.IN+=u
 x.IN=u+"{\n"
-this.KW(v,w)
-u=C.xB.U("  ",b)
+this.Qp(v,w)
+u=C.yo.U("  ",b)
 u=x.IN+=u
-x.IN=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
+x.IN=u+"}\n"}else if(!!u.$isWO){u=C.yo.U("  ",b)
 u=x.IN+=u
 x.IN=u+"[\n"
 this.J7(v,w)
-u=C.xB.U("  ",b)
+u=C.yo.U("  ",b)
 u=x.IN+=u
-x.IN=u+"]\n"}else{u=C.xB.U("  ",b)
+x.IN=u+"]\n"}else{u=C.yo.U("  ",b)
 x.IN+=u
 u=x.IN+=typeof v==="string"?v:H.d(v)
 x.IN=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V36;Ly,cs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V36;Ly,cs,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -13828,21 +13888,22 @@
 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)
+y=P.fM(null,null,null,null)
 x=a.Ly
 z.IN=""
 z.KF("{\n")
-new Z.xh(z,y).KW(x,0)
+new Z.xh(z,y).Qp(x,0)
 z.KF("}\n")
 z=z.IN
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gLU",2,0,19,59],
+z=z.charCodeAt(0)==0?z:z
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gWF",2,0,19,59],
 static:{mA:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13857,15 +13918,15 @@
 $isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{bUN:function(a){var z,y,x,w
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{Le:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13877,34 +13938,34 @@
 return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V37;px,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gHt:function(a){return a.px},
-sHt:function(a,b){a.px=this.ct(a,C.EV,a.px,b)},
-vV:[function(a,b){return J.aT(a.px).cv(J.WB(J.eS(a.px),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
-pA:[function(a,b){J.LE(a.px).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.px).wM(b)},"$1","gDX",2,0,19,102],
-static:{SPd:function(a){var z,y,x,w
+"^":"V37;a1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gHt:function(a){return a.a1},
+sHt:function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},
+vV:[function(a,b){return J.wg(a.a1).cv(J.WB(J.eS(a.a1),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+pA:[function(a,b){J.LE(a.a1).wM(b)},"$1","gvC",2,0,19,102],
+Da:[function(a,b){J.y9(a.a1).wM(b)},"$1","gDX",2,0,19,102],
+static:{ec:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.fQ.LX(a)
-C.fQ.XI(a)
+C.MG.LX(a)
+C.MG.XI(a)
 return a}}},
 V37:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
-"^":"a;oc>,eT>,cK,Zm>,ks>,z3",
+"^":"a;oc>,eT>,cK,Zm>,qu>,z3",
 gB8:function(){var z,y,x
 z=this.eT
 y=z==null||J.xC(J.DA(z),"")
@@ -13932,18 +13993,18 @@
 v=J.Lp(v)}else N.QM("").js(w)}},
 X2A:function(a,b,c){return this.Y6(C.EkO,a,b,c)},
 kS:function(a){return this.X2A(a,null,null)},
-TF:function(a,b,c){return this.Y6(C.t4,a,b,c)},
-J4:function(a){return this.TF(a,null,null)},
+TF:function(a,b,c){return this.Y6(C.R5,a,b,c)},
+Ny:function(a){return this.TF(a,null,null)},
 DH:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.DH(a,null,null)},
-r0:function(a,b,c){return this.Y6(C.nT,a,b,c)},
-j2:function(a){return this.r0(a,null,null)},
+OW:function(a,b,c){return this.Y6(C.nT,a,b,c)},
+j2:function(a){return this.OW(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.cd,a,b,c)},
 YX:function(a){return this.WB(a,null,null)},
 qX:function(){if($.RL||this.eT==null){var z=this.z3
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.z3=z}z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").qX()},
+return H.VM(new P.rk(z),[H.u3(z,0)])}else return N.QM("").qX()},
 js:function(a){var z=this.z3
 if(z!=null){if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)}},
@@ -13955,11 +14016,11 @@
 "^":"TpZ:76;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(C.yo.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
+y=C.yo.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.TJ)
+else{x=N.QM(C.yo.Nj(z,0,y))
+z=C.yo.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
 v=new N.TJ(z,x,null,w,H.VM(new P.A2(w),[null,null]),null)
 v.QL(z,x,w)
 return v},
@@ -13986,7 +14047,7 @@
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"$0","gCR",0,0,73],
 $isNg:true,
-static:{"^":"V7K,tmj,Enk,LkO,reI,kH8,hlK,MHK,Uu,wC,uxc"}},
+static:{"^":"V7K,tmj,Enk,LkO,reI,kH8,hlK,MHK,Uu,lDu,uxc"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gCR",0,0,73],
@@ -13995,14 +14056,14 @@
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e535())
+N.QM("").gSZ().yI(new F.e546())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
 z=J.UQ($.Xw(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e536())},
-e535:{
+$.Ib().MM.ml(G.vN()).ml(new F.e547())},
+e546:{
 "^":"TpZ:170;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
@@ -14011,17 +14072,17 @@
 if(z)return
 P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
 $isEH:true},
-e536:{
+e547:{
 "^":"TpZ:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
-try{A.YK()}catch(y){x=H.Ru(y)
+try{A.Ok()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["","",,N,{
 "^":"",
 qn:{
-"^":"V38;GC,OM,zv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V38;GC,OM,zv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 guc:function(a){return a.GC},
 suc:function(a,b){a.GC=this.ct(a,C.EP,a.GC,b)},
 god:function(a){return a.OM},
@@ -14032,24 +14093,24 @@
 if(a.zv!=null)return
 if(a.OM!=null){z=a.GC
 z=z!=null&&z.gcX()!=null}else z=!1
-if(z){z=a.OM.gpG().LL.t(0,a.GC.gcX())
+if(z){z=a.OM.gpG().tf.t(0,a.GC.gcX())
 z=this.ct(a,C.tf,a.zv,z)
 a.zv=z
-if(z==null){z=a.OM.gSn().LL.t(0,a.GC.gcX())
-a.zv=this.ct(a,C.tf,a.zv,z)}}if(a.zv==null&&a.OM!=null){z=a.OM.gpG().LL
+if(z==null){z=a.OM.gSn().tf.t(0,a.GC.gcX())
+a.zv=this.ct(a,C.tf,a.zv,z)}}if(a.zv==null&&a.OM!=null){z=a.OM.gpG().tf
 y=z.gUQ(z)
-z=y.gqG(y)
+z=y.gtH(y)
 a.zv=this.ct(a,C.tf,a.zv,z)}},
 Es:function(a){this.Sd(a)},
 vD:[function(a,b){var z=a.OM
-if(z!=null)z.VT().ml(new N.FQ(a))},"$1","guz",2,0,19,59],
+if(z!=null)z.VT().ml(new N.QI(a))},"$1","grV",2,0,19,59],
 pA:[function(a,b){a.OM.VT().wM(b)},"$1","gvC",2,0,19,102],
 Cd9:[function(a,b,c,d){var z,y,x
 z=J.Vs(d).dA.getAttribute("data-id")
-y=a.OM.gpG().LL.t(0,z)
+y=a.OM.gpG().tf.t(0,z)
 y=this.ct(a,C.tf,a.zv,y)
 a.zv=y
-if(y==null){y=a.OM.gSn().LL.t(0,z)
+if(y==null){y=a.OM.gSn().tf.t(0,z)
 y=this.ct(a,C.tf,a.zv,y)
 a.zv=y}x=a.GC
 if(y!=null)x.scX(z)
@@ -14061,7 +14122,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14074,16 +14135,16 @@
 V38:{
 "^":"uL+Pi;",
 $isd3:true},
-FQ:{
+QI:{
 "^":"TpZ:12;a",
 $1:[function(a){J.O8(this.a)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 I2:{
-"^":"V39;GC,on,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V39;GC,YE,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 guc:function(a){return a.GC},
 suc:function(a,b){a.GC=this.ct(a,C.EP,a.GC,b)},
-gbe:function(a){return a.on},
-sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
+gbe:function(a){return a.YE},
+sbe:function(a,b){a.YE=this.ct(a,C.kB,a.YE,b)},
 jV:function(a,b,c){var z,y
 if(b==null)return
 for(z=J.RE(b),y=0;y<J.q8(z.gbG(b));++y)if(J.xC(H.BU(J.Vm(J.UQ(z.gbG(b),y)),null,null),c))return y
@@ -14091,21 +14152,21 @@
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 this.hB(a)},
 hB:function(a){var z,y
-if(a.on==null)return
+if(a.YE==null)return
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#refreshrate")
 if(z==null)return
-J.yi(z,this.jV(a,z,a.on.gmw()!=null?J.cj(a.on.gmw()).gVs():0))
+J.yi(z,this.jV(a,z,a.YE.gmw()!=null?J.cj(a.YE.gmw()).gVs():0))
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#buffersize")
-J.yi(y,this.jV(a,y,a.on.ghM()))},
+J.yi(y,this.jV(a,y,a.YE.ghM()))},
 y3q:[function(a,b){this.hB(a)},"$1","gyZ",2,0,12,59],
-rm:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$isbs").value,null,null)
-y=a.on
+tC:[function(a,b,c,d){var z,y
+z=H.BU(H.Go(d,"$iszk").value,null,null)
+y=a.YE
 if(y==null)return
 a.GC.ZW(z,y)},"$3","gIf",6,0,105,2,106,107],
 d7:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$isbs").value,null,null)
-y=a.on
+z=H.BU(H.Go(d,"$iszk").value,null,null)
+y=a.YE
 if(y==null)return
 y.shM(z)},"$3","gTK",6,0,105,2,106,107],
 static:{rI3:function(a){var z,y,x,w
@@ -14114,7 +14175,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14128,9 +14189,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 FB:{
-"^":"V40;lB,qV,on,OM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gbe:function(a){return a.on},
-sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
+"^":"V40;Mu,aF,YE,OM,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gbe:function(a){return a.YE},
+sbe:function(a,b){a.YE=this.ct(a,C.kB,a.YE,b)},
 god:function(a){return a.OM},
 sod:function(a,b){a.OM=this.ct(a,C.rB,a.OM,b)},
 Es:function(a){var z=P.ii(0,0,0,0,0,1)
@@ -14138,23 +14199,23 @@
 Z.uL.prototype.Es.call(this,a)},
 yY:function(a){this.T1(a)},
 T1:function(a){var z,y
-if(a.qV==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
+if(a.aF==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
 if(z==null)return
-y=new G.yD(null,P.L5(null,null,null,null,null))
+y=new G.qu(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"LineChart"),[z])
-a.qV=y}if(a.on==null)return
-this.qt(a)
-a.qV.Am(0,a.lB)},
-qt:function(a){var z,y,x,w,v,u,t
-z=a.lB.Yb
+a.aF=y}if(a.YE==null)return
+this.Ta(a)
+a.aF.Am(0,a.Mu)},
+Ta:function(a){var z,y,x,w,v,u,t
+z=a.Mu.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-for(y=0;y<a.on.gJk().XG.length;++y){x=a.on.gJk().XG
+for(y=0;y<a.YE.gJk().xN.length;++y){x=a.YE.gJk().xN
 if(y>=x.length)return H.e(x,y)
 w=x[y]
 x=w.gFl()
 v=J.Vm(w)
 u=[]
-C.Nm.FV(u,C.Nm.ez([x.gGt(),x.gS6(),x.gBM()],P.En()))
+C.Nm.FV(u,C.Nm.ez([x.gX3(),x.gcO(),x.gIv()],P.En()))
 t=new P.GD(u)
 t.$builtinTypeInfo=[null]
 x=[]
@@ -14163,10 +14224,10 @@
 x.$builtinTypeInfo=[null]
 z.V7("addRow",[x])}},
 y3q:[function(a,b){var z
-if(!J.xC(b,a.on)){z=a.lB.Yb
+if(!J.xC(b,a.YE)){z=a.Mu.Yb
 z.V7("removeColumns",[0,z.nQ("getNumberOfColumns")])
 z.V7("addColumn",["timeofday","time"])
-z.V7("addColumn",["number",J.DA(a.on)])}},"$1","gyZ",2,0,12,59],
+z.V7("addColumn",["number",J.DA(a.YE)])}},"$1","gyZ",2,0,12,59],
 static:{kUw:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -14174,23 +14235,23 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.lB=new G.Kf(z)
-a.f4=[]
+a.Mu=new G.eM(z)
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.Mw.LX(a)
-C.Mw.XI(a)
+C.h1.LX(a)
+C.h1.XI(a)
 return a}}},
 V40:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V41;i4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V41;i4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y,x,w
@@ -14200,21 +14261,21 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.i4=!0
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.aV.LX(a)
-C.aV.XI(a)
+C.kD.LX(a)
+C.kD.XI(a)
 return a}}},
 V41:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V42;KU,V4,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V42;KU,V4,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gwp:function(a){return a.V4},
@@ -14230,7 +14291,7 @@
 a.KU="#"
 a.V4="---"
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14244,12 +14305,12 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V43;KU,V4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V43;KU,V4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gwp:function(a){return a.V4},
 swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{JR:function(a){var z,y,x,w
+static:{P5Z:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -14257,7 +14318,7 @@
 w=P.Fl(null,null)
 a.KU="#"
 a.V4="---"
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14271,29 +14332,29 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V44;rU,SB,Hq,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V44;rU,SB,z2,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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.Hq},
-sph:function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},
-VV:[function(a,b,c,d){var z=a.SB
+gph:function(a){return a.z2},
+sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
+Kp:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,116,2,106,107],
-uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
-static:{ZC:function(a){var z,y,x,w
+if(a.rU!=null)this.LY(a,this.gec(a))},"$3","gyr",6,0,116,2,106,107],
+uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gec",0,0,17],
+static:{wC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.SB=!1
-a.Hq="Refresh"
-a.f4=[]
+a.z2="Refresh"
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14307,14 +14368,14 @@
 "^":"uL+Pi;",
 $isd3:true},
 ye:{
-"^":"uL;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"uL;tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{mBQ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14325,17 +14386,17 @@
 C.pl.XI(a)
 return a}}},
 G1:{
-"^":"V45;Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V45;Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{Br:function(a){var z,y,x,w
+static:{PU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14349,24 +14410,24 @@
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V46;Jo,iy,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V46;Jo,iy,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","grV",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
 su6:function(a,b){},
-static:{YtF:function(a){var z,y,x,w
+static:{zf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14380,19 +14441,19 @@
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V47;VW,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V47;VW,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gHt:function(a){return a.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,x,w
+static:{Qje:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14406,7 +14467,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V48;Au,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V48;Au,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -14418,7 +14479,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14432,16 +14493,16 @@
 "^":"uL+Pi;",
 $isd3:true},
 NK:{
-"^":"V49;rv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V49;rv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
-static:{Xii:function(a){var z,y,x,w
+static:{kR:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14455,27 +14516,27 @@
 "^":"uL+Pi;",
 $isd3:true},
 Zx:{
-"^":"V50;rv,Wx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V50;rv,Wx,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
-gBk:function(a){return a.Wx},
-sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-qW:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,167,13],
-PyB:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.UR(J.aT(a.Wx))},"$1","gLc",2,0,167,13],
-XQ:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,167,13],
-Cx:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.Fy(J.aT(a.Wx))},"$1","gZp",2,0,167,13],
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,171,2,106,107],
+gMl:function(a){return a.Wx},
+sMl:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
+qW:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
+return J.df(J.wg(a.Wx))},"$1","gDQ",2,0,167,13],
+PyB:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
+return J.v7(J.wg(a.Wx))},"$1","gLc",2,0,167,13],
+lMu:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
+return J.J1(J.wg(a.Wx))},"$1","gqF",2,0,167,13],
+Cx:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
+return J.Fy(J.wg(a.Wx))},"$1","gZp",2,0,167,13],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gRN",6,0,171,2,106,107],
 static:{yno:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14490,19 +14551,19 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 qV:{
-"^":"V51;dV,qB,GI,wA,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gWA:function(a){return a.dV},
-sWA:function(a,b){a.dV=this.ct(a,C.td,a.dV,b)},
+"^":"V51;xt,qB,GI,wA,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gWA:function(a){return a.xt},
+sWA:function(a,b){a.xt=this.ct(a,C.td,a.xt,b)},
 gIi:function(a){return a.qB},
 sIi:function(a,b){a.qB=this.ct(a,C.XM,a.qB,b)},
 gyK:function(a){return a.GI},
 syK:function(a,b){a.GI=this.ct(a,C.uO,a.GI,b)},
 gCF:function(a){return a.wA},
 sCF:function(a,b){a.wA=this.ct(a,C.tg,a.wA,b)},
-zs:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/retained")).ml(new L.rQ(a))},"$1","ghN",2,0,111,113],
-Cc:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/retaining_path?limit="+H.d(b))).ml(new L.ky(a))},"$1","gCI",2,0,111,32],
-rT:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/inbound_references?limit="+H.d(b))).ml(new L.WZ(a))},"$1","gi0",2,0,111,32],
-pA:[function(a,b){J.LE(a.dV).wM(b)},"$1","gvC",2,0,122,120],
+Cq:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/retained")).ml(new L.uW(a))},"$1","ghN",2,0,111,113],
+Cc:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/retaining_path?limit="+H.d(b))).ml(new L.vT(a))},"$1","gCI",2,0,111,32],
+yg:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/inbound_references?limit="+H.d(b))).ml(new L.C1y(a))},"$1","gi0",2,0,111,32],
+pA:[function(a,b){J.LE(a.xt).wM(b)},"$1","gvC",2,0,122,120],
 static:{P5f:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -14510,60 +14571,84 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.wA=null
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.br.LX(a)
-C.br.XI(a)
+C.aD.LX(a)
+C.aD.XI(a)
 return a}}},
 V51:{
 "^":"uL+Pi;",
 $isd3:true},
-rQ:{
-"^":"TpZ:114;a",
+uW:{
+"^":"TpZ:115;a",
 $1:[function(a){var z,y
 z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.wA=J.NB(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
+y=H.BU(a.gPE(),null,null)
+z.wA=J.Q5(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-ky:{
+vT:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.qB=J.NB(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
+z.qB=J.Q5(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-WZ:{
+C1y:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.GI=J.NB(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["","",,V,{
+z.GI=J.Q5(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
+$isEH:true}}],["","",,L,{
+"^":"",
+NT:{
+"^":"V52;R6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gWA:function(a){return a.R6},
+sWA:function(a,b){a.R6=this.ct(a,C.td,a.R6,b)},
+static:{di:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.Fl(null,null)
+w=P.Fl(null,null)
+a.Iy=[]
+a.OD=!1
+a.kK=!1
+a.ZM=z
+a.ZQ=y
+a.qJ=x
+a.wy=w
+C.LQi.LX(a)
+C.LQi.XI(a)
+return a}}},
+V52:{
+"^":"uL+Pi;",
+$isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V52;qC,i6=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gz2:function(a){return a.qC},
-sz2:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
+"^":"V53;qC,i6=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gd0:function(a){return a.qC},
+sd0:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 Es:function(a){var z,y,x
 Z.uL.prototype.Es.call(this,a)
-if(a.qC===!0){z=new G.mL(H.VM([],[G.OS]),null,new G.ng("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
+if(a.qC===!0){z=new G.mL(H.VM([],[G.MQ]),null,new G.OR("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
 z.E0(a)
-a.i6=z}else{z=H.VM([],[G.OS])
+a.i6=z}else{z=H.VM([],[G.MQ])
 y=Q.pT(null,D.Mk)
-x=new G.nD(new G.V3("targetManager"),Q.pT(null,null),null,null,null,null)
-x.lK()
-y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
+x=new G.uh(new G.V3("targetManager"),Q.pT(null,null),null,null,null,null)
+x.vs()
+y=new G.mL(z,null,new G.OR("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
-static:{JT8:function(a){var z,y,x,w
+static:{Lu:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.qC=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14573,49 +14658,49 @@
 C.YpE.LX(a)
 C.YpE.XI(a)
 return a}}},
-V52:{
+V53:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"Xfs;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Xfs;tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gi6:function(a){return $.Kh},
-guc:function(a){return this.gi6(a).fN},
-gl6:function(a){return J.D8(this.guc(a))},
+guc:function(a){return this.gi6(a).Ef},
+gl6:function(a){return J.H3(this.guc(a))},
 Es:function(a){A.zs.prototype.Es.call(this,a)
 this.U2(a)},
-wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
-Lx:function(a){A.zs.prototype.Lx.call(this,a)
-this.yM(a)},
+aC:function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},
+dQ:function(a){A.zs.prototype.dQ.call(this,a)
+this.mv(a)},
 I9:function(a){A.zs.prototype.I9.call(this,a)},
 gMT:function(a){return a.tB},
 sMT:function(a,b){a.tB=this.ct(a,C.O9,a.tB,b)},
 yY:function(a){},
 JnB:[function(a,b){if(a.tB!=null)this.U2(a)
-else this.yM(a)},"$1","grX",2,0,19,59],
+else this.mv(a)},"$1","gqA",2,0,19,59],
 U2:function(a){var z
 if(a.tB==null)return
-z=a.Qf
+z=a.IO
 if(z!=null)z.Gv()
-a.Qf=P.cH(a.tB,this.gPs(a))},
-yM:function(a){var z=a.Qf
+a.IO=P.cH(a.tB,this.gPs(a))},
+mv:function(a){var z=a.IO
 if(z!=null)z.Gv()
-a.Qf=null},
+a.IO=null},
 Yl:[function(a){var z
 this.yY(a)
 z=a.tB
-if(z==null){this.yM(a)
-return}a.Qf=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
+if(z==null){this.mv(a)
+return}a.IO=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
 wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gCK",6,0,171,87,106,107],
-Gxe:[function(a,b){this.gi6(a).Z6
+XD:[function(a,b){this.gi6(a).Z6
 return"#"+H.d(b)},"$1","gGs",2,0,172,173],
-Qb:[function(a,b){return G.mG(b)},"$1","gSs",2,0,174,175],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
-YH:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,20],
+hA:[function(a,b){return G.mGl(b)},"$1","gSs",2,0,174,175],
+Ze:[function(a,b){return G.XzS(b)},"$1","gbJ",2,0,14,15],
+Zl:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,20],
 Rms:[function(a,b,c){var z,y,x,w
 z=[]
-z.push(C.xB.j("'",0))
-for(y=J.GG(b),y=y.gA(y);y.G();){x=y.Ff
+z.push(C.yo.j("'",0))
+for(y=J.OX(b),y=y.gA(y);y.G();){x=y.lo
 w=J.x(x)
 if(w.n(x,"\n".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\n"))
 else if(w.n(x,"\r".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\r"))
@@ -14626,25 +14711,25 @@
 else if(w.n(x,"$".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\$"))
 else if(w.n(x,"\\".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\\\"))
 else if(w.n(x,"'".charCodeAt(0)))C.Nm.FV(z,new J.IA("'"))
-else if(w.C(x,32))C.Nm.FV(z,new J.IA("\\u"+H.d(x)))
+else if(w.C(x,32))C.Nm.FV(z,new J.IA("\\u"+C.yo.LL(w.WZ(x,16),4,"0")))
 else z.push(x)}if(c===!0)C.Nm.FV(z,new J.IA("..."))
-else z.push(C.xB.j("'",0))
-return P.HM(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,176,69,20,177],
-static:{ew:function(a){var z,y,x,w
+else z.push(C.yo.j("'",0))
+return P.nB(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,176,69,20,177],
+static:{LD:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.mk.LX(a)
-C.mk.XI(a)
+C.Pfz.LX(a)
+C.Pfz.XI(a)
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
@@ -14662,14 +14747,14 @@
 if(z==null){z=this.gcm(a)
 z=P.bK(this.gym(a),z,!0,null)
 a.Vg=z}z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])},
-w37:[function(a){},"$0","gcm",0,0,17],
+return H.VM(new P.rk(z),[H.u3(z,0)])},
+Tr:[function(a){},"$0","gcm",0,0,17],
 dt:[function(a){a.Vg=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
-z=a.fn
-a.fn=null
+z=a.ij
+a.ij=null
 if(this.gnz(a)&&z!=null){y=a.Vg
-x=H.VM(new P.Yp(z),[T.yj])
+x=H.VM(new P.Ui(z),[T.yj])
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(x)
 return!0}return!1},"$0","gDx",0,0,131],
@@ -14680,8 +14765,8 @@
 return z},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},
+if(a.ij==null){a.ij=[]
+P.rb(this.gDx(a))}a.ij.push(b)},
 $isd3:true}}],["","",,T,{
 "^":"",
 yj:{
@@ -14692,7 +14777,7 @@
 bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isqI:true}}],["","",,O,{
 "^":"",
-X0:function(){var z,y,x,w,v,u,t,s,r,q
+N0:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.Oo==null)return
 $.Td=!0
@@ -14708,27 +14793,27 @@
 s=J.RE(t)
 if(s.gnz(t)){if(s.HC(t)){if(w)y.push([u,t])
 v=!0}$.Oo.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.S5()
+if(w&&v){w=$.aT()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.Ff
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(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))+".")}}$.Nc=$.Oo.length
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.dL=$.Oo.length
 $.Td=!1},
 Ht:function(){var z={}
 z.a=!1
-z=new O.YC(z)
-return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
-YC:{
+z=new O.Nq(z)
+return new P.yQ(null,null,null,null,new O.zI(z),new O.bF(z),null,null,null,null,null,null)},
+Nq:{
 "^":"TpZ:178;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.N0(z))},
+a.RK(b,new O.jB(z))},
 $isEH:true},
-N0:{
+jB:{
 "^":"TpZ:76;a",
 $0:[function(){this.a.a=!1
-O.X0()},"$0",null,0,0,null,"call"],
+O.N0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
 "^":"TpZ:29;b",
@@ -14740,18 +14825,18 @@
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-hw:{
+bF:{
 "^":"TpZ:179;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
+return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
-iu:{
+f6:{
 "^":"TpZ:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
 return this.w3.$1(a)},"$1",null,2,0,null,180,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
-B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+LR:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
 y=J.WB(J.bI(c,b),1)
 x=Array(z)
@@ -14787,7 +14872,7 @@
 m=P.J(p+1,m+1)
 if(t>=o)return H.e(n,t)
 n[t]=m}}return x},
-kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
@@ -14821,8 +14906,8 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.wb(),[H.u3(u,0)]),0)]).br(0)},
-rN:function(a,b,c){var z,y,x
+x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.TNQ(),[H.u3(u,0)]),0)]).br(0)},
+uf:function(a,b,c){var z,y,x
 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},
@@ -14840,7 +14925,7 @@
 z=J.Wx(c)
 y=P.J(z.W(c,b),f-e)
 x=J.x(b)
-w=x.n(b,0)&&e===0?G.rN(a,d,y):0
+w=x.n(b,0)&&e===0?G.uf(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
@@ -14849,53 +14934,52 @@
 z=J.Wx(c)
 if(J.xC(z.W(c,b),0)&&f-e===0)return C.xD
 if(J.xC(b,c)){u=[]
-z=new P.Yp(u)
+z=new P.Ui(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,b,0)
 for(;e<f;e=s){z=t.kJ
 s=e+1
 if(e>>>0!==e||e>=d.length)return H.e(d,e)
-J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
+C.Nm.h(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
 u=[]
-x=new P.Yp(u)
+x=new P.Ui(u)
 x.$builtinTypeInfo=[null]
-return[new G.Zq(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
+return[new G.Zq(a,x,u,b,z)]}r=G.Mw(G.LR(a,b,c,d,e,f))
 q=[]
 q.$builtinTypeInfo=[G.Zq]
 for(p=e,o=b,t=null,n=0;n<r.length;++n)switch(r[n]){case 0:if(t!=null){q.push(t)
 t=null}o=J.WB(o,1);++p
 break
 case 1:if(t==null){u=[]
-z=new P.Yp(u)
+z=new P.Ui(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
 o=J.WB(o,1)
 z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
+C.Nm.h(z,d[p]);++p
 break
 case 2:if(t==null){u=[]
-z=new P.Yp(u)
+z=new P.Ui(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
 o=J.WB(o,1)
 break
 case 3:if(t==null){u=[]
-z=new P.Yp(u)
+z=new P.Ui(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,o,0)}z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
+C.Nm.h(z,d[p]);++p
 break}if(t!=null)q.push(t)
 return q},
 m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=J.Nd(b.gkJ())
+x=C.Nm.br(b.gkJ())
 w=b.gNg()
-if(w==null)w=0
-v=new P.Yp(x)
+v=new P.Ui(x)
 v.$builtinTypeInfo=[null]
 u=new G.Zq(y,v,x,z,w)
 for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
@@ -14918,26 +15002,25 @@
 else{o=q.kJ
 if(J.u6(u.Ft,q.Ft)){z=u.HD
 z=z.Yc(z,0,J.bI(q.Ft,u.Ft))
-o.toString
-if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
+if(!!o.fixed$length)H.vh(P.f("insertAll"))
 H.IC(o,0,z)}if(J.xZ(J.WB(u.Ft,u.HD.G4.length),J.WB(q.Ft,q.wF))){z=u.HD
-J.bj(o,z.Yc(z,J.bI(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
+C.Nm.FV(o,z.Yc(z,J.bI(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
 u.HD=q.HD
 if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
-t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
+t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.aP(a,r,u);++r
 n=J.bI(u.wF,u.HD.G4.length)
 q.Ft=J.WB(q.Ft,n)
 if(typeof n!=="number")return H.s(n)
 s+=n
 t=!0}else t=!1}if(!t)a.push(u)},
-hs:function(a,b){var z,y
+VT:function(a,b){var z,y
 z=H.VM([],[G.Zq])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.Ff)
+for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(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.u3(y,0)]),x=a.XG;y.G();){w=y.Ff
+for(y=G.VT(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.xN;y.G();){w=y.lo
 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]
@@ -14958,15 +15041,12 @@
 if(z)return!1
 if(!J.xC(this.wF,this.HD.G4.length))return!0
 return J.u6(a,J.WB(this.Ft,this.wF))},
-bu:[function(a){var z,y
-z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
-y=this.HD
-return z+y.bu(y)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
+bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "+H.d(this.HD)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
 $isZq: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=new P.Ui(d)
 z.$builtinTypeInfo=[null]
 return new G.Zq(a,z,d,b,c)}}}}],["","",,K,{
 "^":"",
@@ -14975,17 +15055,17 @@
 vly:{
 "^":"a;"}}],["","",,F,{
 "^":"",
-kM:[function(){return O.X0()},"$0","Jy",0,0,17],
+kM:[function(){return O.N0()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,rJ:XY%,xt:cU%",
+"^":"a;R9:ro%,rJ:XY%,me:iS%",
 gqh:function(a){var z
 if(this.gR9(a)==null){z=this.gFW(a)
 this.sR9(a,P.bK(this.gEp(a),z,!0,null))}z=this.gR9(a)
 z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])},
+return H.VM(new P.rk(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
 if(this.gR9(a)!=null){z=this.gR9(a)
 y=z.iE
@@ -14995,35 +15075,35 @@
 z=$.Oo
 if(z==null){z=H.VM([],[F.d3])
 $.Oo=z}z.push(a)
-$.Nc=$.Nc+1
+$.dL=$.dL+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.bfK,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.Ff)
-w=$.cp().xV.II.t(0,x)
-if(w==null)H.vh(O.Fm("getter \""+H.d(x)+"\" in "+this.bu(a)))
+for(z=this.gbx(a),z=$.II().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.fo,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.lo)
+w=$.cp().JE.E4.t(0,x)
+if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+H.d(a)))
 y.u(0,x,w.$1(a))}this.srJ(a,y)},"$0","gFW",0,0,17],
-dJ:[function(a){if(this.grJ(a)!=null)this.srJ(a,null)},"$0","gEp",0,0,17],
+dJx:[function(a){if(this.grJ(a)!=null)this.srJ(a,null)},"$0","gEp",0,0,17],
 HC:function(a){var z,y
 z={}
 if(this.grJ(a)==null||!this.gnz(a))return!1
-z.a=this.gxt(a)
-this.sxt(a,null)
-this.grJ(a).aN(0,new F.D9(z,a))
+z.a=this.gme(a)
+this.sme(a,null)
+this.grJ(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])
+z=H.VM(new P.Ui(z.a),[T.yj])
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(z)
 return!0},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(this.gxt(a)==null)this.sxt(a,[])
-this.gxt(a).push(b)},
+if(this.gme(a)==null)this.sme(a,[])
+this.gme(a).push(b)},
 $isd3:true},
-D9:{
+X6:{
 "^":"TpZ:81;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
-y=$.cp().Gp(z,a)
+y=$.cp().jD(z,a)
 if(!J.xC(b,y)){x=this.a
 w=x.a
 if(w==null){v=[]
@@ -15040,14 +15120,14 @@
 bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Xq)+">"},"$0","gCR",0,0,73]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"uFU;lr@,Mu,XG,Vg,fn",
-gXF:function(){var z=this.Mu
-if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
-this.Mu=z}z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])},
-gB:function(a){return this.XG.length},
+"^":"uFU;lr@,fN,xN,Vg,ij",
+gXF:function(){var z=this.fN
+if(z==null){z=P.bK(new Q.BjH(this),null,!0,null)
+this.fN=z}z.toString
+return H.VM(new P.rk(z),[H.u3(z,0)])},
+gB:function(a){return this.xN.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.XG
+z=this.xN
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -15055,10 +15135,10 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.Mu
+x=this.fN
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){x=new H.wb()
+if(x)if(b<y){x=new H.TNQ()
 x.$builtinTypeInfo=[H.u3(z,0)]
 if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
 if(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
@@ -15068,24 +15148,24 @@
 if(y<0)H.vh(P.N(y))
 if(b>y)H.vh(P.TE(b,0,y))
 x=w.br(0)
-w=new P.Yp(x)
+w=new P.Ui(x)
 w.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,w,x,b,0))}else{v=[]
-x=new P.Yp(v)
+x=new P.Ui(v)
 x.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.XG
+t:function(a,b){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.XG
+z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.Mu
+x=this.fN
 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=new P.Ui(x)
 w.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
@@ -15095,42 +15175,42 @@
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.Mu
+z=this.fN
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.XG
-x=H.VM(new H.wb(),[H.u3(z,0)])
-H.xF(z,b,y)
-this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.XG,b,c)},
+if(z&&y>0){z=this.xN
+x=H.VM(new H.TNQ(),[H.u3(z,0)])
+H.K0(z,b,y)
+this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.xN,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.XG
+z=this.xN
 y=z.length
 this.Xy(y,y+1)
-x=this.Mu
+x=this.fN
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.E2(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.XG
+z=this.xN
 y=z.length
 C.Nm.FV(z,b)
 this.Xy(y,z.length)
 x=z.length-y
-z=this.Mu
+z=this.fN
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&x>0)this.E2(G.K6(this,y,x,null))},
 Rz:function(a,b){var z,y
-for(z=this.XG,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
+for(z=this.xN,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
 return!0}return!1},
 oq:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.XG.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.xN.length)H.vh(P.TE(b,0,this.gB(this)))
 y=!(c<b)
-if(!y||c>this.XG.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.xN.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.XG
+w=this.xN
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -15138,10 +15218,10 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.Mu
+u=this.fN
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
-if(u&&x>0){u=new H.wb()
+if(u&&x>0){u=new H.TNQ()
 u.$builtinTypeInfo=[H.u3(w,0)]
 if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
 if(!y||c>w.length)H.vh(P.TE(c,b,w.length))
@@ -15151,28 +15231,28 @@
 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=new P.Ui(z)
 y.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,y,z,b,0))}C.Nm.oq(w,b,c)},
 UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
+if(b<0||b>this.xN.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.XG
+z=this.xN
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
 H.h8(z,b,c)
 this.Xy(x,z.length)
-z=this.Mu
+z=this.fN
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&y>0)this.E2(G.K6(this,b,y,null))},
-xe:function(a,b,c){var z,y,x
-if(b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.XG
+aP:function(a,b,c){var z,y,x
+if(b>this.xN.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.xN
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
@@ -15180,14 +15260,14 @@
 H.qG(z,b+1,y,this,b)
 y=z.length
 this.Xy(y-1,y)
-y=this.Mu
+y=this.fN
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.E2(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
 E2:function(a){var z,y
-z=this.Mu
+z=this.fN
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
@@ -15204,16 +15284,16 @@
 if(z==null)return!1
 y=G.Qi(this,z)
 this.lr=null
-z=this.Mu
+z=this.fN
 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.Zq])
+if(x&&y.length!==0){x=H.VM(new P.Ui(y),[G.Zq])
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(x)
 return!0}return!1},"$0","gL6",0,0,131],
 $iswn:true,
 static:{pT:function(a,b){var z=H.VM([],[b])
-return H.VM(new Q.wn(null,null,z,null,null),[b])},Oi:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5p:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 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)
@@ -15246,38 +15326,38 @@
 uFU:{
 "^":"ark+Pi;",
 $isd3:true},
-xb:{
+BjH:{
 "^":"TpZ:76;a",
-$0:function(){this.a.Mu=null},
+$0:function(){this.a.fN=null},
 $isEH:true}}],["","",,V,{
 "^":"",
 ya:{
-"^":"yj;nl>,jL,zZ,aC,w5",
+"^":"yj;nl>,jL,zZ,Lv,w5",
 bu:[function(a){var z
-if(this.aC)z="insert"
+if(this.Lv)z="insert"
 else z=this.w5?"remove":"set"
 return"#<MapChangeRecord "+z+" "+H.d(this.nl)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isya:true},
 qC:{
-"^":"Pi;LL,Vg,fn",
-gvc:function(a){var z=this.LL
+"^":"Pi;tf,Vg,ij",
+gvc:function(a){var z=this.tf
 return z.gvc(z)},
-gUQ:function(a){var z=this.LL
+gUQ:function(a){var z=this.tf
 return z.gUQ(z)},
-gB:function(a){var z=this.LL
+gB:function(a){var z=this.tf
 return z.gB(z)},
-gl0:function(a){var z=this.LL
+gl0:function(a){var z=this.tf
 return z.gB(z)===0},
-gor:function(a){var z=this.LL
+gor:function(a){var z=this.tf
 return z.gB(z)!==0},
-NZ:function(a,b){return this.LL.NZ(0,b)},
-t:function(a,b){return this.LL.t(0,b)},
+NZ:function(a,b){return this.tf.NZ(0,b)},
+t:function(a,b){return this.tf.t(0,b)},
 u:function(a,b,c){var z,y,x,w
 z=this.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.LL.u(0,b,c)
-return}z=this.LL
+if(!z){this.tf.u(0,b,c)
+return}z=this.tf
 x=z.gB(z)
 w=z.t(0,b)
 z.u(0,b,c)
@@ -15287,7 +15367,7 @@
 this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))}},
 FV:function(a,b){J.Me(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
-z=this.LL
+z=this.tf
 y=z.gB(z)
 x=z.Rz(0,b)
 w=this.Vg
@@ -15297,7 +15377,7 @@
 F.Wi(this,C.Wn,y,z.gB(z))
 this.ld()}return x},
 V1:function(a){var z,y,x,w
-z=this.LL
+z=this.tf
 y=z.gB(z)
 x=this.Vg
 if(x!=null){w=x.iE
@@ -15305,7 +15385,7 @@
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)
 this.ld()}z.V1(0)},
-aN:function(a,b){return this.LL.aN(0,b)},
+aN:function(a,b){return this.tf.aN(0,b)},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 ld:function(){this.nq(this,H.VM(new T.qI(this,C.SY,null,null),[null]))
 this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))},
@@ -15329,30 +15409,30 @@
 $isEH:true}}],["","",,Y,{
 "^":"",
 cU:{
-"^":"Ap;Os,he,mD,Wv,XS",
+"^":"Ap;nA,he,mD,TW,cl",
 bl:function(a){return this.he.$1(a)},
-xq:function(a){return this.Wv.$1(a)},
+kk:function(a){return this.TW.$1(a)},
 TR:function(a,b){var z
-this.Wv=b
-z=this.bl(J.mu(this.Os,this.gYZ()))
-this.XS=z
+this.TW=b
+z=this.bl(J.mu(this.nA,this.giv()))
+this.cl=z
 return z},
-pN:[function(a){var z=this.bl(a)
-if(J.xC(z,this.XS))return
-this.XS=z
-return this.xq(z)},"$1","gYZ",2,0,12,60],
-xO:function(a){var z=this.Os
+ab:[function(a){var z=this.bl(a)
+if(J.xC(z,this.cl))return
+this.cl=z
+return this.kk(z)},"$1","giv",2,0,12,60],
+xO:function(a){var z=this.nA
 if(z!=null)J.yd(z)
-this.Os=null
+this.nA=null
 this.he=null
 this.mD=null
-this.Wv=null
-this.XS=null},
-gP:function(a){var z=this.bl(J.Vm(this.Os))
-this.XS=z
+this.TW=null
+this.cl=null},
+gP:function(a){var z=this.bl(J.Vm(this.nA))
+this.cl=z
 return z},
-sP:function(a,b){J.Fc(this.Os,b)},
-fR:function(){return this.Os.fR()}}}],["","",,L,{
+sP:function(a,b){J.Fc(this.nA,b)},
+fR:function(){return this.nA.fR()}}}],["","",,L,{
 "^":"",
 yfW:function(a,b){var z,y,x,w,v
 if(a==null)return
@@ -15360,59 +15440,59 @@
 if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{z=b
 if(typeof z==="string")return J.UQ(a,b)
 else if(!!J.x(b).$isIN){z=a
-y=H.RB(z,"$isHX",[P.qU,null],"$asHX")
+y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z)return J.UQ(a,$.vu().xV.af.t(0,b))
+if(z)return J.UQ(a,$.vu().JE.fJ.t(0,b))
 try{z=a
 y=b
-x=$.cp().xV.II.t(0,y)
-if(x==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+H.d(z)))
+x=$.cp().JE.E4.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.bB(a)
-v=$.mX().NW(z,C.OV)
-if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.YLt()
+v=$.II().NW(z,C.OV)
+if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.Nd()
 if(z.mL(C.EkO))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
-EX:function(a,b,c){var z,y,x
+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)
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.qQ(a,b,c)
 return!0}}else if(!!J.x(b).$isIN){z=a
-y=H.RB(z,"$isHX",[P.qU,null],"$asHX")
+y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z){J.kW(a,$.vu().xV.af.t(0,b),c)
-return!0}try{$.cp().Cq(a,b,c)
+if(z){J.qQ(a,$.vu().JE.fJ.t(0,b),c)
+return!0}try{$.cp().Q1(a,b,c)
 return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.bB(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YLt()
+if(!$.II().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
 if(z.mL(C.EkO))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 WR:{
-"^":"ARh;HS,Lq,IE,zo,dR,vS,KZ",
+"^":"ARh;HS,Lq,IE,wN,dR,z7,KZ",
 gIi:function(a){return this.HS},
 sP:function(a,b){var z=this.HS
 if(z!=null)z.rL(this.Lq,b)},
 gDJ:function(){return 2},
 TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
-Ej:function(a){this.IE=L.KJ(this,this.Lq)
+Ej:function(a){this.IE=L.SE(this,this.Lq)
 this.CG(!0)},
-U9:function(){this.vS=null
+U9:function(){this.z7=null
 this.HS=null
 this.Lq=null},
 VC:function(a){this.HS.I5(this.Lq,a)},
 CG:function(a){var z,y
-z=this.vS
+z=this.z7
 y=this.HS.WK(this.Lq)
-this.vS=y
+this.z7=y
 if(a||J.xC(y,z))return!1
-this.dC(this.vS,z,this)
+this.dC(this.z7,z,this)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Zl:{
+Tv:{
 "^":"a;T7",
 gB:function(a){return this.T7.length},
 gl0:function(a){return this.T7.length===0},
@@ -15420,17 +15500,18 @@
 bu:[function(a){var z,y,x,w,v,u
 if(!this.gPu())return"<invalid path>"
 z=P.p9("")
-for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.Ff
+for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.lo
 v=J.x(w)
 if(!!v.$isIN){if(!x)z.IN+="."
-u=$.vu().xV.af.t(0,w)
+u=$.vu().JE.fJ.t(0,w)
 z.IN+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
-z.IN+=v}else{v="[\""+J.JA(v.bu(w),"\"","\\\"")+"\"]"
-z.IN+=v}}return z.IN},"$0","gCR",0,0,73],
+z.IN+=v}else{v="[\""+H.d(J.JA(v.bu(w),"\"","\\\""))+"\"]"
+z.IN+=v}}y=z.IN
+return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isZl)return!1
+if(!J.x(b).$isTv)return!1
 if(this.gPu()!==b.gPu())return!1
 z=this.T7
 y=z.length
@@ -15451,7 +15532,7 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 WK:function(a){var z,y
 if(!this.gPu())return
-for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(a==null)return
 a=L.yfW(a,y)}return a},
 rL:function(a,b){var z,y,x
@@ -15461,7 +15542,7 @@
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
 a=L.yfW(a,z[x])}if(y>=z.length)return H.e(z,y)
-return L.EX(a,z[y],b)},
+return L.iu(a,z[y],b)},
 I5:function(a,b){var z,y,x,w
 if(!this.gPu()||this.T7.length===0)return
 z=this.T7
@@ -15472,42 +15553,42 @@
 w=x+1
 if(x>=z.length)return H.e(z,x)
 a=L.yfW(a,z[x])}},
-$isZl:true,
+$isTv:true,
 static:{hk:function(a){var z,y,x,w,v,u,t
 z=J.x(a)
-if(!!z.$isZl)return a
+if(!!z.$isTv)return a
 if(a!=null)z=!!z.$isWO&&z.gl0(a)
 else z=!0
 if(z)a=""
 if(!!J.x(a).$isWO){y=P.F(a,!1,null)
 z=new H.a7(y,y.length,0,null)
 z.$builtinTypeInfo=[H.u3(y,0)]
-for(;z.G();){x=z.Ff
-if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Zl(y)}z=$.fX()
+for(;z.G();){x=z.lo
+if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Tv(y)}z=$.aB()
 w=z.t(0,a)
 if(w!=null)return w
-v=new L.iF([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
-if(v==null)return $.ptP()
-w=new L.Zl(C.Nm.tt(v,!1))
+v=new L.Pw([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
+if(v==null)return $.O3()
+w=new L.Tv(C.Nm.tt(v,!1))
 if(z.X5>=100){u=new P.i5(z)
 u.$builtinTypeInfo=[H.u3(z,0)]
 t=u.gA(u)
-if(!t.G())H.vh(H.DU())
+if(!t.G())H.vh(H.Wp())
 z.Rz(0,t.gl())}z.u(0,a,w)
 return w}}},
 vH:{
-"^":"Zl;T7",
+"^":"Tv;T7",
 gPu:function(){return!1},
-static:{"^":"HS"}},
-lPa:{
+static:{"^":"l7"}},
+MdQ:{
 "^":"TpZ:76;",
-$0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.v4("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
+$0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.Vq("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
 $isEH:true},
-iF:{
-"^":"a;vc>,vH>,nl*,ep",
+Pw:{
+"^":"a;vc>,vH>,nl*,n5",
 Xn:function(a){var z
 if(a==null)return"eof"
-switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.eT([a])
+switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.LY([a])
 case 95:case 36:return"ident"
 case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}if(typeof a!=="number")return H.s(a)
 if(!(97<=a&&a<=122))z=65<=a&&a<=90
@@ -15515,13 +15596,13 @@
 if(z)return"ident"
 if(49<=a&&a<=57)return"number"
 return"else"},
-rXF:function(){var z,y,x,w
+rX:function(){var z,y,x,w
 z=this.nl
 if(z==null)return
-z=$.cx().B0(z)
+z=$.cD().B0(z)
 y=this.vc
 x=this.nl
-if(z)y.push($.vu().xV.T4.t(0,x))
+if(z)y.push($.vu().JE.T4.t(0,x))
 else{w=H.BU(x,10,new L.PD())
 y.push(w!=null?w:this.nl)}this.nl=null},
 mx:function(a,b){var z=this.nl
@@ -15532,142 +15613,142 @@
 if(z>=y)return!1;++z
 if(z<0||z>=y)return H.e(b,z)
 z=b[z]
-x=H.eT([z])
+x=H.LY([z])
 if(!(a==="inSingleQuote"&&x==="'"))z=a==="inDoubleQuote"&&x==="\""
 else z=!0
 if(z){++this.vH
 z=this.nl
 this.nl=z==null?x:H.d(z)+x
 return!0}return!1},
-pI:function(a){var z,y,x,w,v,u,t,s,r,q,p
-z=U.LQ(J.GG(a),0,null,65533)
-for(y=z.length,x="beforePath";x!=null;){w=++this.vH
-if(w>=y)v=null
-else{if(w<0)return H.e(z,w)
-v=z[w]}if(v!=null)w=H.eT([v])==="\\"&&this.jN(x,z)
-else w=!1
-if(w)continue
-u=this.Xn(v)
-if(J.xC(x,"error"))return
-t=this.ep.t(0,x)
-s=t.t(0,u)
-if(s==null)s=t.t(0,"else")
-if(s==null)return
-w=J.U6(s)
-x=w.t(s,0)
-r=w.gB(s)>1?w.t(s,1):null
-q=J.x(r)
-if(q.n(r,"push")&&this.nl!=null)this.rXF()
-if(q.n(r,"append")){if(w.gB(s)>2){w.t(s,2)
-q=!0}else q=!1
-if(q)p=w.t(s,2)
-else p=H.eT([v])
-w=this.nl
-this.nl=w==null?p:H.d(w)+H.d(p)}if(x==="afterPath")return this.vc}return}},
+pI:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+z=U.LQ(J.OX(a),0,null,65533)
+for(y=this.n5,x=z.length,w="beforePath";w!=null;){v=++this.vH
+if(v>=x)u=null
+else{if(v<0)return H.e(z,v)
+u=z[v]}if(u!=null)v=H.LY([u])==="\\"&&this.jN(w,z)
+else v=!1
+if(v)continue
+t=this.Xn(u)
+if(J.xC(w,"error"))return
+s=y.t(0,w)
+r=s.t(0,t)
+if(r==null)r=s.t(0,"else")
+if(r==null)return
+v=J.U6(r)
+w=v.t(r,0)
+q=v.gB(r)>1?v.t(r,1):null
+p=J.x(q)
+if(p.n(q,"push")&&this.nl!=null)this.rX()
+if(p.n(q,"append")){if(v.gB(r)>2){v.t(r,2)
+p=!0}else p=!1
+if(p)o=v.t(r,2)
+else o=H.LY([u])
+v=this.nl
+this.nl=v==null?o:H.d(v)+H.d(o)}if(w==="afterPath")return this.vc}return}},
 PD:{
 "^":"TpZ:12;",
 $1:function(a){return},
 $isEH:true},
 nQ:{
-"^":"ARh;IE,pu,vl,zo,dR,vS,KZ",
+"^":"ARh;IE,ds,vl,wN,dR,z7,KZ",
 gDJ:function(){return 3},
 TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
 Ej:function(a){var z,y,x,w
 for(z=this.vl,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.zr){z=$.rf
+if(w!==C.aZ){z=$.rf
 if(z!=null){y=z.Ou
 y=y==null?w!=null:y!==w}else y=!0
-if(y){z=w==null?null:P.Ls(null,null,null,null)
+if(y){z=w==null?null:P.fM(null,null,null,null)
 z=new L.Og(w,z,[],null)
 $.rf=z}if(z.Ou==null){z.Ou=w
-z.cE=P.Ls(null,null,null,null)}z.JD.push(this)
+z.cE=P.fM(null,null,null,null)}z.JD.push(this)
 this.VC(z.gUu(z))
 this.IE=null
-break}}this.CG(!this.pu)},
+break}}this.CG(!this.ds)},
 U9:function(){var z,y,x,w
-for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.zr){w=z+1
+for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
 if(w>=x)return H.e(y,w)
 J.yd(y[w])}this.vl=null
-this.vS=null},
+this.z7=null},
 WX:function(a,b){var z=this.KZ
-if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add paths once started."))
+if(z===$.ng||z===$.H2)throw H.b(P.w("Cannot add paths once started."))
 b=L.hk(b)
 z=this.vl
 z.push(a)
 z.push(b)
-if(!this.pu)return
-J.bi(this.vS,b.WK(a))},
+if(!this.ds)return
+J.dH(this.z7,b.WK(a))},
 ti:function(a){return this.WX(a,null)},
 YU:function(a){var z=this.KZ
-if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add observers once started."))
+if(z===$.ng||z===$.H2)throw H.b(P.w("Cannot add observers once started."))
 z=this.vl
-z.push(C.zr)
+z.push(C.aZ)
 z.push(a)
-if(!this.pu)return
-J.bi(this.vS,J.mu(a,new L.Zu(this)))},
+if(!this.ds)return
+J.dH(this.z7,J.mu(a,new L.bjd(this)))},
 VC:function(a){var z,y,x,w,v
 for(z=0;y=this.vl,x=y.length,z<x;z+=2){w=y[z]
-if(w!==C.zr){v=z+1
+if(w!==C.aZ){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isZl").I5(w,a)}}},
+H.Go(y[v],"$isTv").I5(w,a)}}},
 CG:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.vS,C.jn.BU(this.vl.length,2))
+J.Vw(this.z7,C.jn.BU(this.vl.length,2))
 for(z=!1,y=null,x=0;w=this.vl,v=w.length,x<v;x+=2){u=w[x]
 t=x+1
 if(t>=v)return H.e(w,t)
 s=w[t]
-if(u===C.zr){H.Go(s,"$isAp")
-r=this.KZ===$.jq1?s.TR(0,new L.vI(this)):s.gP(s)}else r=H.Go(s,"$isZl").WK(u)
-if(a){J.kW(this.vS,C.jn.BU(x,2),r)
-continue}w=this.vS
+if(u===C.aZ){H.Go(s,"$isAp")
+r=this.KZ===$.jq1?s.TR(0,new L.cmp(this)):s.gP(s)}else r=H.Go(s,"$isTv").WK(u)
+if(a){J.qQ(this.z7,C.jn.BU(x,2),r)
+continue}w=this.z7
 v=C.jn.BU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
 w=this.dR
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.vS,v))}J.kW(this.vS,v,r)
+y.u(0,v,J.UQ(this.z7,v))}J.qQ(this.z7,v,r)
 z=!0}if(!z)return!1
-this.dC(this.vS,y,w)
+this.dC(this.z7,y,w)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Zu:{
+bjd:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.fl()
+if(z.KZ===$.ng)z.fl()
 return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-vI:{
+cmp:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.fl()
+if(z.KZ===$.ng)z.fl()
 return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 iNc:{
 "^":"a;"},
 ARh:{
 "^":"Ap;",
-Yd:function(){return this.zo.$0()},
-d1:function(a){return this.zo.$1(a)},
-qk:function(a,b){return this.zo.$2(a,b)},
-Tu:function(a,b,c){return this.zo.$3(a,b,c)},
-gB9:function(){return this.KZ===$.ljh},
+Yd:function(){return this.wN.$0()},
+d1:function(a){return this.wN.$1(a)},
+qk:function(a,b){return this.wN.$2(a,b)},
+p0:function(a,b,c){return this.wN.$3(a,b,c)},
+gB9:function(){return this.KZ===$.ng},
 TR:function(a,b){var z=this.KZ
-if(z===$.ljh||z===$.ls)throw H.b(P.w("Observer has already been opened."))
-if(X.na(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
-this.zo=b
-this.dR=P.J(this.gDJ(),X.Zpg(b))
+if(z===$.ng||z===$.H2)throw H.b(P.w("Observer has already been opened."))
+if(X.OS(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
+this.wN=b
+this.dR=P.J(this.gDJ(),X.RI(b))
 this.Ej(0)
-this.KZ=$.ljh
-return this.vS},
+this.KZ=$.ng
+return this.z7},
 gP:function(a){this.CG(!0)
-return this.vS},
-xO:function(a){if(this.KZ!==$.ljh)return
+return this.z7},
+xO:function(a){if(this.KZ!==$.ng)return
 this.U9()
-this.vS=null
-this.zo=null
-this.KZ=$.ls},
-fR:function(){if(this.KZ===$.ljh)this.fl()},
+this.z7=null
+this.wN=null
+this.KZ=$.H2},
+fR:function(){if(this.KZ===$.ng)this.fl()},
 fl:function(){var z=0
 while(!0){if(!(z<1000&&this.mX()))break;++z}return z>0},
 dC:function(a,b,c){var z,y,x,w
@@ -15677,7 +15758,7 @@
 break
 case 2:this.qk(a,b)
 break
-case 3:this.Tu(a,b,c)
+case 3:this.p0(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
@@ -15700,17 +15781,17 @@
 if((x==null?w!=null:x!==w)||this.cE.tg(0,y.Ft))return!1}else return!1}return!0},
 F5:[function(a){var z,y,x
 if(this.b2(a))return
-for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
-if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.Ff
+for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
+if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.lo
 if(x.gB9())x.mX()}},"$1","gCP",2,0,19,183],
-static:{"^":"rf",KJ:function(a,b){var z,y
+static:{"^":"rf",SE:function(a,b){var z,y
 z=$.rf
 if(z!=null){y=z.Ou
 y=y==null?b!=null:y!==b}else y=!0
-if(y){z=b==null?null:P.Ls(null,null,null,null)
+if(y){z=b==null?null:P.fM(null,null,null,null)
 z=new L.Og(b,z,[],null)
 $.rf=z}if(z.Ou==null){z.Ou=b
-z.cE=P.Ls(null,null,null,null)}z.JD.push(a)
+z.cE=P.fM(null,null,null,null)}z.JD.push(a)
 a.VC(z.gUu(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
@@ -15727,89 +15808,90 @@
 $2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,141,66,"call"],
 $isEH:true}}],["","",,A,{
 "^":"",
-ec:function(a,b,c){var z=$.lx()
-if(z==null||$.Ep()!==!0)return
+YG:function(a,b,c){var z=$.lx()
+if(z==null||$.oo()!==!0)return
 z.V7("shimStyling",[a,b,c])},
-q3:function(a){var z,y,x,w,v
+Hl:function(a){var z,y,x,w,v
 if(a==null)return""
 if($.UG)return""
 w=J.RE(a)
-z=w.gmH(a)
+z=w.gLU(a)
 if(J.xC(z,""))z=w.gQg(a).dA.getAttribute("href")
 try{w=new XMLHttpRequest()
 C.W3.i3(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
-if(!!J.x(w).$isBK){y=w
+if(!!J.x(w).$isNh){y=w
 x=new H.oP(v,null)
-$.Is().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+$.eU().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 M8:[function(a){var z,y
-z=$.vu().xV.af.t(0,a)
+z=$.vu().JE.fJ.t(0,a)
 if(z==null)return!1
 y=J.Qe(z)
-return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","hU",2,0,64,65],
+return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,64,65],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.Xw(),"Polymer"),"$isr7").PO([a])},
 ZI:function(a,b){var z,y,x,w
 if(a==null)return
 document
-if($.Ep()===!0)b=document.head
+if($.oo()===!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.rk(C.t5.grZ(w.jt))}b.insertBefore(z,x)},
-YK:function(){A.c4()
+if(w.gor(w))x=J.cC(C.z0.grZ(w.mk))}b.insertBefore(z,x)},
+Ok:function(){A.c4()
 if($.UG){A.X1($.M6,!0)
 return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
-if($.HE)throw H.b("Initialization was already done.")
-$.HE=!0
+if($.DG)throw H.b("Initialization was already done.")
+$.DG=!0
 A.JP()
 $.ok=b
 if(a==null)throw H.b("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.")
-A.Ad("auto-binding-dart",C.nj)
+A.Ad("auto-binding-dart",C.kA)
 z=document.createElement("polymer-element",null)
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
-J.UQ($.Dw(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,91,0,null),[H.u3(a,0)]);y.G();)y.Ff.$0()},
-JP:function(){var z,y,x,w
-z=$.Xw()
-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.XR())])
-w=J.UQ($.Dw(),"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($.Dw(),"register",P.mt(new A.k2(x,w)))},
-c4:function(){var z,y,x
+J.UQ($.XX(),"init").qP([],z)
+for(y=H.VM(new H.a7(a,93,0,null),[H.u3(a,0)]);y.G();)y.lo.$0()},
+JP:function(){var z,y,x
+z=J.UQ($.Xw(),"Polymer")
+if(z==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org."))
+y=$.X3
+z.V7("whenPolymerReady",[y.ce(new A.XR())])
+x=J.UQ($.XX(),"register")
+if(x==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
+J.qQ($.XX(),"register",P.mt(new A.k2(y,x)))},
+c4:function(){var z,y,x,w
+z={}
 $.RL=!0
-z=J.UQ($.Xw(),"logFlags")
-y=[$.dn(),$.vo(),$.iX(),$.Lu(),$.REM(),$.lg()]
-x=N.QM("polymer")
-if(!H.Ck(y,new A.j0(z))){x.sOR(C.oOA)
-return}H.VM(new H.U5(y,new A.j0N(z)),[H.u3(H.VM(new H.wb(),[H.u3(y,0)]),0)]).aN(0,new A.MZ6())
-x.gSZ().yI(new A.mqr())},
-So:{
-"^":"a;FL>,t5>,Jh<,oc>,Q7<,Md<,eJ>,Gl<,PH<,ix<,y0,G9,wX>,mR<,WV,vT",
+y=J.UQ($.Xw(),"logFlags")
+z.a=y
+if(y==null)z.a=P.Fl(null,null)
+x=[$.a3(),$.xW(),$.UW(),$.aQ(),$.Is(),$.Fs()]
+w=N.QM("polymer")
+if(!H.Ck(x,new A.j0(z))){w.sOR(C.oO)
+return}H.VM(new H.U5(x,new A.j0N(z)),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]).aN(0,new A.MZ6())
+w.gSZ().yI(new A.mqr())},
+XP:{
+"^":"a;FL>,t5>,P1<,oc>,Q7<,DB<,eJ>,Gl<,CY<,ix<,y0,G9,wX>,mR<,yz,aU",
 gZf:function(){var z,y
-z=J.yR(this.FL,"template")
-if(z!=null)y=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
+z=J.Eh(this.FL,"template")
+if(z!=null)y=J.ti(!!J.x(z).$ishs?z:M.uH(z))
 else y=null
 return y},
 Ba:function(a){var z,y,x
 for(z=null,y=this;y!=null;){z=J.Vs(J.y3(y)).dA.getAttribute("extends")
-y=y.gJh()}x=document
-W.Ct(window,x,a,this.t5,z)},
-Cw:function(a){var z=$.Kc()
+y=y.gP1()}x=document
+W.wi(window,x,a,this.t5,z)},
+RH:function(a){var z=$.uj()
 if(z==null)return
 J.UQ(z,"urlResolver").V7("resolveDom",[a])},
 Zw:function(a){var z,y,x,w,v,u,t,s,r,q
@@ -15817,118 +15899,125 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 this.Q7=y}if(a.gix()!=null){z=a.gix()
-y=P.Ls(null,null,null,null)
+y=P.fM(null,null,null,null)
 y.FV(0,z)
 this.ix=y}}z=this.t5
 this.en(z)
 x=J.Vs(this.FL).dA.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.FF()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.Ff)
+if(x!=null)for(y=C.yo.Fr(x,$.FF()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.iY(y.lo)
 if(v==="")continue
-u=$.vu().xV.T4.t(0,v)
+u=$.vu().JE.T4.t(0,v)
 t=u!=null
 if(t){s=L.hk([u])
 r=this.Q7
 if(r!=null&&r.NZ(0,s))continue
-q=$.mX().CV(z,u)}else{q=null
-s=null}if(!t||q==null||q.gUA()||J.cL(q)===!0){window
+q=$.II().CV(z,u)}else{q=null
+s=null}if(!t||q==null||q.gUA()||J.Z6(q)===!0){window
 t="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
 if(typeof console!="undefined")console.warn(t)
 continue}t=this.Q7
 if(t==null){t=P.Fl(null,null)
 this.Q7=t}t.u(0,s,q)}},
 en:function(a){var z,y,x,w,v
-for(z=$.mX().Me(0,a,C.V4),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+for(z=$.II().Me(0,a,C.V4),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 w=this.Q7
 if(w==null){w=P.Fl(null,null)
 this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
 w=y.gDv()
-v=new H.wb()
+v=new H.TNQ()
 v.$builtinTypeInfo=[H.u3(w,0)]
 w=new H.U5(w,new A.Zd())
 w.$builtinTypeInfo=[H.u3(v,0)]
 if(w.Vr(0,new A.Da())){w=this.ix
-if(w==null){w=P.Ls(null,null,null,null)
+if(w==null){w=P.fM(null,null,null,null)
 this.ix=w}x=x.goc(y)
-w.h(0,$.vu().xV.af.t(0,x))}}},
+w.h(0,$.vu().JE.fJ.t(0,x))}}},
 Vk:function(){var z,y
 z=P.L5(null,null,null,P.qU,P.a)
-this.PH=z
-y=this.Jh
-if(y!=null)z.FV(0,y.gPH())
+this.CY=z
+y=this.P1
+if(y!=null)z.FV(0,y.gCY())
 J.Vs(this.FL).aN(0,new A.EB(this))},
-W3:function(a){J.Vs(this.FL).aN(0,new A.Y1(a))},
-ka:function(){var z=this.Bg("link[rel=stylesheet]")
+W3:function(a){J.Vs(this.FL).aN(0,new A.Pf(a))},
+fk:function(){var z=this.Bg("link[rel=stylesheet]")
 this.y0=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Rv(z.lo)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
 this.G9=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Rv(z.lo)},
 yq:function(){var z,y,x,w,v,u,t,s
 z=this.y0
 z.toString
-y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0)])
+y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.TNQ(),[H.u3(z,0)]),0)])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.q3(v.gl())
+for(z=H.VM(new H.Mo(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.Hl(v.gl())
 t=w.IN+=typeof u==="string"?u:H.d(u)
-w.IN=t+"\n"}if(w.IN.length>0){s=J.lu(this.FL).createElement("style",null)
+w.IN=t+"\n"}if(w.IN.length>0){s=J.Do(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.FO(x,s,z.gNL(x))}}},
+z.mK(x,s,z.gNL(x))}}},
 Wz:function(a,b){var z,y,x
-z=J.We(this.FL,a)
+z=J.Vj(this.FL,a)
 y=z.br(z)
 x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.We(x,a))
+if(x!=null)C.Nm.FV(y,J.Vj(x,a))
 return y},
 Bg:function(a){return this.Wz(a,null)},
-ds:function(a){var z,y,x,w,v,u
+l7:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.ui("[polymer-scope="+a+"]")
-for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.q3(w.gl())
+y=new A.Vi("[polymer-scope="+a+"]")
+for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]),x=H.VM(new H.Mo(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.Hl(w.gl())
 u=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
+z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]),x=H.VM(new H.Mo(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
 w=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=w+"\n\n"}return z.IN},
+z.IN=w+"\n\n"}y=z.IN
+return y.charCodeAt(0)==0?y:y},
 J3:function(a,b){var z
-if(a==="")return
+if(J.xC(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.u3(z,0)]);z.G();){y=z.Ff
+for(z=$.or(),z=$.II().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.vu().xV.af.t(0,w)
+v=$.vu().JE.fJ.t(0,w)
 w=J.U6(v)
 v=w.Nj(v,0,J.bI(w.gB(v),7))
 this.eJ.u(0,L.hk(v),[x.goc(y)])}},
-I7:function(){var z,y,x
-for(z=$.mX().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff.gDv()
-x=new H.a7(y,y.length,0,null)
-x.$builtinTypeInfo=[H.u3(y,0)]
-for(;x.G();)continue}},
+I7:function(){var z,y,x,w,v,u,t
+for(z=$.II().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+x=y.gDv()
+w=new H.a7(x,x.length,0,null)
+w.$builtinTypeInfo=[H.u3(x,0)]
+x=J.RE(y)
+for(;w.G();){v=w.lo
+if(!J.x(v).$iswA)continue
+if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
+for(u=v.gfJ(),u=u.gA(u);u.G(),!1;){t=u.gl()
+J.dH(this.eJ.to(0,L.hk(t),new A.XU()),x.goc(y))}}}},
 jq:function(a){var z=P.L5(null,null,null,P.qU,null)
-a.aN(0,new A.Tj(z))
+a.aN(0,new A.fh(z))
 return z},
-ut:function(){var z,y,x,w,v,u,t,s,r
+hW:function(){var z,y,x,w,v,u,t,s,r
 z=P.Fl(null,null)
-for(y=$.mX().Me(0,this.t5,C.m8),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.Ff
-v=H.FU(w.gDv(),new A.HH(),null)
+for(y=$.II().Me(0,this.t5,C.jJ),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.lo
+v=H.Sz(w.gDv(),new A.HH(),null)
 u=J.RE(w)
 t=u.goc(w)
 s=z.t(0,t)
 if(s!=null){u=u.gt5(w)
 r=J.zH(s)
-r=$.mX().xs(u,r)
+r=$.II().xs(u,r)
 u=r}else u=!0
-if(u){x.u(0,t,v.gXt())
+if(u){x.u(0,t,v.gEV())
 z.u(0,t,w)}}},
-$isSo:true,
+$isXP:true,
 static:{"^":"Kb"}},
 Zd:{
 "^":"TpZ:12;",
@@ -15940,52 +16029,52 @@
 $isEH:true},
 EB:{
 "^":"TpZ:81;a",
-$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.PH.u(0,a,b)},
+$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.CY.u(0,a,b)},
 $isEH:true},
-Y1:{
+Pf:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z,y,x
 z=J.Qe(a)
 if(z.nC(a,"on-")){y=J.U6(b).OY(b,"{{")
-x=C.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)))}},
+x=C.yo.cn(b,"}}")
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.yo.DY(C.yo.Nj(b,y+2,x)))}},
 $isEH:true},
 IJ:{
 "^":"TpZ:12;",
 $1:function(a){return J.Vs(a).dA.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-ui:{
+Vi:{
 "^":"TpZ:12;a",
-$1:function(a){return J.wK(a,this.a)},
+$1:function(a){return J.YN(a,this.a)},
 $isEH:true},
-eM:{
+XU:{
 "^":"TpZ:76;",
 $0:function(){return[]},
 $isEH:true},
-Tj:{
+fh:{
 "^":"TpZ:184;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 HH:{
 "^":"TpZ:12;",
-$1:function(a){return!1},
+$1:function(a){return!!J.x(a).$isYj},
 $isEH:true},
 Li:{
-"^":"BG9;Mn,oe",
-op:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
-return this.Mn.op(a,b,c)},
-static:{"^":"rd0,QPA"}},
+"^":"BG9;xI,oe",
+op:function(a,b,c){if(J.co(b,"on-"))return this.Io(a,b,c)
+return this.xI.op(a,b,c)},
+static:{"^":"rd0,Uv"}},
 BG9:{
-"^":"vE+d23;"},
+"^":"VE+d23;"},
 d23:{
 "^":"a;",
-XB:function(a){var z
+h5:function(a){var z
 for(;z=J.RE(a),z.gAd(a)!=null;){if(!!z.$iszs&&J.UQ(a.n7,"eventController")!=null)return J.UQ(z.gCp(a),"eventController")
 a=z.gAd(a)}return!!z.$isI0?a.host:null},
 Z8:function(a,b,c){var z={}
 z.a=a
-return new A.l5(z,this,b,c)},
-CZ:function(a,b,c){var z,y,x,w
+return new A.AC(z,this,b,c)},
+Io:function(a,b,c){var z,y,x,w
 z={}
 y=J.Qe(b)
 if(!y.nC(b,"on-"))return
@@ -15994,17 +16083,17 @@
 w=C.yt.t(0,x)
 z.a=w!=null?w:z.a
 return new A.liz(z,this,a)}},
-l5:{
+AC:{
 "^":"TpZ:12;a,b,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
+if(y==null||!J.x(y).$iszs){x=this.b.h5(this.c)
 z.a=x
 y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$isDG4){w=y.gey(a)
-if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
-y=y.gF0(a)
+if(!!y.$isRb){w=C.lG.gey(a)
+if(w==null)w=J.UQ(P.kW(a),"detail")}else w=null
+y=y.gXQ(a)
 z=z.a
 J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
@@ -16012,50 +16101,50 @@
 "^":"TpZ:188;a,b,c",
 $3:[function(a,b,c){var z,y,x
 z=this.c
-y=P.mt(new A.kD($.X3.mS(this.b.Z8(null,b,z))))
+y=P.mt(new A.Bc($.X3.mS(this.b.Z8(null,b,z))))
 x=this.a
-$.tNi().V7("addEventListener",[b,x.a,y])
+$.Op().V7("addEventListener",[b,x.a,y])
 if(c===!0)return
-return new A.zIs(z,b,x.a,y)},"$3",null,6,0,null,185,186,187,"call"],
+return new A.d6(z,b,x.a,y)},"$3",null,6,0,null,185,186,187,"call"],
 $isEH:true},
-kD:{
+Bc:{
 "^":"TpZ:81;d",
 $2:[function(a,b){return this.d.$1(b)},"$2",null,4,0,null,13,2,"call"],
 $isEH:true},
-zIs:{
-"^":"Ap;ED,d9,dF,Xj",
+d6:{
+"^":"Ap;ED,v3,dF,Xj",
 gP:function(a){return"{{ "+this.ED+" }}"},
 TR:function(a,b){return"{{ "+this.ED+" }}"},
-xO:function(a){$.tNi().V7("removeEventListener",[this.d9,this.dF,this.Xj])}},
+xO:function(a){$.Op().V7("removeEventListener",[this.v3,this.dF,this.Xj])}},
 xn:{
 "^":"iv;vn<",
 $isxn:true},
 xc:{
-"^":"TR0;Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"TR0;Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 XI:function(a){this.kR(a)},
-static:{oaJ:function(a){var z,y,x,w
+static:{yk:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.GBL.LX(a)
-C.GBL.XI(a)
+C.Vk.LX(a)
+C.Vk.XI(a)
 return a}}},
 jpR:{
 "^":"Bo+zs;Cp:n7=",
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 $isKV:true},
 TR0:{
 "^":"jpR+Pi;",
@@ -16070,137 +16159,137 @@
 y=this.gQg(a).dA.getAttribute("is")
 return y==null||y===""?this.gqn(a):y},
 kR:function(a){var z,y
-z=this.gmb(a)
+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.Ec(a)
-y=this.gJ8(a)
-if(!J.xC($.Ks().t(0,y),!0))this.rf(a)},
+y=this.gM0(a)
+if(!J.xC($.Tg().t(0,y),!0))this.rf(a)},
 Ec:function(a){var z,y
 if(a.IX!=null){window
 z="Element already prepared: "+H.d(this.gRT(a))
 if(typeof console!="undefined")console.warn(z)
-return}a.n7=P.XY(a)
+return}a.n7=P.kW(a)
 z=this.gRT(a)
-a.IX=$.w3G().t(0,z)
-this.jM(a)
+a.IX=$.RA().t(0,z)
+this.nt(a)
 z=a.MJ
 if(z!=null){y=this.gnu(a)
 z.toString
 L.ARh.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gLj(a))
 this.oR(a)
-this.xL(a)
+this.xX(a)
 this.Uc(a)},
 rf:function(a){if(a.OD)return
 a.OD=!0
 this.bT(a)
 this.Qs(a,a.IX)
 this.gQg(a).Rz(0,"unresolved")
-$.lg().To(new A.pN(a))
+$.Fs().To(new A.pN(a))
 this.I9(a)},
 I9:function(a){},
 Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
 this.oW(a)
 if(!a.kK){a.kK=!0
 this.rW(a,new A.hp(a))}},
-Lx:function(a){this.x3(a)},
-Qs:function(a,b){if(b!=null){this.Qs(a,b.gJh())
+dQ:function(a){this.x3(a)},
+Qs:function(a,b){if(b!=null){this.Qs(a,b.gP1())
 this.aI(a,J.y3(b))}},
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.XT(b,"template")
+y=z.Wk(b,"template")
 if(y!=null){x=this.Tp(a,y)
 w=z.gQg(b).dA.getAttribute("name")
 if(w==null)return
 a.ZM.u(0,w,x)}},
 Tp:function(a,b){var z,y,x,w,v,u
-if(b==null)return
-z=this.TL(a)
+z=this.er(a)
+M.uH(b).rp(null)
 y=this.gwX(a)
-x=!!J.x(b).$isvy?b:M.Xi(b)
-w=J.dv(x,a,y==null&&J.qy(x)==null?J.v7(a.IX):y)
-v=a.f4
-u=$.nR().t(0,w)
+x=!!J.x(b).$ishs?b:M.uH(b)
+w=J.ju(x,a,y==null&&J.Ee(x)==null?J.RH0(a.IX):y)
+v=a.Iy
+u=$.Uo().t(0,w)
 C.Nm.FV(v,u!=null?u.gdn():u)
 z.appendChild(w)
 this.lj(a,z)
 return z},
 lj:function(a,b){var z,y,x
 if(b==null)return
-for(z=J.We(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.Ff
+for(z=J.Vj(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
 y.u(0,J.eS(x),x)}},
-wN:function(a,b,c,d){var z=J.x(b)
+aC:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
-oR:function(a){a.IX.gPH().aN(0,new A.Sv(a))},
-xL:function(a){if(a.IX.gMd()==null)return
+oR:function(a){a.IX.gCY().aN(0,new A.va(a))},
+xX:function(a){if(a.IX.gDB()==null)return
 this.gQg(a).aN(0,this.gCg(a))},
 D3:[function(a,b,c){var z,y,x,w,v,u
 z=this.B2(a,b)
 if(z==null)return
-if(c==null||J.kE(c,$.VCp())===!0)return
+if(c==null||J.kE(c,$.iB())===!0)return
 y=J.RE(z)
 x=y.goc(z)
-w=$.cp().Gp(a,x)
+w=$.cp().jD(a,x)
 v=y.gt5(z)
 x=J.x(v)
-u=Z.fd(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
+u=Z.LB(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","gCg",4,0,189],
-B2:function(a,b){var z=a.IX.gMd()
+$.cp().Q1(a,y,u)}},"$2","gCg",4,0,189],
+B2:function(a,b){var z=a.IX.gDB()
 if(z==null)return
 return z.t(0,b)},
-TW:function(a,b){if(b==null)return
+JL:function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
 QH:function(a,b){var z,y
 z=L.hk(b).WK(a)
-y=this.TW(a,z)
+y=this.JL(a,z)
 if(y!=null)this.gQg(a).dA.setAttribute(b,y)
 else if(typeof z==="boolean")this.gQg(a).Rz(0,b)},
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z=this.B2(a,b)
-if(z==null)return J.IB(M.Xi(a),b,c,d)
+if(z==null)return J.FS1(M.uH(a),b,c,d)
 else{y=J.RE(z)
 x=this.Fy(a,y.goc(z),c,d)
-if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.Xi(a))==null){w=P.Fl(null,null)
-J.CS(M.Xi(a),w)}J.kW(J.QE(M.Xi(a)),b,x)}v=a.IX.gix()
+if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.uH(a))==null){w=P.Fl(null,null)
+J.nC(M.uH(a),w)}J.qQ(J.QE(M.uH(a)),b,x)}v=a.IX.gix()
 y=y.goc(z)
-u=$.vu().xV.af.t(0,y)
+u=$.vu().JE.fJ.t(0,y)
 if(v!=null&&v.tg(0,u))this.QH(a,u)
 return x}},
 lL:function(a){return this.rf(a)},
-gCd:function(a){return J.QE(M.Xi(a))},
-sCd:function(a,b){J.CS(M.Xi(a),b)},
-gmb:function(a){return J.re(M.Xi(a))},
+gCd:function(a){return J.QE(M.uH(a))},
+sCd:function(a,b){J.nC(M.uH(a),b)},
+gCn:function(a){return J.OC(M.uH(a))},
 x3:function(a){var z,y
 if(a.bb===!0)return
-$.iX().J4(new A.N3(a))
+$.UW().Ny(new A.rs(a))
 z=a.TT
-y=this.gyz(a)
+y=this.gf2(a)
 if(z==null)z=new A.FT(null,null,null)
-z.t6(0,y,null)
+z.ui(0,y,null)
 a.TT=z},
-GBV:[function(a){if(a.bb===!0)return
+GB:[function(a){if(a.bb===!0)return
 this.mc(a)
 this.Uq(a)
-a.bb=!0},"$0","gyz",0,0,17],
+a.bb=!0},"$0","gf2",0,0,17],
 oW:function(a){var z
-if(a.bb===!0){$.iX().j2(new A.ti(a))
-return}$.iX().J4(new A.Rb(a))
+if(a.bb===!0){$.UW().j2(new A.TV(a))
+return}$.UW().Ny(new A.Z7(a))
 z=a.TT
-if(z!=null){z.nY(0)
+if(z!=null){z.TP(0)
 a.TT=null}},
-jM:function(a){var z,y,x,w,v
+nt:function(a){var z,y,x,w,v
 z=J.q1(a.IX)
 if(z!=null){y=new L.nQ(null,!1,[],null,null,null,$.jq1)
-y.vS=[]
+y.z7=[]
 a.MJ=y
-a.f4.push(y)
+a.Iy.push(y)
 for(x=H.VM(new P.fG(z),[H.u3(z,0)]),w=x.ZD,x=H.VM(new P.EQ(w,w.Nm(),0,null),[H.u3(x,0)]);x.G();){v=x.fD
 y.WX(a,v)
 this.j6(a,v,v.WK(a),null)}}},
-FQx:[function(a,b,c,d){J.Me(c,new A.OaD(a,b,c,d,J.q1(a.IX),P.Rd(null,null,null,null)))},"$3","gnu",6,0,190],
+FQx:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.q1(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,190],
 p7:[function(a,b){var z,y,x,w
 for(z=J.mY(b),y=a.qJ;z.G();){x=z.gl()
 if(!J.x(x).$isqI)continue
@@ -16208,8 +16297,8 @@
 if(y.t(0,w)!=null)continue
 this.Dt(a,w,x.zZ,x.jL)}},"$1","gLj",2,0,191,183],
 Dt:function(a,b,c,d){var z,y
-$.REM().To(new A.qW(a,b,c,d))
-z=$.vu().xV.af.t(0,b)
+$.Is().To(new A.qW(a,b,c,d))
+z=$.vu().JE.fJ.t(0,b)
 y=a.IX.gix()
 if(y!=null&&y.tg(0,z))this.QH(a,z)},
 j6:function(a,b,c,d){var z,y,x,w,v
@@ -16217,18 +16306,18 @@
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){$.dn().J4(new A.xf(a,b))
-this.Mx(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.dn().J4(new A.Y0(a,b))
-x=c.gXF().k0(new A.kMK(a,d,y),null,null,!1)
+if(!!J.x(d).$iswn){$.a3().Ny(new A.xf(a,b))
+this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.a3().Ny(new A.Y0(a,b))
+x=c.gXF().k0(new A.fS(a,y),null,null,!1)
 w=H.d(b)+"__array"
-v=a.Bd
+v=a.vG
 if(v==null){v=P.L5(null,null,null,P.qU,P.yX)
-a.Bd=v}v.u(0,w,x)}},
-hq:function(a,b,c,d){if(d==null?c==null:d===c)return
+a.vG=v}v.u(0,w,x)}},
+Oq:function(a,b,c,d){if(d==null?c==null:d===c)return
 this.Dt(a,b,c,d)},
-hO:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
-z=$.cp().xV.II.t(0,b)
-if(z==null)H.vh(O.Fm("getter \""+H.d(b)+"\" in "+this.bu(a)))
+rh:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
+z=$.cp().JE.E4.t(0,b)
+if(z==null)H.vh(O.lA("getter \""+H.d(b)+"\" in "+this.bu(a)))
 y=z.$1(a)
 x=a.qJ.t(0,b)
 if(x==null){w=J.RE(c)
@@ -16237,10 +16326,10 @@
 v.Sx=this.gqh(a).k0(v.gou(),null,null,!1)
 w=J.mu(c,v.gew())
 v.RP=w
-u=$.cp().xV.F8.t(0,b)
-if(u==null)H.vh(O.Fm("setter \""+H.d(b)+"\" in "+this.bu(a)))
+u=$.cp().JE.F8.t(0,b)
+if(u==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.bu(a)))
 u.$2(a,w)
-a.f4.push(v)
+a.Iy.push(v)
 return v}x.mn=c
 w=J.RE(c)
 t=w.TR(c,x.gUe())
@@ -16251,71 +16340,71 @@
 r=x.RT
 q=J.RE(w)
 x.VB=q.ct(w,r,y,t)
-q.hq(w,r,t,y)
+q.Oq(w,r,t,y)
 v=new A.p0(x)
-a.f4.push(v)
+a.Iy.push(v)
 return v},
-hH:function(a,b,c){return this.hO(a,b,c,!1)},
+wc:function(a,b,c){return this.rh(a,b,c,!1)},
 yO:function(a,b){var z=a.IX.gGl().t(0,b)
 if(z==null)return
-return T.yM().$3$globals(T.u5().$1(z),a,J.v7(a.IX).Mn.nF)},
+return T.aC().$3$globals(T.Ms().$1(z),a,J.RH0(a.IX).xI.nF)},
 bT:function(a){var z,y,x,w,v,u,t,s
 z=a.IX.gGl()
-for(v=J.mY(J.iY(z)),u=a.qJ;v.G();){y=v.gl()
+for(v=J.mY(J.iYM(z)),u=a.qJ;v.G();){y=v.gl()
 try{x=this.yO(a,y)
 if(u.t(0,y)==null){t=new A.Zw(y,J.Vm(x),a,null)
 t.$builtinTypeInfo=[null]
-u.u(0,y,t)}this.hH(a,y,x)}catch(s){t=H.Ru(s)
+u.u(0,y,t)}this.wc(a,y,x)}catch(s){t=H.Ru(s)
 w=t
 window
 t="Failed to create computed property "+H.d(y)+" ("+H.d(J.UQ(z,y))+"): "+H.d(w)
 if(typeof console!="undefined")console.error(t)}}},
 mc:function(a){var z,y
-for(z=a.f4,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
-if(y!=null)J.yd(y)}a.f4=[]},
-Mx:function(a,b){var z=a.Bd.Rz(0,b)
+for(z=a.Iy,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+if(y!=null)J.yd(y)}a.Iy=[]},
+iQ:function(a,b){var z=a.vG.Rz(0,b)
 if(z==null)return!1
 z.Gv()
 return!0},
 Uq:function(a){var z,y
-z=a.Bd
+z=a.vG
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.Ff
-if(y!=null)y.Gv()}a.Bd.V1(0)
-a.Bd=null},
-Fy:function(a,b,c,d){var z=$.Lu()
-z.J4(new A.aM(a,b,c))
-if(d){if(!!J.x(c).$isAp)z.j2(new A.RM(a,b,c))
-$.cp().Cq(a,b,c)
-return}return this.hO(a,b,c,!0)},
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.lo
+if(y!=null)y.Gv()}a.vG.V1(0)
+a.vG=null},
+Fy:function(a,b,c,d){var z=$.aQ()
+z.Ny(new A.aM(a,b,c))
+if(d){if(!!J.x(c).$isAp)z.j2(new A.aMY(a,b,c))
+$.cp().Q1(a,b,c)
+return}return this.rh(a,b,c,!0)},
 Uc:function(a){var z=a.IX.gmR()
 if(z.gl0(z))return
-$.vo().J4(new A.SX(a,z))
+$.xW().Ny(new A.SX(a,z))
 z.aN(0,new A.Jys(a))},
 ea:function(a,b,c,d){var z,y,x
-z=$.vo()
+z=$.xW()
 z.To(new A.od(a,c))
-if(!!J.x(c).$isEH){y=X.Zpg(c)
+if(!!J.x(c).$isEH){y=X.RI(c)
 if(y===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,y)
-H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.vu().xV.T4.t(0,c)
+H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.vu().JE.T4.t(0,c)
 $.cp().Ck(b,x,d,!0,null)}else z.j2("invalid callback")
-z.J4(new A.cB(a,c))},
+z.Ny(new A.cB(a,c))},
 rW:function(a,b){var z
 P.rb(F.Jy())
 $.Kc().nQ("flush")
 z=window
-C.Ui.Wq(z)
-return C.Ui.ne(z,W.Yt(b))},
-SE:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
-this.Ph(a,z)
+C.ol.Wq(z)
+return C.ol.ne(z,W.Yt(b))},
+TZ:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
+this.jR(a,z)
 return z},
-ZB:function(a,b){return this.SE(a,b,null,null,null,null)},
+ZB:function(a,b){return this.TZ(a,b,null,null,null,null)},
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 $isKV:true},
 pN:{
 "^":"TpZ:76;a",
@@ -16325,7 +16414,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-Sv:{
+va:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.NZ(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
@@ -16335,19 +16424,19 @@
 "^":"TpZ:76;b",
 $0:function(){return this.b},
 $isEH:true},
-N3:{
+rs:{
 "^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.RI(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-ti:{
+TV:{
 "^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.RI(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-Rb:{
+Z7:{
 "^":"TpZ:76;b",
-$0:[function(){return"["+H.d(J.RI(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-OaD:{
+N4:{
 "^":"TpZ:81;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
@@ -16370,52 +16459,52 @@
 $isEH:true},
 xf:{
 "^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.RI(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Y0:{
 "^":"TpZ:76;c,d",
-$0:[function(){return"["+H.d(J.RI(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-kMK:{
-"^":"TpZ:12;e,f,UI",
-$1:[function(a){var z,y,x,w
-for(z=J.mY(this.UI),y=this.e,x=this.f;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,192,"call"],
+fS:{
+"^":"TpZ:12;e,f",
+$1:[function(a){var z,y,x
+for(z=J.mY(this.f),y=this.e;z.G();){x=z.gl()
+$.cp().Ck(y,x,[a],!0,null)}},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 aM:{
 "^":"TpZ:76;a,b,c",
-$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.RI(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
+$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.VB(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
 $isEH:true},
-RM:{
+aMY:{
 "^":"TpZ:76;d,e,f",
-$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.RI(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
+$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.VB(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
 $isEH:true},
 SX:{
 "^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.RI(this.a))+"] addHostListeners: "+this.b.bu(0)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.a))+"] addHostListeners: "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jys:{
 "^":"TpZ:81;c",
 $2:function(a,b){var z=this.c
-$.tNi().V7("addEventListener",[z,a,$.X3.mS(J.v7(z.IX).Z8(z,z,b))])},
+$.Op().V7("addEventListener",[z,a,$.X3.mS(J.RH0(z.IX).Z8(z,z,b))])},
 $isEH:true},
 od:{
 "^":"TpZ:76;a,b",
-$0:[function(){return">>> ["+H.d(J.RI(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return">>> ["+H.d(J.VB(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cB:{
 "^":"TpZ:76;c,d",
-$0:[function(){return"<<< ["+H.d(J.RI(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$0:[function(){return"<<< ["+H.d(J.VB(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lK:{
 "^":"Ap;I6,ko,q0,Sx,RP",
 z9N:[function(a){this.RP=a
-$.cp().Cq(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
-TZ:[function(a){var z,y,x,w,v
+$.cp().Q1(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
+XH:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.ko;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().xV.II.t(0,y)
-if(w==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+J.AG(z)))
+w=$.cp().JE.E4.t(0,y)
+if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
 v=w.$1(z)
 z=this.RP
 if(z==null?v!=null:z!==v)J.Fc(this.q0,v)
@@ -16440,26 +16529,26 @@
 J.yd(y)
 z.mn=null}},
 FT:{
-"^":"a;ek,Ar,lS",
-Dj:function(){return this.ek.$0()},
-t6:function(a,b,c){var z
-this.nY(0)
-this.ek=b
+"^":"a;Hi,Ar,TU",
+Dj:function(){return this.Hi.$0()},
+ui:function(a,b,c){var z
+this.TP(0)
+this.Hi=b
 z=window
-C.Ui.Wq(z)
-this.lS=C.Ui.ne(z,W.Yt(new A.K3(this)))},
-nY:function(a){var z,y
-z=this.lS
+C.ol.Wq(z)
+this.TU=C.ol.ne(z,W.Yt(new A.K3(this)))},
+TP:function(a){var z,y
+z=this.TU
 if(z!=null){y=window
-C.Ui.Wq(y)
+C.ol.Wq(y)
 y.cancelAnimationFrame(z)
-this.lS=null}z=this.Ar
+this.TU=null}z=this.Ar
 if(z!=null){z.Gv()
 this.Ar=null}}},
 K3:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.Ar!=null||z.lS!=null){z.nY(0)
+if(z.Ar!=null||z.TU!=null){z.TP(0)
 z.Dj()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
@@ -16476,10 +16565,10 @@
 k2:{
 "^":"TpZ:195;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
-if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.w3G().t(0,c)))
+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,193,58,194,"call"],
 $isEH:true},
-zR:{
+v4:{
 "^":"TpZ:76;c,d,e,f",
 $0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=this.c
@@ -16487,75 +16576,76 @@
 x=this.e
 w=this.f
 v=P.Fl(null,null)
-u=$.Ak()
+u=$.Cl()
 t=P.Fl(null,null)
-v=new A.So(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
-$.w3G().u(0,y,v)
+v=new A.XP(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
+$.RA().u(0,y,v)
 v.Zw(w)
 s=v.Q7
-if(s!=null)v.Md=v.jq(s)
+if(s!=null)v.DB=v.jq(s)
 v.rH()
 v.I7()
-v.ut()
+v.hW()
 s=J.RE(z)
-r=s.XT(z,"template")
-if(r!=null)J.D4(!!J.x(r).$isvy?r:M.Xi(r),u)
-v.ka()
+r=s.Wk(z,"template")
+if(r!=null)J.NA(!!J.x(r).$ishs?r:M.uH(r),u)
+v.fk()
 v.f6()
 v.yq()
-A.ZI(v.J3(v.ds("global"),"global"),document.head)
-v.Cw(z)
+A.ZI(v.J3(v.l7("global"),"global"),document.head)
+v.RH(z)
 v.Vk()
 v.W3(t)
 q=s.gQg(z).dA.getAttribute("assetpath")
 if(q==null)q=""
-p=P.hK(s.gJ8(z).baseURI)
+p=P.hK(s.gM0(z).baseURI)
 z=P.hK(q)
 o=z.Fi
 if(o.length!==0){if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=z.QB!=null?z.gtp(z):null}else{n=""
+l=z.Ni!=null?z.gtp(z):null}else{n=""
 m=null
-l=null}k=p.jn(z.Ee)
+l=null}k=p.mE(z.Ee)
 j=z.xu
 if(j!=null);else j=null}else{o=p.Fi
 if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=P.JF(z.QB!=null?z.gtp(z):null,o)
-k=p.jn(z.Ee)
+l=P.Ec(z.Ni!=null?z.gtp(z):null,o)
+k=p.mE(z.Ee)
 j=z.xu
 if(j!=null);else j=null}else{u=z.Ee
-if(u===""){k=p.Ee
+t=J.x(u)
+if(t.n(u,"")){k=p.Ee
 j=z.xu
-if(j!=null);else j=p.xu}else{k=C.xB.nC(u,"/")?p.jn(u):p.jn(p.pi(p.Ee,u))
+if(j!=null);else j=p.xu}else{k=t.nC(u,"/")?p.mE(u):p.mE(p.Bs(p.Ee,u))
 j=z.xu
 if(j!=null);else j=null}n=p.ku
 m=p.Kk
-l=p.QB}}i=z.ys
+l=p.Ni}}i=z.ys
 if(i!=null);else i=null
-v.vT=new P.q5(m,l,k,o,n,j,i,null,null)
+v.aU=new P.q5(m,l,k,o,n,j,i,null,null)
 z=v.gZf()
-A.ec(z,y,w!=null?J.DA(w):null)
-if($.mX().n6(x,C.SE))$.cp().Ck(x,C.SE,[v],!1,null)
+A.YG(z,y,w!=null?J.DA(w):null)
+if($.II().n6(x,C.L9))$.cp().Ck(x,C.L9,[v],!1,null)
 v.Ba(y)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
 "^":"TpZ:76;",
-$0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
-return!!J.x(z).$isKV?P.XY(z):z},
+$0:function(){var z=J.UQ(P.kW(document.createElement("polymer-element",null)),"__proto__")
+return!!J.x(z).$isKV?P.kW(z):z},
 $isEH:true},
 j0:{
 "^":"TpZ:12;a",
-$1:function(a){return J.xC(J.UQ(this.a,J.DA(a)),!0)},
+$1:function(a){return J.xC(J.UQ(this.a.a,J.DA(a)),!0)},
 $isEH:true},
 j0N:{
-"^":"TpZ:12;b",
-$1:function(a){return!J.xC(J.UQ(this.b,J.DA(a)),!0)},
+"^":"TpZ:12;a",
+$1:function(a){return!J.xC(J.UQ(this.a.a,J.DA(a)),!0)},
 $isEH:true},
 MZ6:{
 "^":"TpZ:12;",
-$1:function(a){a.sOR(C.oOA)},
+$1:function(a){a.sOR(C.oO)},
 $isEH:true},
 mqr:{
 "^":"TpZ:12;",
@@ -16563,48 +16653,48 @@
 $isEH:true},
 Zw:{
 "^":"a;RT,VB,I6,mn",
-xz:[function(a){var z,y,x,w
+VV:[function(a){var z,y,x,w
 z=this.VB
 y=this.I6
 x=this.RT
 w=J.RE(y)
 this.VB=w.ct(y,x,z,a)
-w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"Zw")},60],
+w.Oq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"Zw")},60],
 gP:function(a){var z=this.mn
 if(z!=null)z.fR()
 return this.VB},
 sP:function(a,b){var z=this.mn
 if(z!=null)J.Fc(z,b)
-else this.xz(b)},
+else this.VV(b)},
 bu:[function(a){var z,y
-z=$.vu().xV.af.t(0,this.RT)
+z=$.vu().JE.fJ.t(0,this.RT)
 y=this.mn==null?"(no-binding)":"(with-binding)"
 return"["+H.d(new H.cu(H.wO(this),null))+": "+J.AG(this.I6)+"."+H.d(z)+": "+H.d(this.VB)+" "+y+"]"},"$0","gCR",0,0,76]}}],["","",,Y,{
 "^":"",
-hg:{
-"^":"k5d;Hf,ro,XY,cU,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+G0:{
+"^":"k5d;Hf,ro,XY,iS,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gk8:function(a){return J.ZH(a.Hf)},
-gA0:function(a){return J.qy(a.Hf)},
-sA0:function(a,b){J.D4(a.Hf,b)},
-V1:function(a){return J.Z8(a.Hf)},
-gwX:function(a){return J.qy(a.Hf)},
-v3:function(a,b,c){return J.dv(a.Hf,b,c)},
+gG5:function(a){return J.Ee(a.Hf)},
+sG5:function(a,b){J.NA(a.Hf,b)},
+V1:function(a){return J.U2(a.Hf)},
+gwX:function(a){return J.Ee(a.Hf)},
+eX:function(a,b,c){return J.ju(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
 this.kR(a)
-a.Hf=M.Xi(a)
-z=T.Mo(null,C.qY)
-J.D4(a.Hf,new Y.oM(a,z,null))
+a.Hf=M.uH(a)
+z=T.GF(null,C.qY)
+J.NA(a.Hf,new Y.oM(a,z,null))
 $.j6().MM.ml(new Y.lkK(a))},
 $isDT:true,
-$isvy:true,
-static:{Ifw:function(a){var z,y,x,w
+$ishs:true,
+static:{zE:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -16615,21 +16705,21 @@
 C.Gkp.dX(a)
 return a}}},
 GLL:{
-"^":"OH+zs;Cp:n7=",
+"^":"yY+zs;Cp:n7=",
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 $isKV:true},
 k5d:{
-"^":"GLL+d3;R9:ro%,rJ:XY%,xt:cU%",
+"^":"GLL+d3;R9:ro%,rJ:XY%,me:iS%",
 $isd3:true},
 lkK:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.J1(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
+J.mI(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Mrx:{
 "^":"TpZ:12;b",
@@ -16640,35 +16730,35 @@
 y.ZB(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 oM:{
-"^":"Li;dq,Mn,oe",
-XB:function(a){return this.dq}}}],["","",,Z,{
+"^":"Li;dq,xI,oe",
+h5:function(a){return this.dq}}}],["","",,Z,{
 "^":"",
-fd:function(a,b,c){var z,y,x
-z=$.h2().t(0,c)
+LB:function(a,b,c){var z,y,x
+z=$.RO().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.iQ(J.JA(a,"'","\""))
+try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
+DO:{
+"^":"TpZ:81;",
+$2:function(a,b){return a},
+$isEH:true},
 lP:{
 "^":"TpZ:81;",
 $2:function(a,b){return a},
 $isEH:true},
-wJY:{
-"^":"TpZ:81;",
-$2:function(a,b){return a},
-$isEH:true},
-zOQ:{
+Uf:{
 "^":"TpZ:81;",
 $2:function(a,b){var z,y
-try{z=P.zu(a)
+try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
-W6o:{
+Ra:{
 "^":"TpZ:81;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
-MdQ:{
+wJY:{
 "^":"TpZ:81;",
 $2:function(a,b){return H.BU(a,null,new Z.pp(b))},
 $isEH:true},
@@ -16676,7 +16766,7 @@
 "^":"TpZ:12;a",
 $1:function(a){return this.a},
 $isEH:true},
-YJG:{
+zOQ:{
 "^":"TpZ:81;",
 $2:function(a,b){return H.RR(a,new Z.fT(b))},
 $isEH:true},
@@ -16689,10 +16779,10 @@
 if(!!z.$isT8)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
 return z},"$1","PG6",2,0,52,66],
-qN:[function(a){var z=J.x(a)
+SC:[function(a){var z=J.x(a)
 if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.k9(a)),";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Bn",2,0,52,66],
+return z},"$1","Oq",2,0,52,66],
 IK:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,141,"call"],
@@ -16702,10 +16792,10 @@
 $1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,141,"call"],
 $isEH:true},
 QB:{
-"^":"vE;OH,nF,R3,SY,oe",
+"^":"VE;OH,nF,R3,CZ,oe",
 op:function(a,b,c){var z,y,x
 z={}
-y=T.OD(a,null).oK()
+y=T.eHj(a,null).oK()
 if(M.CF(c)){x=J.x(b)
 x=x.n(b,"bind")||x.n(b,"repeat")}else x=!1
 if(x){z=J.x(y)
@@ -16713,22 +16803,22 @@
 else return new T.Xyb(this,y)}z.a=null
 x=!!J.x(c).$ish4
 if(x&&J.xC(b,"class"))z.a=T.PG6()
-else if(x&&J.xC(b,"style"))z.a=T.Bn()
+else if(x&&J.xC(b,"style"))z.a=T.Oq()
 return new T.Ddj(z,this,y)},
-CE:function(a){var z=this.SY.t(0,a)
+CE:function(a){var z=this.CZ.t(0,a)
 if(z==null)return new T.uK(this,a)
-return new T.uKo(this,a,z)},
-jX:function(a){var z,y,x,w,v
+return new T.rc(this,a,z)},
+LR:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=z.gAd(a)
 if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.Xi(a)
+if(M.CF(a)){x=!!z.$ishs?a:M.uH(a)
 z=J.RE(x)
-w=z.gmb(x)
+w=z.gCn(x)
 v=w==null?z.gk8(x):w.k8
 if(!!J.x(v).$isPF)return v
-else return this.R3.t(0,a)}return this.jX(y)},
-fi:function(a,b){var z,y
+else return this.R3.t(0,a)}return this.LR(y)},
+mH:function(a,b){var z,y
 if(a==null)return K.wm(b,this.nF)
 z=J.x(a)
 if(!!z.$ish4);if(!!J.x(b).$isPF)return b
@@ -16738,26 +16828,24 @@
 else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
 return this.W5(a,b)}},
 W5:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Xi(a)
+if(M.CF(a)){z=!!J.x(a).$ishs?a:M.uH(a)
 y=J.RE(z)
-if(y.gmb(z)==null)y.gk8(z)
+if(y.gCn(z)==null)y.gk8(z)
 return this.R3.t(0,a)}else{y=J.RE(a)
 if(y.geT(a)==null){x=this.R3.t(0,a)
 return x!=null?x:K.wm(b,this.nF)}else return this.W5(y.gAd(a),b)}},
-static:{"^":"rp3",Mo:function(a,b){var z,y,x
+static:{"^":"rp3",GF:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.PF])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.mB)
-return new T.QB(b,x,z,y,null)},ct:[function(a){return T.OD(a,null).oK()},"$1","u5",2,0,67],mD:[function(a,b,c,d){var z
-if(c==null){c=P.L5(null,null,null,null,null)
-c.FV(0,C.mB)}z=K.wm(b,c)
-return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.mD(a,b,null,!1)},null,function(a,b,c){return T.mD(a,b,null,c)},null,function(a,b,c){return T.mD(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","yM",4,5,68,22,69]}},
+x.FV(0,C.c7)
+return new T.QB(b,x,z,y,null)},aV:[function(a){return T.eHj(a,null).oK()},"$1","Ms",2,0,67],QP:[function(a,b,c,d){var z=K.wm(b,c)
+return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.QP(a,b,null,!1)},null,function(a,b,c){return T.QP(a,b,null,c)},null,function(a,b,c){return T.QP(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","aC",4,5,68,22,69]}},
 qb:{
 "^":"TpZ:196;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
-z.SY.u(0,b,this.c)
+z.CZ.u(0,b,this.c)
 y=!!J.x(a).$isPF?a:K.wm(a,z.nF)
 z.R3.u(0,b,y)
 return new T.tI(y,null,this.d,null,null,null,null)},"$3",null,6,0,null,185,186,187,"call"],
@@ -16773,7 +16861,7 @@
 $isEH:true},
 Ddj:{
 "^":"TpZ:196;a,UI,bK",
-$3:[function(a,b,c){var z=this.UI.fi(b,a)
+$3:[function(a,b,c){var z=this.UI.mH(b,a)
 if(c===!0)return T.rD(this.bK,z,this.a.a)
 return new T.tI(z,this.a.a,this.bK,null,null,null,null)},"$3",null,6,0,null,185,186,187,"call"],
 $isEH:true},
@@ -16784,9 +16872,9 @@
 y=this.b
 x=z.R3.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.wm(a,z.nF)}else return z.fi(y,a)},"$1",null,2,0,null,185,"call"],
+return K.wm(a,z.nF)}else return z.mH(y,a)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
-uKo:{
+rc:{
 "^":"TpZ:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
@@ -16794,10 +16882,10 @@
 x=z.R3.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.jX(y).t1(w,a)},"$1",null,2,0,null,185,"call"],
+else return z.LR(y).t1(w,a)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;Hk,mo,te,qc,RQ,uZ,Ke",
+"^":"Ap;Hk,mo,te,qc,F0,kg,Ke",
 Ko:function(a){return this.mo.$1(a)},
 AO:function(a){return this.qc.$1(a)},
 Mr:[function(a,b){var z,y
@@ -16816,41 +16904,39 @@
 TR:function(a,b){var z,y
 if(this.qc!=null)throw H.b(P.w("already open"))
 this.qc=b
-z=H.VM(new P.nd(null,0,0,0),[null])
-z.Eo(null,null)
-y=J.okV(this.te,new K.Oy(z))
-this.uZ=y
-z=y.gju().yI(this.gGX())
-z.fm(0,new T.yF(this))
-this.RQ=z
+z=J.okV(this.te,new K.Oy(P.NZ2(null,null)))
+this.kg=z
+y=z.gqM().yI(this.gGX())
+y.fm(0,new T.yF(this))
+this.F0=y
 this.kf(!0)
 return this.Ke},
 kf:function(a){var z,y,x,w,v
-try{x=this.uZ
-J.okV(x,new K.Edh(this.Hk,a))
+try{x=this.kg
+J.okV(x,new K.pf(this.Hk,a))
 x.gBI()
-x=this.Mr(this.uZ.gBI(),a)
+x=this.Mr(this.kg.gBI(),a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
 x=new P.Gc(0,$.X3,null,null,null,null,null,null)
 x.$builtinTypeInfo=[null]
 new P.Zf(x).$builtinTypeInfo=[null]
-v="Error evaluating expression '"+H.d(this.uZ)+"': "+H.d(z)
+v="Error evaluating expression '"+H.d(this.kg)+"': "+H.d(z)
 if(x.YM!==0)H.vh(P.w("Future already completed"))
 x.Nk(v,y)
 return!1}},
 Yg:function(){return this.kf(!1)},
 xO:function(a){var z,y
 if(this.qc==null)return
-this.RQ.Gv()
-this.RQ=null
+this.F0.Gv()
+this.F0=null
 this.qc=null
 z=$.Pk()
-y=this.uZ
+y=this.kg
 z.toString
 J.okV(y,z)
-this.uZ=null},
+this.kg=null},
 fR:function(){if(this.qc!=null)this.Cm()},
 Cm:function(){var z=0
 while(!0){if(!(z<1000&&this.Yg()===!0))break;++z}return z>0},
@@ -16863,16 +16949,16 @@
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 yF:{
 "^":"TpZ:81;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.uZ)+"': "+H.d(a),b)},"$2",null,4,0,null,2,165,"call"],
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.kg)+"': "+H.d(a),b)},"$2",null,4,0,null,2,165,"call"],
 $isEH:true},
 WM:{
 "^":"a;"}}],["","",,B,{
 "^":"",
-LL:{
-"^":"xhq;vq>,Xq,Vg,fn",
+De:{
+"^":"xhq;vq>,Xq,Vg,ij",
 vb:function(a,b){this.vq.yI(new B.iH6(b,this))},
 $asxhq:function(a){return[null]},
-static:{Ha:function(a,b){var z=H.VM(new B.LL(a,null,null,null),[b])
+static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 iH6:{
@@ -16880,130 +16966,132 @@
 $1:[function(a){var z=this.b
 z.Xq=F.Wi(z,C.zd,z.Xq,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"WM",args:[a]}},this.b,"LL")}}}],["","",,K,{
+$signature:function(){return H.oZ(function(a){return{func:"Lf1",args:[a]}},this.b,"De")}}}],["","",,K,{
 "^":"",
-jXm:function(a,b,c,d){var z,y,x,w,v,u,t
-z=H.VM([],[U.rx])
+jXm:function(a,b,c,d){var z,y,x,w,v,u,t,s
+z=H.VM([],[U.hw])
 for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gxS(a),"|"))break
 z.push(y.gT8(a))
 a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.x4
+w=C.OL
 v=!1}else if(!!y.$isvn){w=a.gZs()
 x=a.gmU()
 v=!0}else{if(!!y.$isx9){w=a.gZs()
-x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.Ff
-J.okV(u,new K.GQ(c))
-if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
-else return}t=J.okV(w,new K.GQ(c))
-if(t==null)return
-if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
-else{y=$.vu().xV.T4.t(0,x)
-$.cp().Cq(t,y,b)}return b},
-wm:function(a,b){var z,y,x
-z=new K.ug(a)
-if(b==null)y=z
-else{y=P.L5(null,null,null,P.qU,P.a)
-y.FV(0,b)
-x=new K.Ph(z,y)
-if(y.NZ(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-y=x}return y},
-w12:{
+x=y.goc(a)}else{if(d)throw H.b(K.du("Expression is not assignable: "+H.d(a)))
+return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.lo
+t=J.okV(u,new K.GQ(c))
+if(!J.x(t).$isKq)if(d)throw H.b(K.du("filter must implement Transformer to be assignable: "+H.d(u)))
+else return
+b=t.Kh(b)}s=J.okV(w,new K.GQ(c))
+if(s==null)return
+if(v)J.qQ(s,J.okV(x,new K.GQ(c)),b)
+else{y=$.vu().JE.T4.t(0,x)
+$.cp().Q1(s,y,b)}return b},
+wm:function(a,b){var z,y
+z=P.L5(null,null,null,P.qU,P.a)
+z.FV(0,b)
+y=new K.Ph(new K.nk(a),z)
+if(z.NZ(0,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
+z=y
+return z},
+w5:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.WB(a,b)},
 $isEH:true},
-w13:{
+w10:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.bI(a,b)},
 $isEH:true},
-w14:{
+w11:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
-w15:{
+w12:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.L9(a,b)},
+$2:function(a,b){return J.X9(a,b)},
 $isEH:true},
-w16:{
+w13:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.jOZ(a,b)},
 $isEH:true},
-w17:{
+w14:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
-w18:{
+w15:{
 "^":"TpZ:81;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
-w19:{
+w16:{
 "^":"TpZ:81;",
 $2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
-w20:{
+w17:{
 "^":"TpZ:81;",
 $2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
-w21:{
+w18:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.xZ(a,b)},
 $isEH:true},
-w22:{
+w19:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
-w23:{
+w20:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
-w24:{
+w21:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
-w25:{
+w22:{
 "^":"TpZ:81;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
-w26:{
+w23:{
 "^":"TpZ:81;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
-w27:{
+w24:{
 "^":"TpZ:81;",
-$2:function(a,b){var z=H.Ogz(P.a)
+$2:function(a,b){var z=J.x(b)
+if(!!z.$isKq)return z.At(b,a)
+z=H.Ogz(P.a)
 z=H.KT(z,[z]).Zg(b)
 if(z)return b.$1(a)
-throw H.b(K.zq("Filters must be a one-argument function."))},
+throw H.b(K.du("Filters must be a one-argument function."))},
 $isEH:true},
-w5:{
+lPa:{
 "^":"TpZ:12;",
 $1:function(a){return a},
 $isEH:true},
-w10:{
+Ufa:{
 "^":"TpZ:12;",
-$1:function(a){return J.Lh(a)},
+$1:function(a){return J.jzo(a)},
 $isEH:true},
-w11:{
+Raa:{
 "^":"TpZ:12;",
 $1:function(a){return a!==!0},
 $isEH:true},
 PF:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
-t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+t1:function(a,b){if(J.xC(a,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
 return new K.Rf(this,a,b)},
 $isPF:true,
-$isHX:true,
-$asHX:function(){return[P.qU,P.a]}},
-ug:{
+$isueT:true,
+$asueT:function(){return[P.qU,P.a]}},
+nk:{
 "^":"PF;k8>",
 t:function(a,b){var z,y
 if(J.xC(b,"this"))return this.k8
-z=$.vu().xV.T4.t(0,b)
+z=$.vu().JE.T4.t(0,b)
 y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
-y=$.cp().Gp(y,z)
-return!!J.x(y).$iswS?B.Ha(y,null):y},
+if(y==null||z==null)throw H.b(K.du("variable '"+H.d(b)+"' not found"))
+y=$.cp().jD(y,z)
+return!!J.x(y).$iscb?B.zR(y,null):y},
 tc:function(a){return!J.xC(a,"this")},
 bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gCR",0,0,73]},
 Rf:{
@@ -17013,7 +17101,7 @@
 return z},
 t:function(a,b){var z
 if(J.xC(this.hI,b)){z=this.P
-return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
+return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
 tc:function(a){if(J.xC(this.hI,a))return!1
 return this.eT.tc(a)},
 bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.hI)+"]"},"$0","gCR",0,0,73]},
@@ -17022,40 +17110,40 @@
 gk8:function(a){return this.eT.k8},
 t:function(a,b){var z=this.Z3
 if(z.NZ(0,b)){z=z.t(0,b)
-return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
+return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
 tc:function(a){if(this.Z3.NZ(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.B4(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gCR",0,0,73]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+H.d(H.VM(new P.i5(z),[H.u3(z,0)]))+"]"},"$0","gCR",0,0,73]},
 Ay0:{
-"^":"a;VO?,Xl<",
-gju:function(){var z=this.vO
-return H.VM(new P.Ik(z),[H.u3(z,0)])},
-gXt:function(){return this.KL},
-gBI:function(){return this.Xl},
-MN:function(a){},
-Yo:function(a){var z
+"^":"a;VO?,vt<",
+gqM:function(){var z=this.vO
+return H.VM(new P.rk(z),[H.u3(z,0)])},
+gEV:function(){return this.KL},
+gBI:function(){return this.vt},
+ux:function(a){},
+BZ:function(a){var z
 this.jK(0,a,!1)
 z=this.VO
-if(z!=null)z.Yo(a)},
+if(z!=null)z.BZ(a)},
 fs:function(){var z=this.tj
 if(z!=null){z.Gv()
 this.tj=null}},
 jK:function(a,b,c){var z,y,x
 this.fs()
-z=this.Xl
-this.MN(b)
-if(!c){y=this.Xl
+z=this.vt
+this.ux(b)
+if(!c){y=this.vt
 y=y==null?z!=null:y!==z}else y=!1
 if(y){y=this.vO
-x=this.Xl
+x=this.vt
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(x)}},
 bu:[function(a){return this.KL.bu(0)},"$0","gCR",0,0,73],
-$isrx:true},
-Edh:{
-"^":"cfS;ms,OQ",
-xn:function(a){a.jK(0,this.ms,this.OQ)}},
+$ishw:true},
+pf:{
+"^":"cfS;ms,xZ",
+xn:function(a){a.jK(0,this.ms,this.xZ)}},
 me:{
 "^":"cfS;",
 xn:function(a){a.fs()},
@@ -17063,13 +17151,13 @@
 GQ:{
 "^":"P55;ms",
 W9:function(a){return J.ZH(this.ms)},
-Hs:function(a){return a.o2.RR(0,this)},
+Hs:function(a){return a.ep.RR(0,this)},
 Ci:function(a){var z,y,x
 z=J.okV(a.gZs(),this)
 if(z==null)return
 y=a.goc(a)
-x=$.vu().xV.T4.t(0,y)
-return $.cp().Gp(z,x)},
+x=$.vu().JE.T4.t(0,y)
+return $.cp().jD(z,x)},
 CU:function(a){var z=J.okV(a.gZs(),this)
 if(z==null)return
 return J.UQ(z,J.okV(a.gmU(),this))},
@@ -17082,13 +17170,13 @@
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gnK(a)==null)return H.eC(z,y,P.Te(null))
 x=a.gnK(a)
-v=$.vu().xV.T4.t(0,x)
+v=$.vu().JE.T4.t(0,x)
 return $.cp().Ck(z,v,y,!1,null)},
-I6W:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).br(0)},
+la:function(a){return a.gP(a)},
+Zh:function(a){return H.VM(new H.A8(a.glm(),this.gnG()),[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.u3(y,0)]);y.G();){x=y.Ff
+for(y=a.gJq(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
 z.u(0,J.okV(J.AW(x),this),J.okV(x.gv4(),this))}return z},
 YV:function(a){return H.vh(P.f("should never be called"))},
 qv:function(a){return J.UQ(this.ms,a.gP(a))},
@@ -17102,27 +17190,27 @@
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
 else if(y==null||x==null)return
 return w.$2(y,x)},
-kb:function(a){var z,y
-z=J.okV(a.go2(),this)
-y=$.fs().t(0,a.gxS(a))
+zPR:function(a){var z,y
+z=J.okV(a.gep(),this)
+y=$.EU().t(0,a.gxS(a))
 if(J.xC(a.gxS(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.geE(),this)},
-ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-eS:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
+RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.gHy(),this)},
+kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+pg:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
 "^":"P55;ZG",
-W9:function(a){return new K.Il(a,null,null,null,P.bK(null,null,!1,null))},
-Hs:function(a){return a.o2.RR(0,this)},
+W9:function(a){return new K.WhS(a,null,null,null,P.bK(null,null,!1,null))},
+Hs:function(a){return a.ep.RR(0,this)},
 Ci:function(a){var z,y
 z=J.okV(a.gZs(),this)
-y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
+y=new K.vlk(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.gZs(),this)
 y=J.okV(a.gmU(),this)
-x=new K.iTN(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(x)
 y.sVO(x)
 return x},
@@ -17134,17 +17222,17 @@
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.faZ(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(v)
-if(y!=null)H.bQ(y,new K.zD(v))
+if(y!=null)H.bQ(y,new K.o4(v))
 return v},
-I6W:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
+la:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.UF(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.XV(y))
+H.bQ(z,new K.wr(y))
 return y},
 o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
-y=new K.ev2(z,a,null,null,null,P.bK(null,null,!1,null))
+z=H.VM(new H.A8(a.gJq(a),this.gnG()),[null,null]).tt(0,!1)
+y=new K.ED(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Xs(y))
 return y},
 YV:function(a){var z,y,x
@@ -17158,33 +17246,33 @@
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.ED(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.ky(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(x)
 y.sVO(x)
 return x},
-kb:function(a){var z,y
-z=J.okV(a.go2(),this)
+zPR:function(a){var z,y
+z=J.okV(a.gep(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(y)
 return y},
 RD:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
 y=J.okV(a.gav(),this)
-x=J.okV(a.geE(),this)
-w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+x=J.okV(a.gHy(),this)
+w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(w)
 y.sVO(w)
 x.sVO(w)
 return w},
-ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-eS:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
-zD:{
+kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+pg:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
+o4:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sVO(z)
 return z},
 $isEH:true},
-XV:{
+wr:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sVO(z)
@@ -17196,217 +17284,217 @@
 a.sVO(z)
 return z},
 $isEH:true},
-Il:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
-MN:function(a){this.Xl=J.ZH(a)},
+WhS:{
+"^":"Ay0;KL,VO,tj,vt,vO",
+ux:function(a){this.vt=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.WH]},
-$isWH:true,
-$isrx:true},
+$asAy0:function(){return[U.EO]},
+$isEO:true,
+$ishw:true},
 x5:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
+"^":"Ay0;KL,VO,tj,vt,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-MN:function(a){var z=this.KL
-this.Xl=z.gP(z)},
-RR:function(a,b){return b.I6W(this)},
-$asAy0:function(){return[U.noG]},
-$asnoG:function(){return[null]},
-$isnoG:true,
-$isrx:true},
+ux:function(a){var z=this.KL
+this.vt=z.gP(z)},
+RR:function(a,b){return b.la(this)},
+$asAy0:function(){return[U.Dv]},
+$asDv:function(){return[null]},
+$isDv:true,
+$ishw:true},
 UF:{
-"^":"Ay0;Bx<,KL,VO,tj,Xl,vO",
-MN:function(a){this.Xl=H.VM(new H.A8(this.Bx,new K.Hv()),[null,null]).br(0)},
+"^":"Ay0;lm<,KL,VO,tj,vt,vO",
+ux:function(a){this.vt=H.VM(new H.A8(this.lm,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c0]},
-$isc0:true,
-$isrx:true},
+$asAy0:function(){return[U.c09]},
+$isc09:true,
+$ishw:true},
 Hv:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"],
+$1:[function(a){return a.gvt()},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-ev2:{
-"^":"Ay0;Rl>,KL,VO,tj,Xl,vO",
-MN:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
+ED:{
+"^":"Ay0;Jq>,KL,VO,tj,vt,vO",
+ux:function(a){this.vt=H.n3(this.Jq,P.L5(null,null,null,null,null),new K.Ku())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
-$isrx:true},
+$ishw:true},
 Ku:{
 "^":"TpZ:81;",
-$2:function(a,b){J.kW(a,J.AW(b).gXl(),b.gv4().gXl())
+$2:function(a,b){J.qQ(a,J.AW(b).gvt(),b.gv4().gvt())
 return a},
 $isEH:true},
 EL:{
-"^":"Ay0;nl>,v4<,KL,VO,tj,Xl,vO",
+"^":"Ay0;nl>,v4<,KL,VO,tj,vt,vO",
 RR:function(a,b){return b.YV(this)},
 $asAy0:function(){return[U.nu]},
 $isnu:true,
-$isrx:true},
+$ishw:true},
 ek:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
+"^":"Ay0;KL,VO,tj,vt,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-MN:function(a){var z,y,x,w
+ux:function(a){var z,y,x,w
 z=this.KL
 y=J.U6(a)
-this.Xl=y.t(a,z.gP(z))
+this.vt=y.t(a,z.gP(z))
 if(!a.tc(z.gP(z)))return
 x=y.gk8(a)
 y=J.x(x)
 if(!y.$isd3)return
 z=z.gP(z)
-w=$.vu().xV.T4.t(0,z)
-this.tj=y.gqh(x).yI(new K.OC(this,a,w))},
+w=$.vu().JE.T4.t(0,z)
+this.tj=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,
-$isrx:true},
-OC:{
+$ishw:true},
+j9:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 GC:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;o2<,KL,VO,tj,Xl,vO",
+"^":"Ay0;ep<,KL,VO,tj,vt,vO",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
-MN:function(a){var z,y
+ux:function(a){var z,y
 z=this.KL
-y=$.fs().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"!")){z=this.o2.gXl()
-this.Xl=y.$1(z==null?!1:z)}else{z=this.o2
-this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
-RR:function(a,b){return b.kb(this)},
+y=$.EU().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"!")){z=this.ep.gvt()
+this.vt=y.$1(z==null?!1:z)}else{z=this.ep
+this.vt=z.gvt()==null?null:y.$1(z.gvt())}},
+RR:function(a,b){return b.zPR(this)},
 $asAy0:function(){return[U.FH]},
 $isFH:true,
-$isrx:true},
-ED:{
-"^":"Ay0;Bb>,T8>,KL,VO,tj,Xl,vO",
+$ishw:true},
+ky:{
+"^":"Ay0;Bb>,T8>,KL,VO,tj,vt,vO",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
-MN:function(a){var z,y,x
+ux:function(a){var z,y,x
 z=this.KL
 y=$.YP().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gXl()
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gvt()
 if(z==null)z=!1
-x=this.T8.gXl()
-this.Xl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Xl=y.$2(this.Bb.gXl(),this.T8.gXl())
+x=this.T8.gvt()
+this.vt=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.vt=y.$2(this.Bb.gvt(),this.T8.gvt())
 else{x=this.Bb
-if(x.gXl()==null||this.T8.gXl()==null)this.Xl=null
-else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gXl()).$iswn)this.tj=H.Go(x.gXl(),"$iswn").gXF().yI(new K.P8(this,a))
-this.Xl=y.$2(x.gXl(),this.T8.gXl())}}},
+if(x.gvt()==null||this.T8.gvt()==null)this.vt=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gvt()).$iswn)this.tj=H.Go(x.gvt(),"$iswn").gXF().yI(new K.nV(this,a))
+this.vt=y.$2(x.gvt(),this.T8.gvt())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
-$isrx:true},
-P8:{
+$ishw:true},
+nV:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return this.a.Yo(this.b)},"$1",null,2,0,null,13,"call"],
+$1:[function(a){return this.a.BZ(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-WW:{
-"^":"Ay0;dc<,av<,eE<,KL,VO,tj,Xl,vO",
-MN:function(a){var z=this.dc.gXl()
-this.Xl=(z==null?!1:z)===!0?this.av.gXl():this.eE.gXl()},
+an:{
+"^":"Ay0;dc<,av<,Hy<,KL,VO,tj,vt,vO",
+ux:function(a){var z=this.dc.gvt()
+this.vt=(z==null?!1:z)===!0?this.av.gvt():this.Hy.gvt()},
 RR:function(a,b){return b.RD(this)},
 $asAy0:function(){return[U.x06]},
 $isx06:true,
-$isrx:true},
-vl:{
-"^":"Ay0;Zs<,KL,VO,tj,Xl,vO",
+$ishw:true},
+vlk:{
+"^":"Ay0;Zs<,KL,VO,tj,vt,vO",
 goc:function(a){var z=this.KL
 return z.goc(z)},
-MN:function(a){var z,y,x
-z=this.Zs.gXl()
-if(z==null){this.Xl=null
+ux:function(a){var z,y,x
+z=this.Zs.gvt()
+if(z==null){this.vt=null
 return}y=this.KL
 y=y.goc(y)
-x=$.vu().xV.T4.t(0,y)
-this.Xl=$.cp().Gp(z,x)
+x=$.vu().JE.T4.t(0,y)
+this.vt=$.cp().jD(z,x)
 y=J.x(z)
-if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.Vw(this,a,x))},
+if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.e9n(this,a,x))},
 RR:function(a,b){return b.Ci(this)},
 $asAy0:function(){return[U.x9]},
 $isx9:true,
-$isrx:true},
-Vw:{
+$ishw:true},
+e9n:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 WKb:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-iTN:{
-"^":"Ay0;Zs<,mU<,KL,VO,tj,Xl,vO",
-MN:function(a){var z,y,x
-z=this.Zs.gXl()
-if(z==null){this.Xl=null
-return}y=this.mU.gXl()
+iT:{
+"^":"Ay0;Zs<,mU<,KL,VO,tj,vt,vO",
+ux:function(a){var z,y,x
+z=this.Zs.gvt()
+if(z==null){this.vt=null
+return}y=this.mU.gvt()
 x=J.U6(z)
-this.Xl=x.t(z,y)
-if(!!x.$iswn)this.tj=z.gXF().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.z5(this,a,y))},
+this.vt=x.t(z,y)
+if(!!x.$iswn)this.tj=z.gXF().yI(new K.jai(this,a,y))
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.FAT(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy0:function(){return[U.vn]},
 $isvn:true,
-$isrx:true},
-tE:{
+$ishw:true},
+jai:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GST(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.zw(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
-GST:{
+zw:{
 "^":"TpZ:12;d",
 $1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-z5:{
+FAT:{
 "^":"TpZ:12;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.Yo(this.f)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.BZ(this.f)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 ey:{
 "^":"TpZ:12;bK",
 $1:[function(a){return!!J.x(a).$isya&&J.xC(a.nl,this.bK)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 faZ:{
-"^":"Ay0;Zs<,re<,KL,VO,tj,Xl,vO",
+"^":"Ay0;Zs<,re<,KL,VO,tj,vt,vO",
 gnK:function(a){var z=this.KL
 return z.gnK(z)},
-MN:function(a){var z,y,x,w
+ux:function(a){var z,y,x,w
 z=this.re
 z.toString
-y=H.VM(new H.A8(z,new K.vQ()),[null,null]).br(0)
-x=this.Zs.gXl()
-if(x==null){this.Xl=null
+y=H.VM(new H.A8(z,new K.BGc()),[null,null]).br(0)
+x=this.Zs.gvt()
+if(x==null){this.vt=null
 return}z=this.KL
 if(z.gnK(z)==null){z=H.eC(x,y,P.Te(null))
-this.Xl=!!J.x(z).$iswS?B.Ha(z,null):z}else{z=z.gnK(z)
-w=$.vu().xV.T4.t(0,z)
-this.Xl=$.cp().Ck(x,w,y,!1,null)
+this.vt=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gnK(z)
+w=$.vu().JE.T4.t(0,z)
+this.vt=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.BGc(this,a,w))}},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.WWJ(this,a,w))}},
 RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.RWc]},
 $isRWc:true,
-$isrx:true},
-vQ:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
-$isEH:true},
+$ishw:true},
 BGc:{
-"^":"TpZ:199;a,b,c",
-$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gvt()},"$1",null,2,0,null,49,"call"],
 $isEH:true},
-ho:{
+WWJ:{
+"^":"TpZ:199;a,b,c",
+$1:[function(a){if(J.VA(a,new K.Kr(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$isEH:true},
+Kr:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-XX:{
+nD:{
 "^":"a;G1>",
 bu:[function(a){return"EvalException: "+this.G1},"$0","gCR",0,0,73],
-static:{zq:function(a){return new K.XX(a)}}}}],["","",,U,{
+static:{du:function(a){return new K.nD(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -17415,58 +17503,58 @@
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
 if(!J.xC(y,b[z]))return!1}return!0},
-N4:function(a){a.toString
-return U.Le(H.n3(a,0,new U.lc()))},
+pz:function(a){a.toString
+return U.OT(H.n3(a,0,new U.lc()))},
 C0C:function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-Le:function(a){if(typeof a!=="number")return H.s(a)
+OT: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)},
-Fs:{
+tu:{
 "^":"a;",
 Bf:[function(a,b,c){return new U.vn(b,c)},"$2","gvH",4,0,200,2,49]},
-rx:{
+hw:{
 "^":"a;",
-$isrx:true},
-WH:{
-"^":"rx;",
+$ishw:true},
+EO:{
+"^":"hw;",
 RR:function(a,b){return b.W9(this)},
-$isWH:true},
-noG:{
-"^":"rx;P>",
-RR:function(a,b){return b.I6W(this)},
+$isEO:true},
+Dv:{
+"^":"hw;P>",
+RR:function(a,b){return b.la(this)},
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
-z=H.RB(b,"$isnoG",[H.u3(this,0)],"$asnoG")
+z=H.RB(b,"$isDv",[H.u3(this,0)],"$asDv")
 return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isnoG:true},
-c0:{
-"^":"rx;Bx<",
+$isDv:true},
+c09:{
+"^":"hw;lm<",
 RR:function(a,b){return b.Zh(this)},
-bu:[function(a){return H.d(this.Bx)},"$0","gCR",0,0,73],
+bu:[function(a){return H.d(this.lm)},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc0&&U.Pu(b.gBx(),this.Bx)},
-giO:function(a){return U.N4(this.Bx)},
-$isc0:true},
+return!!J.x(b).$isc09&&U.Pu(b.glm(),this.lm)},
+giO:function(a){return U.pz(this.lm)},
+$isc09:true},
 Mm:{
-"^":"rx;Rl>",
+"^":"hw;Jq>",
 RR:function(a,b){return b.o0(this)},
-bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gCR",0,0,73],
+bu:[function(a){return"{"+H.d(this.Jq)+"}"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isMm&&U.Pu(z.gRl(b),this.Rl)},
-giO:function(a){return U.N4(this.Rl)},
+return!!z.$isMm&&U.Pu(z.gJq(b),this.Jq)},
+giO:function(a){return U.pz(this.Jq)},
 $isMm:true},
 nu:{
-"^":"rx;nl>,v4<",
+"^":"hw;nl>,v4<",
 RR:function(a,b){return b.YV(this)},
 bu:[function(a){return this.nl.bu(0)+": "+H.d(this.v4)},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17476,18 +17564,18 @@
 giO:function(a){var z,y
 z=J.v1(this.nl.P)
 y=J.v1(this.v4)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isnu:true},
 XC:{
-"^":"rx;o2",
+"^":"hw;ep",
 RR:function(a,b){return b.Hs(this)},
-bu:[function(a){return"("+H.d(this.o2)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"("+H.d(this.ep)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.xC(b.o2,this.o2)},
-giO:function(a){return J.v1(this.o2)},
+return!!J.x(b).$isXC&&J.xC(b.ep,this.ep)},
+giO:function(a){return J.v1(this.ep)},
 $isXC:true},
 fp:{
-"^":"rx;P>",
+"^":"hw;P>",
 RR:function(a,b){return b.qv(this)},
 bu:[function(a){return this.P},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17497,20 +17585,20 @@
 giO:function(a){return J.v1(this.P)},
 $isfp:true},
 FH:{
-"^":"rx;xS>,o2<",
-RR:function(a,b){return b.kb(this)},
-bu:[function(a){return H.d(this.xS)+" "+H.d(this.o2)},"$0","gCR",0,0,73],
+"^":"hw;xS>,ep<",
+RR:function(a,b){return b.zPR(this)},
+bu:[function(a){return H.d(this.xS)+" "+H.d(this.ep)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.go2(),this.o2)},
+return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.gep(),this.ep)},
 giO:function(a){var z,y
 z=J.v1(this.xS)
-y=J.v1(this.o2)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+y=J.v1(this.ep)
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isFH:true},
 uku:{
-"^":"rx;xS>,Bb>,T8>",
+"^":"hw;xS>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17521,23 +17609,23 @@
 z=J.v1(this.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
 x06:{
-"^":"rx;dc<,av<,eE<",
+"^":"hw;dc<,av<,Hy<",
 RR:function(a,b){return b.RD(this)},
-bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.eE)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.Hy)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isx06&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.geE(),this.eE)},
+return!!J.x(b).$isx06&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.gHy(),this.Hy)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
 y=J.v1(this.av)
-x=J.v1(this.eE)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+x=J.v1(this.Hy)
+return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isx06:true},
 X7S:{
-"^":"rx;Bb>,T8>",
-RR:function(a,b){return b.ky(this)},
+"^":"hw;Bb>,T8>",
+RR:function(a,b){return b.kz(this)},
 gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
@@ -17548,27 +17636,27 @@
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
 $isDI:true},
-Sc:{
-"^":"rx;Bb>,T8>",
-RR:function(a,b){return b.eS(this)},
+NM:{
+"^":"hw;Bb>,T8>",
+RR:function(a,b){return b.pg(this)},
 gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
 bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isSc&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
+return!!J.x(b).$isNM&&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))},
-$isSc:true,
+return U.OT(U.C0C(U.C0C(0,z),y))},
+$isNM:true,
 $isDI:true},
 vn:{
-"^":"rx;Zs<,mU<",
+"^":"hw;Zs<,mU<",
 RR:function(a,b){return b.CU(this)},
 bu:[function(a){return H.d(this.Zs)+"["+H.d(this.mU)+"]"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
@@ -17576,10 +17664,10 @@
 giO:function(a){var z,y
 z=J.v1(this.Zs)
 y=J.v1(this.mU)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isvn:true},
 x9:{
-"^":"rx;Zs<,oc>",
+"^":"hw;Zs<,oc>",
 RR:function(a,b){return b.Ci(this)},
 bu:[function(a){return H.d(this.Zs)+"."+H.d(this.oc)},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17589,10 +17677,10 @@
 giO:function(a){var z,y
 z=J.v1(this.Zs)
 y=J.v1(this.oc)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isx9:true},
 RWc:{
-"^":"rx;Zs<,nK>,re<",
+"^":"hw;Zs<,nK>,re<",
 RR:function(a,b){return b.Y7(this)},
 bu:[function(a){return H.d(this.Zs)+"."+H.d(this.nK)+"("+H.d(this.re)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17602,8 +17690,8 @@
 giO:function(a){var z,y,x
 z=J.v1(this.Zs)
 y=J.v1(this.nK)
-x=U.N4(this.re)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+x=U.pz(this.re)
+return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isRWc:true},
 lc:{
 "^":"TpZ:81;",
@@ -17612,68 +17700,57 @@
 "^":"",
 FX:{
 "^":"a;Wi,f7,JR,V6",
-gVd:function(){return this.V6.Ff},
+gVd:function(){return this.V6.lo},
 oK:function(){var z=this.f7.zl()
 this.JR=z
 this.V6=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])
 this.jz()
 return this.VK()},
 Jn:function(a,b){var z
-if(a!=null){z=this.V6.Ff
+if(a!=null){z=this.V6.lo
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.V6.Ff
+if(!z)if(b!=null){z=this.V6.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.gVd())))
 this.V6.G()},
 jz:function(){return this.Jn(null,null)},
 IH:function(a){return this.Jn(a,null)},
-VK:function(){if(this.V6.Ff==null){this.Wi.toString
-return C.x4}var z=this.ZR()
-return z==null?null:this.Ay(z,0)},
-Ay:function(a,b){var z,y,x,w,v,u
-for(;z=this.V6.Ff,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.Ff),"(")){y=this.Hr()
-this.Wi.toString
-a=new U.RWc(a,null,y)}else if(J.xC(J.Vm(this.V6.Ff),"[")){x=this.le()
-this.Wi.toString
-a=new U.vn(a,x)}else break
-else if(J.xC(J.Iz(this.V6.Ff),3)){this.jz()
-a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.Ff),10))if(J.xC(J.Vm(this.V6.Ff),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
+VK:function(){if(this.V6.lo==null)return C.OL
+var z=this.ZR()
+return z==null?null:this.lM(z,0)},
+lM:function(a,b){var z,y,x
+for(;z=this.V6.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.lo),"("))a=new U.RWc(a,null,this.Hr())
+else if(J.xC(J.Vm(this.V6.lo),"["))a=new U.vn(a,this.FD())
+else break
+else if(J.xC(J.Iz(this.V6.lo),3)){this.jz()
+a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.lo),10))if(J.xC(J.Vm(this.V6.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
 this.jz()
-w=this.VK()
-this.Wi.toString
-a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.V6.Ff),"as")){this.jz()
-w=this.VK()
-if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.Wi.toString
-a=new U.Sc(a,w)}else break
-else{if(J.xC(J.Iz(this.V6.Ff),8)){z=this.V6.Ff.gG8()
+a=new U.X7S(a,this.VK())}else if(J.xC(J.Vm(this.V6.lo),"as")){this.jz()
+y=this.VK()
+if(!J.x(y).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
+a=new U.NM(a,y)}else break
+else{if(J.xC(J.Iz(this.V6.lo),8)){z=this.V6.lo.gG8()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.V6.Ff),"?")){this.Jn(8,"?")
-v=this.VK()
+if(z)if(J.xC(J.Vm(this.V6.lo),"?")){this.Jn(8,"?")
+x=this.VK()
 this.IH(5)
-u=this.VK()
-this.Wi.toString
-a=new U.x06(a,v,u)}else a=this.Ax(a)
+a=new U.x06(a,x,this.VK())}else a=this.Ax(a)
 else break}return a},
-JuP:function(a,b){var z,y
-z=J.x(b)
-if(!!z.$isfp){z=z.gP(b)
-this.Wi.toString
-return new U.x9(a,z)}else if(!!z.$isRWc&&!!J.x(b.gZs()).$isfp){z=J.Vm(b.gZs())
-y=b.gre()
-this.Wi.toString
-return new U.RWc(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
+JuP:function(a,b){var z=J.x(b)
+if(!!z.$isfp)return new U.x9(a,z.gP(b))
+else if(!!z.$isRWc&&!!J.x(b.gZs()).$isfp)return new U.RWc(a,J.Vm(b.gZs()),b.gre())
+else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 Ax:function(a){var z,y,x,w,v
-z=this.V6.Ff
+z=this.V6.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.jz()
 x=this.ZR()
-while(!0){w=this.V6.Ff
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.Ff),3)||J.xC(J.Iz(this.V6.Ff),9)){w=this.V6.Ff.gG8()
+while(!0){w=this.V6.lo
+if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.lo),3)||J.xC(J.Iz(this.V6.lo),9)){w=this.V6.lo.gG8()
 v=z.gG8()
 if(typeof w!=="number")return w.D()
 if(typeof v!=="number")return H.s(v)
@@ -17681,178 +17758,150 @@
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.Ay(x,this.V6.Ff.gG8())}y=y.gP(z)
-this.Wi.toString
-return new U.uku(y,a,x)},
-ZR:function(){var z,y,x,w
-if(J.xC(J.Iz(this.V6.Ff),8)){z=J.Vm(this.V6.Ff)
+x=this.lM(x,this.V6.lo.gG8())}return new U.uku(y.gP(z),a,x)},
+ZR:function(){var z,y
+if(J.xC(J.Iz(this.V6.lo),8)){z=J.Vm(this.V6.lo)
 y=J.x(z)
 if(y.n(z,"+")||y.n(z,"-")){this.jz()
-if(J.xC(J.Iz(this.V6.Ff),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.V6.Ff)),null,null)
-this.Wi.toString
-z=new U.noG(y)
+if(J.xC(J.Iz(this.V6.lo),6)){z=new U.Dv(H.BU(H.d(z)+H.d(J.Vm(this.V6.lo)),null,null))
 z.$builtinTypeInfo=[null]
 this.jz()
-return z}else{y=this.Wi
-if(J.xC(J.Iz(this.V6.Ff),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.V6.Ff)),null)
-y.toString
-z=new U.noG(x)
+return z}else if(J.xC(J.Iz(this.V6.lo),7)){z=new U.Dv(H.RR(H.d(z)+H.d(J.Vm(this.V6.lo)),null))
 z.$builtinTypeInfo=[null]
 this.jz()
-return z}else{w=this.Ay(this.LE(),11)
-y.toString
-return new U.FH(z,w)}}}else if(y.n(z,"!")){this.jz()
-w=this.Ay(this.LE(),11)
-this.Wi.toString
-return new U.FH(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
+return z}else return new U.FH(z,this.lM(this.LE(),11))}else if(y.n(z,"!")){this.jz()
+return new U.FH(z,this.lM(this.LE(),11))}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
 LE:function(){var z,y
-switch(J.Iz(this.V6.Ff)){case 10:z=J.Vm(this.V6.Ff)
+switch(J.Iz(this.V6.lo)){case 10:z=J.Vm(this.V6.lo)
 if(J.xC(z,"this")){this.jz()
-this.Wi.toString
 return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
 case 2:return this.Yj()
 case 1:return this.Dy()
 case 6:return this.c9()
 case 7:return this.eD()
-case 9:if(J.xC(J.Vm(this.V6.Ff),"(")){this.jz()
+case 9:if(J.xC(J.Vm(this.V6.lo),"(")){this.jz()
 y=this.VK()
 this.Jn(9,")")
-this.Wi.toString
-return new U.XC(y)}else if(J.xC(J.Vm(this.V6.Ff),"{"))return this.hR()
-else if(J.xC(J.Vm(this.V6.Ff),"["))return this.U3()
+return new U.XC(y)}else if(J.xC(J.Vm(this.V6.lo),"{"))return this.I1()
+else if(J.xC(J.Vm(this.V6.lo),"["))return this.U3()
 return
 case 5:throw H.b(Y.RV("unexpected token \":\""))
 default:return}},
 U3:function(){var z,y
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"]"))break
+if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),"]"))break
 z.push(this.VK())
-y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
+y=this.V6.lo}while(y!=null&&J.xC(J.Vm(y),","))
 this.Jn(9,"]")
-return new U.c0(z)},
-hR:function(){var z,y,x
+return new U.c09(z)},
+I1:function(){var z,y,x
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"}"))break
-y=J.Vm(this.V6.Ff)
-this.Wi.toString
-x=new U.noG(y)
-x.$builtinTypeInfo=[null]
+if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),"}"))break
+y=new U.Dv(J.Vm(this.V6.lo))
+y.$builtinTypeInfo=[null]
 this.jz()
 this.Jn(5,":")
-z.push(new U.nu(x,this.VK()))
-y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
+z.push(new U.nu(y,this.VK()))
+x=this.V6.lo}while(x!=null&&J.xC(J.Vm(x),","))
 this.Jn(9,"}")
 return new U.Mm(z)},
 Yj:function(){var z,y,x
-if(J.xC(J.Vm(this.V6.Ff),"true")){this.jz()
-this.Wi.toString
-return H.VM(new U.noG(!0),[null])}if(J.xC(J.Vm(this.V6.Ff),"false")){this.jz()
-this.Wi.toString
-return H.VM(new U.noG(!1),[null])}if(J.xC(J.Vm(this.V6.Ff),"null")){this.jz()
-this.Wi.toString
-return H.VM(new U.noG(null),[null])}if(!J.xC(J.Iz(this.V6.Ff),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
-z=J.Vm(this.V6.Ff)
+if(J.xC(J.Vm(this.V6.lo),"true")){this.jz()
+return H.VM(new U.Dv(!0),[null])}if(J.xC(J.Vm(this.V6.lo),"false")){this.jz()
+return H.VM(new U.Dv(!1),[null])}if(J.xC(J.Vm(this.V6.lo),"null")){this.jz()
+return H.VM(new U.Dv(null),[null])}if(!J.xC(J.Iz(this.V6.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
+z=J.Vm(this.V6.lo)
 this.jz()
-this.Wi.toString
 y=new U.fp(z)
 x=this.Hr()
 if(x==null)return y
 else return new U.RWc(y,null,x)},
 Hr:function(){var z,y
-z=this.V6.Ff
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"(")){y=[]
+z=this.V6.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.lo),"(")){y=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),")"))break
+if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),")"))break
 y.push(this.VK())
-z=this.V6.Ff}while(z!=null&&J.xC(J.Vm(z),","))
+z=this.V6.lo}while(z!=null&&J.xC(J.Vm(z),","))
 this.Jn(9,")")
 return y}return},
-le:function(){var z,y
-z=this.V6.Ff
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"[")){this.jz()
+FD:function(){var z,y
+z=this.V6.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.lo),"[")){this.jz()
 y=this.VK()
 this.Jn(9,"]")
 return y}return},
-Dy:function(){var z,y
-z=J.Vm(this.V6.Ff)
-this.Wi.toString
-y=H.VM(new U.noG(z),[null])
+Dy:function(){var z=H.VM(new U.Dv(J.Vm(this.V6.lo)),[null])
 this.jz()
-return y},
-Rb:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.V6.Ff)),null,null)
-this.Wi.toString
-y=H.VM(new U.noG(z),[null])
+return z},
+Rb:function(a){var z=H.VM(new U.Dv(H.BU(H.d(a)+H.d(J.Vm(this.V6.lo)),null,null)),[null])
 this.jz()
-return y},
+return z},
 c9:function(){return this.Rb("")},
-XO:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.V6.Ff)),null)
-this.Wi.toString
-y=H.VM(new U.noG(z),[null])
+XO:function(a){var z=H.VM(new U.Dv(H.RR(H.d(a)+H.d(J.Vm(this.V6.lo)),null)),[null])
 this.jz()
-return y},
+return z},
 eD:function(){return this.XO("")},
-static:{OD:function(a,b){var z,y,x
-z=H.VM([],[Y.qS])
+static:{eHj:function(a,b){var z,y,x
+z=H.VM([],[Y.PnY])
 y=P.p9("")
-x=new U.Fs()
-return new T.FX(x,new Y.dd(z,y,new P.ysG(a,0,0,null),null),null,null)}}}}],["","",,K,{
+x=new U.tu()
+return new T.FX(x,new Y.hc6(z,y,new P.Kg(a,0,0,null),null),null,null)}}}}],["","",,K,{
 "^":"",
-eq:[function(a){return H.VM(new K.Bt(a),[null])},"$1","FLA",2,0,70,71],
-Aep:{
+Dce:[function(a){return H.VM(new K.Bt(a),[null])},"$1","HZg",2,0,70,71],
+O1:{
 "^":"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)},
+return!!J.x(b).$isO1&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
 giO:function(a){return J.v1(this.P)},
 bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gCR",0,0,73],
-$isAep:true},
+$isO1:true},
 Bt:{
-"^":"mW;FD",
-gA:function(a){var z=new K.vR(J.mY(this.FD),0,null)
+"^":"mW;ty",
+gA:function(a){var z=new K.kd(J.mY(this.ty),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.FD)},
-gl0:function(a){return J.FN(this.FD)},
-gqG:function(a){var z=new K.Aep(0,J.bT(this.FD))
+gB:function(a){return J.q8(this.ty)},
+gl0:function(a){return J.FN(this.ty)},
+gtH:function(a){var z=new K.O1(0,J.Es(this.ty))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 grZ:function(a){var z,y
-z=this.FD
+z=this.ty
 y=J.U6(z)
-z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
+z=new K.O1(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:{
+$asmW:function(a){return[[K.O1,a]]},
+$asQV:function(a){return[[K.O1,a]]}},
+kd:{
 "^":"Anv;FU,vk,Uh",
 gl:function(){return this.Uh},
 G:function(){var z=this.FU
-if(z.G()){this.Uh=H.VM(new K.Aep(this.vk++,z.gl()),[null])
+if(z.G()){this.Uh=H.VM(new K.O1(this.vk++,z.gl()),[null])
 return!0}this.Uh=null
 return!1},
-$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
+$asAnv:function(a){return[[K.O1,a]]}}}],["","",,Y,{
 "^":"",
-wX:function(a){switch(a){case 102:return 12
+Ox: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:{
+PnY:{
 "^":"a;fY>,P>,G8<",
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gCR",0,0,73],
-$isqS:true},
-dd:{
-"^":"a;dE,Lz,Te,x0",
+bu:[function(a){return"("+this.fY+", '"+H.d(this.P)+"')"},"$0","gCR",0,0,73],
+$isPnY:true},
+hc6:{
+"^":"a;Bv,Lz,LP,pV",
 zl:function(){var z,y,x,w,v,u,t,s
-z=this.Te
-this.x0=z.G()?z.ft:null
-for(y=this.dE;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.ft:null
+z=this.LP
+this.pV=z.G()?z.ft:null
+for(y=this.Bv;x=this.pV,x!=null;)if(x===32||x===9||x===160)this.pV=z.G()?z.ft:null
 else if(x===34||x===39)this.DS()
 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
@@ -17860,44 +17909,45 @@
 if(w)this.y3()
 else if(48<=x&&x<=57)this.jj()
 else if(x===46){x=z.G()?z.ft:null
-this.x0=x
+this.pV=x
 if(typeof x!=="number")return H.s(x)
 if(48<=x&&x<=57)this.e1()
-else y.push(new Y.qS(3,".",11))}else if(x===44){this.x0=z.G()?z.ft:null
-y.push(new Y.qS(4,",",0))}else if(x===58){this.x0=z.G()?z.ft:null
-y.push(new Y.qS(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.x0
+else y.push(new Y.PnY(3,".",11))}else if(x===44){this.pV=z.G()?z.ft:null
+y.push(new Y.PnY(4,",",0))}else if(x===58){this.pV=z.G()?z.ft:null
+y.push(new Y.PnY(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.pV
 x=z.G()?z.ft:null
-this.x0=x
-if(C.Nm.tg(C.bg,x)){x=this.x0
-u=H.eT([v,x])
+this.pV=x
+if(C.Nm.tg(C.bg,x)){x=this.pV
+u=H.LY([v,x])
 if(C.Nm.tg(C.ip,u)){x=z.G()?z.ft:null
-this.x0=x
+this.pV=x
 if(x===61)x=v===33||v===61
 else x=!1
 if(x){t=u+"="
-this.x0=z.G()?z.ft:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
-y.push(new Y.qS(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.mx(this.x0)
-y.push(new Y.qS(9,s,C.w0.t(0,s)))
-this.x0=z.G()?z.ft:null}else this.x0=z.G()?z.ft:null}return y},
+this.pV=z.G()?z.ft:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
+y.push(new Y.PnY(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.ML,this.pV)){s=H.mx(this.pV)
+y.push(new Y.PnY(9,s,C.w0.t(0,s)))
+this.pV=z.G()?z.ft:null}else this.pV=z.G()?z.ft:null}return y},
 DS:function(){var z,y,x,w
-z=this.x0
-y=this.Te
+z=this.pV
+y=this.LP
 x=y.G()?y.ft:null
-this.x0=x
+this.pV=x
 for(w=this.Lz;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
 if(x===92){x=y.G()?y.ft:null
-this.x0=x
+this.pV=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.mx(Y.wX(x))
+x=H.mx(Y.Ox(x))
 w.IN+=x}else{x=H.mx(x)
 w.IN+=x}x=y.G()?y.ft:null
-this.x0=x}this.dE.push(new Y.qS(1,w.IN,0))
+this.pV=x}x=w.IN
+this.Bv.push(new Y.PnY(1,x.charCodeAt(0)==0?x:x,0))
 w.IN=""
-this.x0=y.G()?y.ft:null},
+this.pV=y.G()?y.ft:null},
 y3:function(){var z,y,x,w,v
-z=this.Te
+z=this.LP
 y=this.Lz
-while(!0){x=this.x0
+while(!0){x=this.pV
 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
@@ -17905,42 +17955,45 @@
 if(!w)break
 x=H.mx(x)
 y.IN+=x
-this.x0=z.G()?z.ft:null}v=y.IN
-z=this.dE
-if(C.Nm.tg(C.jY,v))z.push(new Y.qS(10,v,0))
-else z.push(new Y.qS(2,v,0))
+this.pV=z.G()?z.ft:null}z=y.IN
+v=z.charCodeAt(0)==0?z:z
+z=this.Bv
+if(C.Nm.tg(C.jY,v))z.push(new Y.PnY(10,v,0))
+else z.push(new Y.PnY(2,v,0))
 y.IN=""},
 jj:function(){var z,y,x,w
-z=this.Te
+z=this.LP
 y=this.Lz
-while(!0){x=this.x0
+while(!0){x=this.pV
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
 y.IN+=x
-this.x0=z.G()?z.ft:null}if(x===46){z=z.G()?z.ft:null
-this.x0=z
+this.pV=z.G()?z.ft:null}if(x===46){z=z.G()?z.ft:null
+this.pV=z
 if(typeof z!=="number")return H.s(z)
 if(48<=z&&z<=57)this.e1()
-else this.dE.push(new Y.qS(3,".",11))}else{this.dE.push(new Y.qS(6,y.IN,0))
+else this.Bv.push(new Y.PnY(3,".",11))}else{z=y.IN
+this.Bv.push(new Y.PnY(6,z.charCodeAt(0)==0?z:z,0))
 y.IN=""}},
 e1:function(){var z,y,x,w
 z=this.Lz
 z.KF(H.mx(46))
-y=this.Te
-while(!0){x=this.x0
+y=this.LP
+while(!0){x=this.pV
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
 z.IN+=x
-this.x0=y.G()?y.ft:null}this.dE.push(new Y.qS(7,z.IN,0))
+this.pV=y.G()?y.ft:null}y=z.IN
+this.Bv.push(new Y.PnY(7,y.charCodeAt(0)==0?y:y,0))
 z.IN=""}},
-hAN:{
+Em:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"$0","gCR",0,0,73],
-static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
+static:{RV:function(a){return new Y.Em(a)}}}}],["","",,S,{
 "^":"",
 P55:{
 "^":"a;",
@@ -17949,7 +18002,7 @@
 "^":"P55;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-Hs:function(a){a.o2.RR(0,this)
+Hs:function(a){a.ep.RR(0,this)
 this.xn(a)},
 Ci:function(a){J.okV(a.gZs(),this)
 this.xn(a)},
@@ -17958,14 +18011,14 @@
 this.xn(a)},
 Y7:function(a){var z
 J.okV(a.gZs(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-I6W:function(a){this.xn(a)},
+la:function(a){this.xn(a)},
 Zh:function(a){var z
-for(z=a.gBx(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
+for(z=a.glm(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(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.u3(z,0)]);z.G();)J.okV(z.Ff,this)
+for(z=a.gJq(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 YV:function(a){J.okV(a.gnl(a),this)
 J.okV(a.gv4(),this)
@@ -17974,31 +18027,31 @@
 ex:function(a){J.okV(a.gBb(a),this)
 J.okV(a.gT8(a),this)
 this.xn(a)},
-kb:function(a){J.okV(a.go2(),this)
+zPR:function(a){J.okV(a.gep(),this)
 this.xn(a)},
 RD:function(a){J.okV(a.gdc(),this)
 J.okV(a.gav(),this)
-J.okV(a.geE(),this)
+J.okV(a.gHy(),this)
 this.xn(a)},
-ky:function(a){a.Bb.RR(0,this)
+kz:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
-eS:function(a){a.Bb.RR(0,this)
+pg:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V53;Ny,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gtu:function(a){return a.Ny},
-stu:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
+"^":"V54;oX,t7,fI,Fd,hX,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gtu:function(a){return a.oX},
+stu:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
 gfg:function(a){return a.t7},
 sfg:function(a,b){a.t7=this.ct(a,C.A7,a.t7,b)},
-gGV:function(a){return a.fI},
-sGV:function(a,b){a.fI=this.ct(a,C.vY,a.fI,b)},
+gX7:function(a){return a.fI},
+sX7:function(a,b){a.fI=this.ct(a,C.vY,a.fI,b)},
 gLf:function(a){return a.Fd},
 sLf:function(a,b){a.Fd=this.ct(a,C.IT,a.Fd,b)},
-gMl:function(a){return a.cI},
-sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,b)},
+gJb:function(a){return a.hX},
+sJb:function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},
 gML:function(a){return a.He},
 sML:function(a,b){a.He=this.ct(a,C.kI,a.He,b)},
 gxT:function(a){return a.xo},
@@ -18009,45 +18062,45 @@
 sTj:function(a,b){a.PZ=this.ct(a,C.uG,a.PZ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
-W7:function(a){var z,y
+qV:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
+vr:function(a){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
 else z.scrollIntoView()}},
-qA:[function(a,b,c){this.W7(a)},"$2","giH",4,0,202,203,204],
+pLm:[function(a,b,c){this.vr(a)},"$2","gcL",4,0,202,203,204],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
-if(z!=null){y=W.Ws(this.giH(a))
+if(z!=null){y=W.Ws(this.gcL(a))
 a.Nf=y
 C.S2.OT(y,z,!0)}},
-Lx:function(a){var z=a.Nf
+dQ:function(a){var z=a.Nf
 if(z!=null){z.disconnect()
-a.Nf=null}Z.uL.prototype.Lx.call(this,a)},
+a.Nf=null}Z.uL.prototype.dQ.call(this,a)},
 mN:[function(a,b){this.Um(a)
-this.W7(a)},"$1","goL",2,0,19,59],
-KC:[function(a,b){this.Um(a)},"$1","giB",2,0,19,59],
-Ti:[function(a,b){this.Um(a)},"$1","gP3",2,0,19,59],
+this.vr(a)},"$1","goL",2,0,19,59],
+Yo:[function(a,b){this.Um(a)},"$1","gLe",2,0,19,59],
+Ti:[function(a,b){this.Um(a)},"$1","gRq",2,0,19,59],
 Vj:[function(a,b){this.Um(a)},"$1","gcY",2,0,19,59],
 Um:function(a){var z,y,x
 a.PZ=this.ct(a,C.uG,a.PZ,!1)
 if(a.D6!=null)return
-z=a.Ny
+z=a.oX
 if(z==null)return
-if(J.iS(z)!==!0){a.D6=J.SK(a.Ny).ml(new T.Es(a))
+if(J.iS(z)!==!0){a.D6=J.SK(a.oX).ml(new T.oEe(a))
 return}z=a.Fd
-z=z!=null?a.Ny.q6(z):1
+z=z!=null?a.oX.q6(z):1
 a.xo=this.ct(a,C.nt,a.xo,z)
 z=a.fI
-z=z!=null?a.Ny.q6(z):null
+z=z!=null?a.oX.q6(z):null
 a.He=this.ct(a,C.kI,a.He,z)
-z=a.cI
-y=a.Ny
+z=a.hX
+y=a.oX
 z=z!=null?y.q6(z):J.q8(J.de(y))
 a.ZJ=this.ct(a,C.vs,a.ZJ,z)
-J.Z8(a.Kf)
-for(x=J.bI(a.xo,1);z=J.Wx(x),z.E(x,J.bI(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),x))
+J.U2(a.Kf)
+for(x=J.bI(a.xo,1);z=J.Wx(x),z.E(x,J.bI(a.ZJ,1));x=z.g(x,1))J.dH(a.Kf,J.UQ(J.de(a.oX),x))
 a.PZ=this.ct(a,C.uG,a.PZ,!0)},
 static:{Zz:function(a){var z,y,x,w,v
 z=R.tB([])
@@ -18059,27 +18112,27 @@
 a.t7=null
 a.PZ=!1
 a.Kf=z
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.za.LX(a)
-C.za.XI(a)
+C.vy.LX(a)
+C.vy.XI(a)
 return a}}},
-V53:{
+V54:{
 "^":"uL+Pi;",
 $isd3:true},
-Es:{
+oEe:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.Ny)===!0){z.D6=null
-J.XP(z)}},"$1",null,2,0,null,13,"call"],
+if(J.iS(z.oX)===!0){z.D6=null
+J.TR(z)}},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vr:{
-"^":"V54;X9,pL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V55;X9,pL,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRd:function(a){return a.X9},
 sRd:function(a,b){a.X9=this.ct(a,C.VI,a.X9,b)},
 gO9:function(a){return a.pL},
@@ -18090,8 +18143,8 @@
 a.pL=this.ct(a,C.S4,z,!0)
 z=a.X9.gqr()
 y=a.X9
-if(z==null)J.aT(J.zE(y)).G5(J.zE(a.X9),J.f2(a.X9)).ml(new T.eE(a))
-else J.aT(J.zE(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
+if(z==null)J.wg(J.fx(y)).PI(J.fx(a.X9),J.f2(a.X9)).ml(new T.eE(a))
+else J.wg(J.fx(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
 static:{aed:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18099,7 +18152,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.pL=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -18109,28 +18162,28 @@
 C.FC.LX(a)
 C.FC.XI(a)
 return a}}},
-V54:{
+V55:{
 "^":"uL+Pi;",
 $isd3:true},
 eE:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 b3:{
 "^":"TpZ:12;b",
 $1:[function(a){var z=this.b
-z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["","",,A,{
 "^":"",
 kn:{
-"^":"oEY;jJ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"oEY;jJ,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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.gTE()},
-fX:[function(a,b){this.at(a,null)},"$1","glD",2,0,19,59],
+return z.gzz()},
+J4:[function(a,b){this.at(a,null)},"$1","gUv",2,0,19,59],
 at:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
 this.ct(a,C.Fh,0,1)}},"$1","gRy",2,0,19,13],
@@ -18151,23 +18204,23 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.jJ=-1
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Wa.LX(a)
-C.Wa.XI(a)
+C.Mh.LX(a)
+C.Mh.XI(a)
 return a}}},
 oEY:{
 "^":"xI+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V55;Uz,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V56;Uz,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtu:function(a){return a.Uz},
 stu:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 Es:function(a){var z
@@ -18176,14 +18229,14 @@
 if(z==null)return
 J.SK(z)},
 pA:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
-static:{TXt:function(a){var z,y,x,w
+Da:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
+static:{Ln:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -18193,34 +18246,33 @@
 C.cJ0.LX(a)
 C.cJ0.XI(a)
 return a}}},
-V55:{
+V56:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,D,{
 "^":"",
-Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","E0",4,0,72],
-dV:function(a){switch(a){case"BoundedType":case"Instance":case"List":case"String":case"Type":case"TypeParameter":case"TypeRef":case"bool":case"double":case"int":case"null":return!0
+Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","Br",4,0,72],
+Ep:function(a){switch(a){case"BoundedType":case"Instance":case"List":case"String":case"Type":case"TypeParameter":case"TypeRef":case"bool":case"double":case"int":case"null":return!0
 default:return!1}},
 rO:function(a){switch(a){case"BoundedType":case"Type":case"TypeParameter":case"TypeRef":return!0
 default:return!1}},
-Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(b==null)return
 z=J.U6(b)
 z=z.t(b,"id")!=null&&z.t(b,"type")!=null
 if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
-y=J.UQ(b,"type")
-z=J.Qe(y)
-if(z.nC(y,"@"))y=z.yn(y,1)
-switch(y){case"Class":z=D.vO
+z=J.U6(b)
+y=z.t(b,"type")
+x=J.Qe(y)
+if(x.nC(y,"@"))y=x.yn(y,1)
+if(z.t(b,"_vmType")!=null){z=z.t(b,"_vmType")
+x=J.Qe(z)
+w=x.nC(z,"@")?x.yn(z,1):z}else w=y
+switch(y){case"Class":z=D.xB
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
 z=D.Kp
-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)
@@ -18230,72 +18282,79 @@
 u.$builtinTypeInfo=[z]
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
-t=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.mT(0,0,null,null),x,w,null,v,u,null,null,a,null,null,null,!1,null,null,null,null,null)
+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.qp(0,0,null,null),new D.qp(0,0,null,null)),new D.Iy(new D.qp(0,0,null,null),new D.qp(0,0,null,null)),new D.qp(0,0,null,null),x,v,null,u,t,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Code":z=[]
 z.$builtinTypeInfo=[D.ta]
 x=[]
 x.$builtinTypeInfo=[D.ta]
-w=D.Q4
-v=[]
-v.$builtinTypeInfo=[w]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[w]
-w=P.KN
-u=D.uA
-s=new V.qC(P.YM(null,null,null,w,u),null,null)
-s.$builtinTypeInfo=[w,u]
-t=new D.kx(null,0,0,0,0,0,z,x,v,s,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,null,!1,null,null,null,null,null)
+v=D.Q4
+u=[]
+u.$builtinTypeInfo=[v]
+u=new Q.wn(null,null,u,null,null)
+u.$builtinTypeInfo=[v]
+v=P.KN
+t=D.uA
+r=new V.qC(P.YM(null,null,null,v,t),null,null)
+r.$builtinTypeInfo=[v,t]
+s=new D.kx(null,0,0,0,0,0,z,x,u,r,"","",null,null,null,!1,!1,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Context":t=new D.lI(null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Context":s=new D.lI(null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Counter":z=D.G9
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-t=new D.YX(!1,null,x,100,null,0,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.YX(!1,null,x,100,null,0,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Error":t=new D.pD(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Error":s=new D.cn(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Function":t=new D.Kp(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Field":s=new D.xB(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+break
+case"Function":s=new D.Kp(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Gauge":z=D.G9
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-t=new D.YX(!1,null,x,100,null,0,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.YX(!1,null,x,100,null,0,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Isolate":z=J.wp(a)
 x=new V.qC(P.YM(null,null,null,null,null),null,null)
 x.$builtinTypeInfo=[null,null]
-w=P.L5(null,null,null,P.qU,D.af)
-v=[]
-v.$builtinTypeInfo=[P.qU]
+v=P.L5(null,null,null,P.qU,D.af)
 u=[]
-u.$builtinTypeInfo=[D.ER]
-s=D.dy
-r=[]
-r.$builtinTypeInfo=[s]
-r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[s]
-s=D.U4
+u.$builtinTypeInfo=[P.qU]
+t=[]
+t.$builtinTypeInfo=[D.ER]
+r=D.dy
 q=[]
-q.$builtinTypeInfo=[s]
+q.$builtinTypeInfo=[r]
 q=new Q.wn(null,null,q,null,null)
-q.$builtinTypeInfo=[s]
-s=P.L5(null,null,null,P.qU,P.Vf)
-s=R.tB(s)
-p=P.qU
-o=D.YX
-n=new V.qC(P.YM(null,null,null,p,o),null,null)
-n.$builtinTypeInfo=[p,o]
-p=P.qU
-o=D.YX
-m=new V.qC(P.YM(null,null,null,p,o),null,null)
-m.$builtinTypeInfo=[p,o]
-t=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,s,new D.Ce(0,0,0,0,0,0,null,null),new D.Ce(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,n,m,null,null,z,null,null,null,!1,null,null,null,null,null)
+q.$builtinTypeInfo=[r]
+r=D.U4
+p=[]
+p.$builtinTypeInfo=[r]
+p=new Q.wn(null,null,p,null,null)
+p.$builtinTypeInfo=[r]
+r=P.L5(null,null,null,P.qU,P.CP)
+r=R.tB(r)
+o=P.qU
+n=D.YX
+m=new V.qC(P.YM(null,null,null,o,n),null,null)
+m.$builtinTypeInfo=[o,n]
+o=P.qU
+n=D.YX
+l=new V.qC(P.YM(null,null,null,o,n),null,null)
+l.$builtinTypeInfo=[o,n]
+s=new D.bv(x,null,!1,!1,!0,!1,v,new D.tL(u,t,null,null,20,0),null,q,null,p,null,null,null,null,null,r,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,m,l,null,null,z,null,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -18303,51 +18362,70 @@
 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
+z=D.dy
 u=[]
 u.$builtinTypeInfo=[z]
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
+z=D.xB
+t=[]
+t.$builtinTypeInfo=[z]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[z]
 z=D.Kp
-s=[]
-s.$builtinTypeInfo=[z]
-s=new Q.wn(null,null,s,null,null)
-s.$builtinTypeInfo=[z]
-t=new D.U4(null,x,w,v,u,s,null,null,a,null,null,null,!1,null,null,null,null,null)
+r=[]
+r.$builtinTypeInfo=[z]
+r=new Q.wn(null,null,r,null,null)
+r.$builtinTypeInfo=[z]
+s=new D.U4(null,x,v,u,t,r,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"ServiceError":t=new D.N7(null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Object":switch(w){case"PcDescriptors":z=D.xb
+x=[]
+x.$builtinTypeInfo=[z]
+x=new Q.wn(null,null,x,null,null)
+x.$builtinTypeInfo=[z]
+s=new D.hn(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
+z=$.oK
+if(z==null)H.qw("created PcDescriptors.")
+else z.$1("created PcDescriptors.")
 break
-case"ServiceEvent":t=new D.Mk(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"LocalVarDescriptors":z=D.br
+x=[]
+x.$builtinTypeInfo=[z]
+x=new Q.wn(null,null,x,null,null)
+x.$builtinTypeInfo=[z]
+s=new D.Mi(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"ServiceException":t=new D.Ix(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"TokenStream":s=new D.Ik(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+break
+default:s=null}break
+case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+break
+case"ServiceEvent":s=new D.Mk(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+break
+case"ServiceException":s=new D.Ix(null,null,null,null,null,a,null,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]
-t=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Socket":t=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-default:if(D.dV(y)||J.xC(y,"Sentinel")){t=new D.uq(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
-break}else{z=new V.qC(P.YM(null,null,null,null,null),null,null)
+default:s=D.Ep(y)||J.xC(y,"Sentinel")?new D.uq(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null):null
+break}if(s==null){z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-t=new D.vO(z,a,null,null,null,!1,null,null,null,null,null)
-break}}t.eC(b)
-return t},
-UW:function(a){if(a.gHh())return
+s=new D.vO(z,a,null,null,null,!1,null,null,null,null,null)}s.eC(b)
+return s},
+vQ:function(a){if(a.gHh())return
 return a},
-bF:function(a){var z
+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},
@@ -18357,7 +18435,7 @@
 else if(!!z.$iswn)D.f3(a,b)},
 Gf:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.XG,y=0;y<z.length;++y){x=z[y]
+for(z=a.xN,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
@@ -18367,39 +18445,39 @@
 else if(v)D.Gf(x,b)}},
 af:{
 "^":"Pi;bN@,GR@",
-gXP:function(){return this.x8},
-gwv:function(a){return J.wp(this.x8)},
-god:function(a){return J.aT(this.x8)},
-gjO:function(a){return this.TU},
+gXP:function(){return this.V0},
+gwv:function(a){return J.wp(this.V0)},
+god:function(a){return J.wg(this.V0)},
+gjO:function(a){return this.r0},
 gt5:function(a){return this.oU},
 gdr:function(){return this.JK},
 glO:function(){return D.rO(this.oU)},
 gFY:function(){return J.xC(this.oU,"bool")},
 gzx:function(){return J.xC(this.oU,"double")},
 gt3:function(){return J.xC(this.oU,"Error")},
-gNs:function(){return D.dV(this.oU)},
-gWL:function(){return J.xC(this.oU,"int")},
+gNs:function(){return D.Ep(this.oU)},
+gSO:function(){return J.xC(this.oU,"int")},
 gK4:function(a){return J.xC(this.oU,"List")},
 gHh:function(){return J.xC(this.oU,"null")},
 gl5:function(){return J.xC(this.oU,"Sentinel")},
 gu7:function(){return J.xC(this.oU,"String")},
-gJE:function(){return J.xC(this.JK,"MirrorReference")},
+gOC:function(){return J.xC(this.JK,"MirrorReference")},
 gl2:function(){return J.xC(this.JK,"WeakProperty")},
 gBF:function(){return!1},
 gXM:function(){return J.xC(this.oU,"Instance")&&!J.xC(this.JK,"MirrorReference")&&!J.xC(this.JK,"WeakProperty")&&!this.gBF()},
-gPj:function(a){return this.x8.YC(this.TU)},
-gox:function(a){return this.qu},
+gPj:function(a){return this.V0.YC(this.r0)},
+gox:function(a){return this.ks},
 gjm:function(){return!1},
 gM8:function(){return!1},
 goc:function(a){return this.gbN()},
 soc:function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},
-gTE:function(){return this.gGR()},
-sTE:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
-xW:function(a){if(this.qu)return P.Ab(this,null)
+gzz:function(){return this.gGR()},
+szz:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
+xW:function(a){if(this.ks)return P.Ab(this,null)
 return this.VD(0)},
 VD:function(a){var z
-if(J.xC(this.TU,""))return P.Ab(this,null)
-if(this.qu&&this.gM8())return P.Ab(this,null)
+if(J.xC(this.r0,""))return P.Ab(this,null)
+if(this.ks&&this.gM8())return P.Ab(this,null)
 z=this.mQ
 if(z==null){z=this.gwv(this).jU(this.gPj(this)).ml(new D.n1(this)).wM(new D.jI(this))
 this.mQ=z}return z},
@@ -18409,13 +18487,13 @@
 x=z.t(a,"type")
 w=J.Qe(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.TU
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.TU=z.t(a,"id")
+w=this.r0
+if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
 this.oU=x
 if(z.NZ(a,"_vmType")===!0){z=z.t(a,"_vmType")
 w=J.Qe(z)
 this.JK=w.nC(z,"@")?w.yn(z,1):z}else this.JK=this.oU
-this.R5(0,a,y)},
+this.bF(0,a,y)},
 YC:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,172,205],
 $isaf:true},
 n1:{
@@ -18425,7 +18503,7 @@
 y=J.Qe(z)
 if(y.nC(z,"@"))z=y.yn(z,1)
 y=this.a
-if(!J.xC(z,y.oU))return D.Nl(y.x8,a)
+if(!J.xC(z,y.oU))return D.Nl(y.gXP(),a)
 y.eC(a)
 return y},"$1",null,2,0,null,206,"call"],
 $isEH:true},
@@ -18435,17 +18513,17 @@
 $isEH:true},
 boh:{
 "^":"a;",
-O5:function(a){J.Me(a,new D.P5(this))},
-lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,208]},
-P5:{
+qe:function(a){J.Me(a,new D.u9(this))},
+lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.TCE(this))},"$0","gDX",0,0,208]},
+u9:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
 z.t(a,"script").lV(z.t(a,"hits"))},"$1",null,2,0,null,209,"call"],
 $isEH:true},
-Rv:{
+TCE:{
 "^":"TpZ:207;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,206,"call"],
+z.qe(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,206,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -18455,27 +18533,27 @@
 god:function(a){return},
 gi2:function(){var z=this.Qi
 return z.gUQ(z)},
-gPj:function(a){return H.d(this.TU)},
+gPj:function(a){return H.d(this.r0)},
 YC:[function(a){return H.d(a)},"$1","gua",2,0,172,205],
 gYe:function(a){return this.Ox},
 gI2:function(){return this.RW},
 gA3:function(){return this.Ts},
 gdW:function(){return this.Va},
-gU6:function(){return this.kU},
-gJW:function(){return this.l7},
+gU6:function(){return this.h7},
+gJW:function(){return this.jA},
 hQ:function(a,b){var z,y,x,w
 z={}
 z.a=null
 try{y=this.hb(a)
 z.a=y
-if(b!=null)J.kW(y,"_data",b)}catch(x){H.Ru(x)
+if(b!=null)J.qQ(y,"_data",b)}catch(x){H.Ru(x)
 N.QM("").YX("Ignoring malformed event message: "+H.d(a))
 return}if(!J.xC(J.UQ(z.a,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
 return}w=J.UQ(J.UQ(z.a,"isolate"),"id")
-this.wD(w).ml(new D.jy(z,this,w))},
+this.wD(w).ml(new D.mT(z,this,w))},
 EM:function(a){return this.hQ(a,null)},
 BC:function(a){var z,y,x,w
-z=$.rc().R4(0,a)
+z=$.r0().R4(0,a)
 if(z==null)return
 y=z.pX
 x=y.input
@@ -18483,9 +18561,9 @@
 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)},
+return C.yo.yn(x,w+y)},
 ZS:function(a){var z,y,x
-z=$.fA().R4(0,a)
+z=$.jN().R4(0,a)
 if(z==null)return""
 y=z.pX
 x=y.index
@@ -18498,42 +18576,42 @@
 if(J.xC(a,""))return P.Ab(null,null)
 z=this.Qi.t(0,a)
 if(z!=null)return P.Ab(z,null)
-return this.VD(0).ml(new D.MZ(this,a))},
+return this.VD(0).ml(new D.wU(this,a))},
 cv:function(a){var z,y,x
 if(J.co(a,"isolates/")){z=this.ZS(a)
 y=this.BC(a)
-return this.wD(z).ml(new D.aEE(this,y))}x=this.uj.t(0,a)
+return this.wD(z).ml(new D.kk(this,y))}x=this.uj.t(0,a)
 if(x!=null)return J.LE(x)
-return this.jU(a).ml(new D.oew(this,a))},
-B5:[function(a,b){return b},"$2","gJ2",4,0,81],
+return this.jU(a).ml(new D.it(this,a))},
+nJ:[function(a,b){return b},"$2","gS6",4,0,81],
 hb:function(a){var z,y,x
 z=null
-try{y=new P.c5(this.gJ2())
-z=P.jc(a,y.gFs())}catch(x){H.Ru(x)
+try{y=new P.Mx(this.gS6())
+z=P.jc(a,y.gJ2())}catch(x){H.Ru(x)
 return}return R.tB(z)},
 OJ:function(a){var z
-if(!D.bF(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
-return P.pz(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
-if(J.xC(z.t(a,"type"),"ServiceError"))return P.pz(D.Nl(this,a),null,null)
-else if(J.xC(z.t(a,"type"),"ServiceException"))return P.pz(D.Nl(this,a),null,null)
+if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.t5(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
+if(J.xC(z.t(a,"type"),"ServiceError"))return P.t5(D.Nl(this,a),null,null)
+else if(J.xC(z.t(a,"type"),"ServiceException"))return P.t5(D.Nl(this,a),null,null)
 return P.Ab(a,null)},
 jU:function(a){return this.z6(0,a).ml(new D.zA(this,a)).pU(new D.tm(this),new D.mR()).pU(new D.hc(this),new D.pa())},
-R5:function(a,b,c){var z,y
+bF:function(a,b,c){var z,y
 if(c)return
-this.qu=!0
+this.ks=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
 y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.US,this.GY,y)
+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)
+this.jA=F.Wi(this,C.GI,this.jA,y)
 y=z.t(b,"assertsEnabled")
 this.Ts=F.Wi(this,C.ET,this.Ts,y)
 y=z.t(b,"pid")
-this.kU=F.Wi(this,C.uI,this.kU,y)
+this.h7=F.Wi(this,C.uI,this.h7,y)
 y=z.t(b,"typeChecksEnabled")
 this.Va=F.Wi(this,C.J2,this.Va,y)
 this.y8(z.t(b,"isolates"))},
@@ -18546,7 +18624,7 @@
 if(u!=null)y.u(0,v,u)
 else{u=D.Nl(this,w)
 y.u(0,v,u)
-N.QM("").To("New isolate '"+H.d(u.TU)+"'")}}y.aN(0,new D.Yu())
+N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Yu())
 this.Qi=y},
 Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
 this.GR=this.ct(this,C.KS,this.GR,"vm")
@@ -18557,7 +18635,7 @@
 O1w:{
 "^":"xm+Pi;",
 $isd3:true},
-jy:{
+mT:{
 "^":"TpZ:12;a,b,c",
 $1:[function(a){var z,y
 if(a==null)N.QM("").YX("Ignoring event with unknown isolate id: "+H.d(this.c))
@@ -18566,12 +18644,12 @@
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(z)}},"$1",null,2,0,null,210,"call"],
 $isEH:true},
-MZ:{
+wU:{
 "^":"TpZ:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
 return this.a.Qi.t(0,this.b)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-aEE:{
+kk:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z
 if(a==null)return this.a
@@ -18579,7 +18657,7 @@
 if(z==null)return J.LE(a)
 else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
-oew:{
+it:{
 "^":"TpZ:207;c,d",
 $1:[function(a){var z,y
 z=this.c
@@ -18596,8 +18674,8 @@
 $1:[function(a){var z,y,x
 z=this.a
 y=z.hb(a)
-x=$.ax
-if(x!=null)x.ab(0,"Received response for "+H.d(this.b),y)
+x=$.hm
+if(x!=null)x.AS(0,"Received response for "+H.d(this.b),y)
 return z.OJ(y)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 tm:{
@@ -18605,7 +18683,7 @@
 $1:[function(a){var z=this.c.G2
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)
-return P.pz(a,null,null)},"$1",null,2,0,null,23,"call"],
+return P.t5(a,null,null)},"$1",null,2,0,null,23,"call"],
 $isEH:true},
 mR:{
 "^":"TpZ:12;",
@@ -18616,7 +18694,7 @@
 $1:[function(a){var z=this.d.Li
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)
-return P.pz(a,null,null)},"$1",null,2,0,null,90,"call"],
+return P.t5(a,null,null)},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 pa:{
 "^":"TpZ:12;",
@@ -18635,7 +18713,7 @@
 v=z[x]
 if(typeof v!=="number")return H.s(v)
 this.jf=w+v}},
-pg:function(a,b){var z,y,x,w,v,u,t
+dS: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])
@@ -18643,7 +18721,7 @@
 t=this.jf
 if(typeof u!=="number")return H.s(u)
 this.jf=t+u}},
-k5:[function(a,b){var z,y,x,w,v,u
+q9:[function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
 y=this.XE
 x=y.length
@@ -18658,13 +18736,13 @@
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,Fw<,u1,Ob,Eq,kL",
+"^":"a;fJ<,Fw<,u1,Ob,Eq,kL",
 gvh:function(){return this.u1},
 Qv:function(a,b){var z,y,x,w,v,u
 this.u1=a
 z=J.U6(b)
 y=z.t(b,"counters")
-x=this.af
+x=this.fJ
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.kL=J.q8(z.t(b,"counters"))
 for(z=this.Eq,x=this.Fw,w=0;w<z;++w){v=this.kL
@@ -18686,23 +18764,23 @@
 z=Array(z)
 z.fixed$length=init
 u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.pg(y,this.Ob.XE)
-this.Ob.k5(0,y)
+u.dS(y,this.Ob.XE)
+this.Ob.q9(0,y)
 z=this.Fw
 z.push(u)
 if(z.length>this.Eq)C.Nm.W4(z,0)}},
-Ce:{
-"^":"Pi;zd,ob,j8,yp,Og,hu,Vg,fn",
-gSU:function(){return this.zd},
-gkV:function(){return this.ob},
+eK:{
+"^":"Pi;Ev,ob,j8,yp,Og,hu,Vg,ij",
+gSU:function(){return this.Ev},
+gbZ:function(){return this.ob},
 gMX:function(){return this.j8},
 gYk:function(){return this.yp},
 gpy:function(){return this.Og},
-gqZ:function(){return this.hu},
+gUH:function(){return this.hu},
 eC:function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"used")
-this.zd=F.Wi(this,C.LP,this.zd,y)
+this.Ev=F.Wi(this,C.LP,this.Ev,y)
 y=z.t(a,"capacity")
 this.ob=F.Wi(this,C.bV,this.ob,y)
 y=z.t(a,"external")
@@ -18714,28 +18792,28 @@
 z=z.t(a,"avgCollectionPeriodMillis")
 this.hu=F.Wi(this,C.BE,this.hu,z)}},
 bv:{
-"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,Q2H,yv,qo<,n5,l9,iD<,hz,pG<,Sn<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gwv:function(a){return this.x8},
+"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,h0,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,SF,Y8,UY<,xQ<,Q2H,yv,qo<,yA,Ac,iD<,hz,pG<,Sn<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gwv:function(a){return this.V0},
 god:function(a){return this},
 gXE:function(a){return this.V3},
 sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.TU)},
+gPj:function(a){return"/"+H.d(this.r0)},
 gBP:function(a){return this.Jr},
-gGL:function(){return this.EY},
+gLd:function(){return this.EY},
 gaj:function(){return this.eU},
 gn0:function(){return this.yP},
-YC:[function(a){return"/"+H.d(this.TU)+"/"+H.d(a)},"$1","gua",2,0,172,205],
-N3:function(a){var z,y,x,w
+YC:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gua",2,0,172,205],
+f9:function(a){var z,y,x,w
 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.I1()
-this.nN(a,z)
+this.Id()
+this.qx(a,z)
 w=y.t(a,"exclusive_trie")
 if(w!=null)this.qo=this.Jm(w,z)},
-I1:function(){var z=this.uj
-z.gUQ(z).aN(0,new D.TV())},
-nN:function(a,b){var z,y,x,w
+Id:function(){var z=this.uj
+z.gUQ(z).aN(0,new D.S0())},
+qx:function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
@@ -18746,17 +18824,17 @@
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","gLG",2,0,213,214],
+if(!!w.$isdy)z.push(w.xW(x))}return P.hz(z,!1)},"$1","gLG",2,0,213,214],
 lKe:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
-this.Wm=F.Wi(this,C.jo,this.Wm,null)
+this.h0=F.Wi(this,C.as,this.h0,null)
 for(y=J.mY(a);y.G();){x=y.gl()
 if(x.gAY()==null)z.h(0,x)
-if(J.xC(x.gTE(),"Object")&&J.xC(x.geh(),!1)){w=this.Wm
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
+if(J.xC(x.gzz(),"Object")&&J.xC(x.geh(),!1)){w=this.h0
+if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.as,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gHB",2,0,215,216],
+this.nq(this,w)}this.h0=x}}return P.Ab(this.h0,null)},"$1","gHB",2,0,215,216],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -18768,25 +18846,25 @@
 return x},
 cv:function(a){var z=this.uj.t(0,a)
 if(z!=null)return J.LE(z)
-return this.x8.jU("/"+H.d(this.TU)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.Wm},
+return this.V0.jU("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gDZ:function(){return this.h0},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
-gvU:function(){return this.tW},
+gpd:function(){return this.tW},
 gkw:function(){return this.zb},
 goc:function(a){return this.KT},
 soc:function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},
-gTE:function(){return this.f5},
-sTE:function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},
+gzz:function(){return this.f5},
+szz:function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},
 gIT:function(){return this.i9},
-gw2:function(){return this.cL},
-sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
+gw2:function(){return this.SF},
+sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
-Bs:function(a){var z=J.U6(a)
+WU:function(a){var z=J.U6(a)
 this.UY.eC(z.t(a,"new"))
 this.xQ.eC(z.t(a,"old"))},
-R5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+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)
@@ -18795,7 +18873,7 @@
 y=z.t(b,"name")
 this.f5=F.Wi(this,C.KS,this.f5,y)
 if(c)return
-this.qu=!0
+this.ks=!0
 this.yP=F.Wi(this,C.DY,this.yP,!1)
 this.Xb()
 D.kT(b,this)
@@ -18803,7 +18881,7 @@
 return}y=z.t(b,"rootLib")
 this.v9=F.Wi(this,C.eN,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
-this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
+this.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)
@@ -18825,13 +18903,13 @@
 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)
+J.qQ(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))
+J.qQ(this.V3,s.t(w,t),C.CD.Sy(J.X9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
+J.Me(z.t(b,"timers"),new D.dn(q))
 y=this.Y8
 s=J.w1(y)
 s.u(y,"total",q.t(0,"time_total_runtime"))
@@ -18839,7 +18917,7 @@
 s.u(y,"gc",0)
 s.u(y,"init",J.WB(J.WB(J.WB(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
 s.u(y,"dart",q.t(0,"time_dart_execution"))
-this.Bs(z.t(b,"heaps"))
+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.iA,s,!0)
@@ -18856,37 +18934,37 @@
 y=this.tW
 y.V1(y)
 y.FV(0,z.t(b,"libraries"))
-y.GT(y,D.E0())},
-xB:function(){return this.x8.jU("/"+H.d(this.TU)+"/profile/tag").ml(new D.O5(this))},
-Jm:function(a,b){this.n5=0
-this.l9=a
+y.GT(y,D.Br())},
+m7:function(){return this.V0.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.O5(this))},
+Jm:function(a,b){this.yA=0
+this.Ac=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.ci(b)},
-ci:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.l9
-y=this.n5
+return this.LB(b)},
+LB:function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.Ac
+y=this.yA
 if(typeof y!=="number")return y.g()
-this.n5=y+1
+this.yA=y+1
 x=J.UQ(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
-y=this.l9
-z=this.n5
+y=this.Ac
+z=this.yA
 if(typeof z!=="number")return z.g()
-this.n5=z+1
+this.yA=z+1
 v=J.UQ(y,z)
 z=[]
-z.$builtinTypeInfo=[D.D5]
-u=new D.D5(w,v,z,0)
-y=this.l9
-t=this.n5
+z.$builtinTypeInfo=[D.TH]
+u=new D.TH(w,v,z,0)
+y=this.Ac
+t=this.yA
 if(typeof t!=="number")return t.g()
-this.n5=t+1
+this.yA=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.ci(a)
+for(;r<s;++r){q=this.LB(a)
 z.push(q)
 y=u.Jv
 t=q.Av
@@ -18917,16 +18995,16 @@
 Xb:function(){var z=this.hz
 if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).wM(new D.Cm(this))
 this.hz=z}return z},
-G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.ad(this,a,b))},
+PI:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.JL(this,a,b))},
 Xu:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
-WJ:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,208],
+zd:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,208],
 QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,208],
-Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,208],
-Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,208],
-h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gZp",0,0,208],
-WO:function(a,b){return this.cv(a).ml(new D.oq(b))},
-VT:function(){return this.WO("metrics",this.pG).ml(new D.y1(this))},
-bu:[function(a){return"Isolate("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
+Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.wX(this))},"$0","gLc",0,0,208],
+PJ:[function(a){return this.cv("debug/resume?step=over").ml(new D.Vd(this))},"$0","gqF",0,0,208],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.pW(this))},"$0","gZp",0,0,208],
+yB:function(a,b){return this.cv(a).ml(new D.oq(b))},
+VT:function(){return this.yB("metrics",this.pG).ml(new D.y1(this))},
+bu:[function(a){return"Isolate("+H.d(this.r0)+")"},"$0","gCR",0,0,73],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
@@ -18934,11 +19012,11 @@
 bvc:{
 "^":"PKX+Pi;",
 $isd3:true},
-TV:{
+S0:{
 "^":"TpZ:12;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.kr,a.xM,0)
+$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.pn=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.rF=F.Wi(a,C.uU,a.rF,"")
 C.Nm.sB(a.VS,0)
@@ -18957,7 +19035,7 @@
 "^":"TpZ:76;c",
 $0:function(){return this.c},
 $isEH:true},
-Qq:{
+dn:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
 this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,217,"call"],
@@ -18983,50 +19061,50 @@
 "^":"TpZ:76;b",
 $0:[function(){this.b.hz=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-ad:{
+JL:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(!!J.x(a).$ispD)J.UQ(J.de(this.b),J.bI(this.c,1)).sj9(!1)
+$1:[function(a){if(!!J.x(a).$iscn)J.UQ(J.de(this.b),J.bI(this.c,1)).sj9(!1)
 return this.a.Xb()},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 fw:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z,y
-if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 z=this.a
 y=z.Jr
-if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.VD(0)
+if(y!=null&&y.gYZ()!=null&&J.xC(J.UQ(z.Jr.gYZ(),"id"),J.UQ(this.b,"id")))return z.VD(0)
 else return z.Xb()},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 G4:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 LO:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-qD:{
+wX:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-A6:{
+Vd:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-xK:{
+pW:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 oq:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x
 z=J.x(a)
-if(!!z.$ispD){N.QM("").YX(a.LD)
+if(!!z.$iscn){N.QM("").YX(a.LD)
 return}y=this.a
 y.V1(0)
 for(z=J.mY(z.t(a,"members"));z.G();){x=z.gl()
@@ -19035,47 +19113,47 @@
 y1:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.WO("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
+return z.yB("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vO:{
-"^":"af;RF,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gjm:function(){return(J.xC(this.oU,"Class")||J.xC(this.oU,"Function")||J.xC(this.oU,"Field"))&&!J.co(this.TU,$.RQ)},
+"^":"af;RF,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gjm:function(){return(J.xC(this.oU,"Class")||J.xC(this.oU,"Function")||J.xC(this.oU,"Field"))&&!J.co(this.r0,$.RQ)},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x
-this.qu=!c
+bF:function(a,b,c){var z,y,x
+this.ks=!c
 z=this.RF
 z.V1(0)
 z.FV(0,b)
-y=z.LL
+y=z.tf
 x=y.t(0,"name")
 this.bN=this.ct(0,C.YS,this.bN,x)
 y=y.NZ(0,"vmName")?y.t(0,"vmName"):this.bN
 this.GR=this.ct(0,C.KS,this.GR,y)
-D.kT(z,this.x8)},
+D.kT(z,this.V0)},
 FV:function(a,b){return this.RF.FV(0,b)},
 V1:function(a){return this.RF.V1(0)},
-NZ:function(a,b){return this.RF.LL.NZ(0,b)},
-aN:function(a,b){return this.RF.LL.aN(0,b)},
+NZ:function(a,b){return this.RF.tf.NZ(0,b)},
+aN:function(a,b){return this.RF.tf.aN(0,b)},
 Rz:function(a,b){return this.RF.Rz(0,b)},
-t:function(a,b){return this.RF.LL.t(0,b)},
+t:function(a,b){return this.RF.tf.t(0,b)},
 u:function(a,b,c){this.RF.u(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.LL
+gl0:function(a){var z=this.RF.tf
 return z.gB(z)===0},
-gor:function(a){var z=this.RF.LL
+gor:function(a){var z=this.RF.tf
 return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.LL
+gvc:function(a){var z=this.RF.tf
 return z.gvc(z)},
-gUQ:function(a){var z=this.RF.LL
+gUQ:function(a){var z=this.RF.tf
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.LL
+gB:function(a){var z=this.RF.tf
 return z.gB(z)},
 HC:[function(a){var z=this.RF
 return z.HC(z)},"$0","gDx",0,0,131],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-w37:[function(a){return},"$0","gcm",0,0,17],
+Tr:[function(a){return},"$0","gcm",0,0,17],
 dt:[function(a){this.RF.Vg=null
 return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
@@ -19085,7 +19163,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-bu:[function(a){return"ServiceMap("+P.vW(this.RF)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"ServiceMap("+H.d(this.RF)+")"},"$0","gCR",0,0,73],
 $isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
@@ -19093,19 +19171,19 @@
 $asT8:function(){return[null,null]},
 $isd3:true,
 static:{"^":"RQ"}},
-pD:{
-"^":"wVq;I0,LD,jo,Ne,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+cn:{
+"^":"wVq;I0,LD,jo,Ne,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-R5:function(a,b,c){var z,y,x
+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.x8
+y=this.V0
 x=D.Nl(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
 z=D.Nl(y,z.t(b,"stacktrace"))
@@ -19115,16 +19193,16 @@
 this.bN=z
 this.GR=this.ct(this,C.KS,this.GR,z)},
 bu:[function(a){return"DartError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
-$ispD:true},
+$iscn:true},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"dZL;I0,LD,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"dZL;I0,LD,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
-R5:function(a,b,c){var z,y
-this.qu=!0
+bF:function(a,b,c){var z,y
+this.ks=!0
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -19140,11 +19218,11 @@
 "^":"af+Pi;",
 $isd3:true},
 Ix:{
-"^":"w8F;I0,LD,IV,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w8F;I0,LD,IV,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gn9:function(a){return this.IV},
-R5:function(a,b,c){var z,y
+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)
@@ -19156,20 +19234,21 @@
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
 this.GR=this.ct(this,C.KS,this.GR,z)},
+bu:[function(a){return"ServiceException("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
 $isIx:true},
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
 Mk:{
-"^":"V4b;eq,HQ,jo,ZK,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"V4b;eq,NH,jo,ZK,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfG:function(a){return this.eq},
-gQ1:function(){return this.HQ},
+gYZ:function(){return this.NH},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
 gRn:function(a){return this.ZK},
-R5:function(a,b,c){var z,y
-this.qu=!0
-D.kT(b,this.x8)
+bF:function(a,b,c){var z,y
+this.ks=!0
+D.kT(b,this.V0)
 z=J.U6(b)
 y=z.t(b,"eventType")
 y=F.Wi(this,C.qR,this.eq,y)
@@ -19179,7 +19258,7 @@
 this.bN=y
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(z.t(b,"breakpoint")!=null){y=z.t(b,"breakpoint")
-this.HQ=F.Wi(this,C.hR,this.HQ,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
+this.NH=F.Wi(this,C.hR,this.NH,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
 this.jo=F.Wi(this,C.ne,this.jo,y)}if(z.t(b,"_data")!=null){z=z.t(b,"_data")
 this.ZK=F.Wi(this,C.ee,this.ZK,z)}},
 bu:[function(a){var z,y
@@ -19191,50 +19270,48 @@
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gO3:function(a){return this.dj},
 gjm:function(){return!0},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x,w,v
+bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"url")
 x=F.Wi(this,C.Fh,this.dj,y)
 this.dj=x
 if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
 w=J.U6(y)
-v=w.cn(y,"/")
-if(typeof v!=="number")return v.g()
-x=w.yn(y,v+1)}y=z.t(b,"name")
+x=w.yn(y,w.cn(y,"/")+1)}y=z.t(b,"name")
 y=this.ct(this,C.YS,this.bN,y)
 this.bN=y
 if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.x8))
+this.ks=!0
+D.kT(b,J.wg(this.V0))
 y=this.Bm
 y.V1(y)
-w=J.dF(z.t(b,"imports")).br(0)
-H.ig(w,D.E0())
+w=J.Ij(z.t(b,"imports")).br(0)
+H.ig(w,D.Br())
 y.FV(0,w)
 y=this.XR
 y.V1(y)
-w=J.dF(z.t(b,"scripts")).br(0)
-H.ig(w,D.E0())
+w=J.Ij(z.t(b,"scripts")).br(0)
+H.ig(w,D.Br())
 y.FV(0,w)
 y=this.DD
 y.V1(y)
 y.FV(0,z.t(b,"classes"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=this.Z3
 y.V1(y)
 y.FV(0,z.t(b,"variables"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
-y.GT(y,D.E0())},
+y.GT(y,D.Br())},
 bu:[function(a){return"Library("+H.d(this.dj)+")"},"$0","gCR",0,0,73],
 $isU4:true},
 T5W:{
@@ -19242,11 +19319,11 @@
 rG9:{
 "^":"T5W+Pi;",
 $isd3:true},
-mT:{
-"^":"Pi;wf,wY,Vg,fn",
+qp:{
+"^":"Pi;wf,wY,Vg,ij",
 gWt:function(a){return this.wf},
 sWt:function(a,b){this.wf=F.Wi(this,C.yB,this.wf,b)},
-gfj:function(){return this.wY}},
+gET:function(){return this.wY}},
 Iy:{
 "^":"a;EJ<,l<",
 eC:function(a){var z,y,x
@@ -19263,16 +19340,16 @@
 x.wY=F.Wi(x,C.hN,x.wY,y)},
 static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,eH,dN,yv,UY<,xQ<,dQ,tJ<,mu<,k9,p2<,LT<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,qG,dN,yv,UY<,xQ<,vU,tJ<,mu<,k9,p2<,up<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gVM:function(){return this.Lh},
-gRs:function(){return this.GQ},
+gRh:function(){return this.GQ},
 geh:function(){return this.J1},
-gVF:function(){return this.eH},
-sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
+gVF:function(){return this.qG},
+sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gkc:function(a){return this.yv},
@@ -19291,15 +19368,15 @@
 sAY:function(a){this.k9=F.Wi(this,C.FZ,this.k9,a)},
 gjm:function(){return!0},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x,w
+bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.x8))
+this.ks=!0
+D.kT(b,J.wg(this.V0))
 if(!!J.x(z.t(b,"library")).$isU4){y=z.t(b,"library")
 this.Gz=F.Wi(this,C.EV,this.Gz,y)}else this.Gz=F.Wi(this,C.EV,this.Gz,null)
 y=z.t(b,"script")
@@ -19315,21 +19392,21 @@
 y=z.t(b,"implemented")
 this.E8=F.Wi(this,C.Ih,this.E8,y)
 y=z.t(b,"tokenPos")
-this.eH=F.Wi(this,C.dA,this.eH,y)
+this.qG=F.Wi(this,C.dA,this.qG,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=this.LT
+y=this.up
 y.V1(y)
 y.FV(0,z.t(b,"subclasses"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=this.tJ
 y.V1(y)
 y.FV(0,z.t(b,"fields"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=z.t(b,"super")
 y=F.Wi(this,C.FZ,this.k9,y)
 this.k9=y
@@ -19340,16 +19417,16 @@
 if(x!=null){z=J.U6(x)
 this.UY.eC(z.t(x,"new"))
 this.xQ.eC(z.t(x,"old"))
-y=this.dQ
+y=this.vU
 w=z.t(x,"promotedInstances")
 y.wf=F.Wi(y,C.yB,y.wf,w)
 z=z.t(x,"promotedBytes")
 y.wY=F.Wi(y,C.hN,y.wY,z)}},
-u2:function(a){var z=this.LT
+u2:function(a){var z=this.up
 if(z.tg(z,a))return
 z.h(0,a)
-z.GT(z,D.E0())},
-cv:function(a){return J.aT(this.x8).cv(J.WB(this.TU,"/"+H.d(a)))},
+z.GT(z,D.Br())},
+cv:function(a){return J.wg(this.V0).cv(J.WB(this.r0,"/"+H.d(a)))},
 bu:[function(a){return"Class("+H.d(this.GR)+")"},"$0","gCR",0,0,73],
 $isdy:true},
 ZzQ:{
@@ -19358,25 +19435,25 @@
 "^":"ZzQ+Pi;",
 $isd3:true},
 uq:{
-"^":"Zqa;df,MD,lA,fQ,ni,Iv,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"Zqa;df,MD,lA,fQ,ni,Xl,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gyT:function(a){return this.MD},
+gky:function(a){return this.MD},
 gPE:function(){return this.lA},
 gSS:function(){return this.fQ},
 gwz:function(){return this.ni},
 swz:function(a){this.ni=F.Wi(this,C.aw,this.ni,a)},
-gu5:function(){return this.Iv},
-su5:function(a){this.Iv=F.Wi(this,C.mM,this.Iv,a)},
+gu5:function(){return this.Xl},
+su5:function(a){this.Xl=F.Wi(this,C.mM,this.Xl,a)},
 goc:function(a){return this.di},
 soc:function(a,b){this.di=F.Wi(this,C.YS,this.di,b)},
 gB:function(a){return this.cM},
 sB:function(a,b){this.cM=F.Wi(this,C.Wn,this.cM,b)},
-gCY:function(){return this.F6},
-sCY:function(a){this.F6=F.Wi(this,C.hx,this.F6,a)},
+gQR:function(){return this.F6},
+sQR:function(a){this.F6=F.Wi(this,C.hx,this.F6,a)},
 gtJ:function(){return this.oI},
 stJ:function(a){this.oI=F.Wi(this,C.fV,this.oI,a)},
-gbA:function(){return this.dG},
+gDm:function(){return this.dG},
 gP9:function(a){return this.Rf},
 sP9:function(a,b){this.Rf=F.Wi(this,C.mw,this.Rf,b)},
 gCM:function(){return this.TG},
@@ -19386,8 +19463,8 @@
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 gBF:function(){return this.ni!=null},
-R5:function(a,b,c){var z,y
-D.kT(b,J.aT(this.x8))
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.V0))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19400,7 +19477,7 @@
 y=z.t(b,"closureFunc")
 this.ni=F.Wi(this,C.aw,this.ni,y)
 y=z.t(b,"closureCtxt")
-this.Iv=F.Wi(this,C.mM,this.Iv,y)
+this.Xl=F.Wi(this,C.mM,this.Xl,y)
 y=z.t(b,"name")
 this.di=F.Wi(this,C.YS,this.di,y)
 y=z.t(b,"length")
@@ -19415,31 +19492,32 @@
 y=z.t(b,"type_class")
 this.F6=F.Wi(this,C.hx,this.F6,y)
 y=z.t(b,"user_name")
-this.z0=F.Wi(this,C.Gy,this.z0,y)
+this.z0=F.Wi(this,C.ct,this.z0,y)
 y=z.t(b,"referent")
 this.TG=F.Wi(this,C.Tc,this.TG,y)
 y=z.t(b,"key")
 this.tk=F.Wi(this,C.z6,this.tk,y)
 z=z.t(b,"value")
 this.FA=F.Wi(this,C.zd,this.FA,z)
-this.qu=!0},
+this.ks=!0},
 bu:[function(a){var z=this.lA
 return"Instance("+H.d(z!=null?z:"a "+H.d(J.DA(this.df)))+")"},"$0","gCR",0,0,73]},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 lI:{
-"^":"D3i;df,MD,Jx,cM,A6,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"D3i;df,MD,Jx,cM,A6,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gyT:function(a){return this.MD},
+gky:function(a){return this.MD},
 gqH:function(){return this.Jx},
 sqH:function(a){this.Jx=F.Wi(this,C.BV,this.Jx,a)},
 gB:function(a){return this.cM},
 sB:function(a,b){this.cM=F.Wi(this,C.Wn,this.cM,b)},
 gZ3:function(){return this.A6},
-R5:function(a,b,c){var z,y
-D.kT(b,J.aT(this.x8))
+sZ3:function(a){this.A6=F.Wi(this,C.xw,this.A6,a)},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.V0))
 z=J.U6(b)
 y=z.t(b,"size")
 this.MD=F.Wi(this,C.da,this.MD,y)
@@ -19452,44 +19530,44 @@
 this.df=F.Wi(this,C.Wt,this.df,y)
 z=z.t(b,"variables")
 this.A6=F.Wi(this,C.xw,this.A6,z)
-this.qu=!0},
+this.ks=!0},
 bu:[function(a){return"Context("+H.d(this.cM)+")"},"$0","gCR",0,0,73]},
 D3i:{
 "^":"af+Pi;",
 $isd3:true},
-ma:{
+yz:{
 "^":"a;Sf",
 bu:[function(a){return this.Sf},"$0","gCR",0,0,76],
-Q2:function(){return C.Nm.tg([$.b1(),$.Nk(),$.zx(),$.dh()],this)},
-static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,dQ,z3,Gh,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.qu()
-case"kClosureFunction":return $.xq()
-case"kGetterFunction":return $.xW()
-case"kSetterFunction":return $.Kw()
+Q2:function(){return C.Nm.tg([$.Dh(),$.Nk(),$.zx(),$.OA()],this)},
+static:{"^":"et,jX,PZ,Bs,G8,xs,ab,Sp,Et,Ll,fJ,bt,dQ,z3,tT,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.xK()
+case"kClosureFunction":return $.HU()
+case"kGetterFunction":return $.rQ()
+case"kSetterFunction":return $.en()
 case"kConstructor":return $.kj()
 case"kImplicitGetter":return $.d9()
 case"kImplicitSetter":return $.AH()
 case"kStaticInitializer":return $.y5()
 case"kMethodExtractor":return $.Ot()
 case"kNoSuchMethodDispatcher":return $.E7()
-case"kInvokeFieldDispatcher":return $.f6()
-case"Collected":return $.b1()
+case"kInvokeFieldDispatcher":return $.bh()
+case"Collected":return $.Dh()
 case"Native":return $.Nk()
 case"Tag":return $.zx()
-case"Reused":return $.dh()}return $.lC()}}},
+case"Reused":return $.OA()}return $.lC()}}},
 Kp:{
-"^":"S6L;Pp,EG,bV,GQ,fd,ar,eH,dN,v5,NM,vf,H7,I0,XN,Ni,kE,Z4,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gEl:function(){return this.Pp},
-sEl:function(a){this.Pp=F.Wi(this,C.YV,this.Pp,a)},
+"^":"S6L;Pp,EG,bV,GQ,fd,ar,qG,dN,v5,NM,vf,H7,I0,XN,Ph,kE,TA,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gP2:function(){return this.Pp},
+sP2:function(a){this.Pp=F.Wi(this,C.YV,this.Pp,a)},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gFo:function(){return this.bV},
-gRs:function(){return this.GQ},
+gRh:function(){return this.GQ},
 geT:function(a){return this.fd},
 seT:function(a,b){this.fd=F.Wi(this,C.nX,this.fd,b)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gVF:function(){return this.eH},
-sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
+gVF:function(){return this.qG},
+sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gtT:function(a){return this.v5},
@@ -19497,19 +19575,19 @@
 gjW:function(){return this.NM},
 sjW:function(a){this.NM=F.Wi(this,C.OU,this.NM,a)},
 gW1:function(){return this.vf},
-gho:function(){return this.H7},
+gxL:function(){return this.H7},
 gfY:function(a){return this.I0},
-guh:function(){return this.XN},
-gUx:function(){return this.Ni},
+gOs:function(){return this.XN},
+gUx:function(){return this.Ph},
 gSu:function(){return this.kE},
-gMA:function(){return this.Z4},
-R5:function(a,b,c){var z,y
+gMA:function(){return this.TA},
+bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
-D.kT(b,J.aT(this.x8))
+D.kT(b,J.wg(this.V0))
 y=z.NZ(b,"owningClass")===!0?z.t(b,"owningClass"):null
 this.Pp=F.Wi(this,C.YV,this.Pp,y)
 y=z.NZ(b,"owningLibrary")===!0?z.t(b,"owningLibrary"):null
@@ -19518,7 +19596,7 @@
 y=F.Wi(this,C.Lc,this.I0,y)
 this.I0=y
 y=y.Q2()
-this.Z4=F.Wi(this,C.a0,this.Z4,!y)
+this.TA=F.Wi(this,C.a0,this.TA,!y)
 if(c)return
 y=z.t(b,"static")
 this.bV=F.Wi(this,C.AT,this.bV,y)
@@ -19529,12 +19607,12 @@
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 y=z.t(b,"tokenPos")
-this.eH=F.Wi(this,C.dA,this.eH,y)
+this.qG=F.Wi(this,C.dA,this.qG,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=D.UW(z.t(b,"code"))
+y=D.vQ(z.t(b,"code"))
 this.v5=F.Wi(this,C.i4,this.v5,y)
-y=D.UW(z.t(b,"unoptimizedCode"))
+y=D.vQ(z.t(b,"unoptimizedCode"))
 this.NM=F.Wi(this,C.OU,this.NM,y)
 y=z.t(b,"optimizable")
 this.vf=F.Wi(this,C.Vl,this.vf,y)
@@ -19547,16 +19625,74 @@
 z=this.fd
 if(z==null){z=this.Pp
 z=z!=null?H.d(J.DA(z))+"."+H.d(this.bN):this.bN
-this.Ni=F.Wi(this,C.AO,this.Ni,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
-this.Ni=F.Wi(this,C.AO,this.Ni,z)}},
+this.Ph=F.Wi(this,C.AO,this.Ph,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
+this.Ph=F.Wi(this,C.AO,this.Ph,z)}},
 $isKp:true},
 wvY:{
 "^":"af+boh;"},
 S6L:{
 "^":"wvY+Pi;",
 $isd3:true},
+xB:{
+"^":"Pqb;kU,Br,bV,f3,GQ,FA,bN:T6@,GR:vS@,ND,lw,jB,ar,qG,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gXP:function(){return this.kU},
+sXP:function(a){this.kU=F.Wi(this,C.Yp,this.kU,a)},
+gOF:function(){return this.Br},
+sOF:function(a){this.Br=F.Wi(this,C.yC,this.Br,a)},
+gFo:function(){return this.bV},
+gV5:function(a){return this.f3},
+gRh:function(){return this.GQ},
+gP:function(a){return this.FA},
+sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
+goc:function(a){return this.T6},
+soc:function(a,b){this.T6=F.Wi(this,C.YS,this.T6,b)},
+gzz:function(){return this.vS},
+szz:function(a){this.vS=F.Wi(this,C.KS,this.vS,a)},
+gRl:function(){return this.ND},
+gSE:function(){return this.lw},
+sSE:function(a){this.lw=F.Wi(this,C.ft,this.lw,a)},
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gVF:function(){return this.qG},
+sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.V0))
+z=J.U6(b)
+y=z.t(b,"name")
+this.T6=F.Wi(this,C.YS,this.T6,y)
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.T6
+this.vS=F.Wi(this,C.KS,this.vS,y)
+y=z.t(b,"owner")
+this.kU=F.Wi(this,C.Yp,this.kU,y)
+y=z.t(b,"declaredType")
+this.Br=F.Wi(this,C.yC,this.Br,y)
+y=z.t(b,"static")
+this.bV=F.Wi(this,C.AT,this.bV,y)
+y=z.t(b,"final")
+this.f3=F.Wi(this,C.dR,this.f3,y)
+y=z.t(b,"const")
+this.GQ=F.Wi(this,C.Nr,this.GQ,y)
+y=z.t(b,"value")
+this.FA=F.Wi(this,C.zd,this.FA,y)
+if(c)return
+y=z.t(b,"guardNullable")
+this.ND=F.Wi(this,C.dr,this.ND,y)
+y=z.t(b,"guardClass")
+this.lw=F.Wi(this,C.ft,this.lw,y)
+y=z.t(b,"guardLength")
+this.jB=F.Wi(this,C.fX,this.jB,y)
+y=z.t(b,"script")
+this.ar=F.Wi(this,C.PX,this.ar,y)
+z=z.t(b,"tokenPos")
+this.qG=F.Wi(this,C.dA,this.qG,z)
+this.ks=!0},
+bu:[function(a){return"Field("+H.d(J.DA(this.kU))+"."+H.d(this.T6)+")"},"$0","gCR",0,0,73],
+$isxB:true},
+Pqb:{
+"^":"af+Pi;",
+$isd3:true},
 c2:{
-"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,fn",
+"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,ij",
 gc1:function(){return this.x9},
 sc1:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
 gqr:function(){return this.Yp},
@@ -19569,7 +19705,7 @@
 jY:function(a,b,c){var z,y,x,w,v,u,t
 z=D.y8(this.a4)
 this.am=F.Wi(this,C.Jf,this.am,!z)
-for(z=this.tu,y=J.mY(J.UQ(J.aT(z.x8).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+for(z=this.tu,y=J.mY(J.UQ(J.wg(z.V0).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
 v=J.U6(w)
 u=J.UQ(v.t(w,"location"),"script")
 t=J.UQ(v.t(w,"location"),"tokenPos")
@@ -19584,17 +19720,17 @@
 z=z.Fr(a,"")
 y=new H.a7(z,z.length,0,null)
 y.$builtinTypeInfo=[H.u3(z,0)]
-for(;y.G();)switch(y.Ff){case"{":case"}":case"(":case")":case";":break
+for(;y.G();)switch(y.lo){case"{":case"}":case"(":case")":case";":break
 default:return!1}return!0},y8:function(a){var z,y,x,w
-z=J.BQ(a,new H.VR("(\\s)+",H.v4("(\\s)+",!1,!0,!1),null,null))
-for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.BQ(y.Ff,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
+z=J.BQ(a,new H.VR("(\\s)+",H.Vq("(\\s)+",!1,!0,!1),null,null))
+for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.BQ(y.lo,new H.VR("(\\b)",H.Vq("(\\b)",!1,!0,!1),null,null))
 w=new H.a7(x,x.length,0,null)
 w.$builtinTypeInfo=[H.u3(x,0)]
-for(;w.G();)if(!D.Fu(w.Ff))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+for(;w.G();)if(!D.Fu(w.lo))return!1}return!0},Yo:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
 z.jY(a,b,c)
 return z}}},
 vx:{
-"^":"vix;Gd>,p3,I0,E4,nE,EG,yc,zD,MO,aQ,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"vix;Gd>,p3,I0,l9,nE,EG,yc,zD,MO,aQ,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
@@ -19602,25 +19738,23 @@
 gM8:function(){return!0},
 rK:function(a){var z,y
 z=J.bI(a,1)
-y=this.Gd.XG
+y=this.Gd.xN
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
 q6:function(a){return this.MO.t(0,a)},
-R5:function(a,b,c){var z,y,x,w
-D.kT(b,J.aT(this.x8))
+bF:function(a,b,c){var z,y,x
+D.kT(b,J.wg(this.V0))
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"name")
 this.zD=y
 x=J.U6(y)
-w=x.cn(y,"/")
-if(typeof w!=="number")return w.g()
-w=x.yn(y,w+1)
-this.yc=w
-this.bN=this.ct(this,C.YS,this.bN,w)
-w=this.zD
-this.GR=this.ct(this,C.KS,this.GR,w)
+y=x.yn(y,x.cn(y,"/")+1)
+this.yc=y
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=this.zD
+this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
 this.Aj(z.t(b,"source"))
 this.YG(z.t(b,"tokenPosTable"))
@@ -19632,9 +19766,9 @@
 z.V1(0)
 y=this.aQ
 y.V1(0)
-this.E4=F.Wi(this,C.Gd,this.E4,null)
-this.nE=F.Wi(this,C.kA,this.nE,null)
-x=P.Ls(null,null,null,null)
+this.l9=F.Wi(this,C.Gd,this.l9,null)
+this.nE=F.Wi(this,C.qa,this.nE,null)
+x=P.fM(null,null,null,null)
 for(w=J.mY(a);w.G();){v=w.gl()
 u=J.U6(v)
 t=u.t(v,0)
@@ -19645,25 +19779,25 @@
 if(!(s<r))break
 q=u.t(v,s)
 p=u.t(v,s+1)
-r=this.E4
+r=this.l9
 if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.E4=q
+this.nq(this,r)}this.l9=q
 r=this.nE
-if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
+if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.qa,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.E4:q
-o=this.E4
+this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.l9:q
+o=this.l9
 if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.Gd,o,r)
 o.$builtinTypeInfo=[null]
-this.nq(this,o)}this.E4=r
+this.nq(this,o)}this.l9=r
 r=J.J5(this.nE,q)?this.nE:q
 o=this.nE
-if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.kA,o,r)
+if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.qa,o,r)
 o.$builtinTypeInfo=[null]
 this.nq(this,o)}this.nE=r}z.u(0,q,t)
 y.u(0,q,p)
-s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.Ff
+s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.lo
 if(!x.tg(0,J.f2(v)))v.sj9(!1)}},
 lV:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
@@ -19676,20 +19810,20 @@
 u=z.t(a,x+1)
 t=y.t(0,v)
 y.u(0,v,t!=null?J.WB(u,t):u)
-x+=2}this.f2()},
+x+=2}this.xz()},
 Aj:function(a){var z,y,x,w
-this.qu=!1
+this.ks=!1
 if(a==null)return
 z=J.BQ(a,"\n")
 if(z.length===0)return
-this.qu=!0
+this.ks=!0
 y=this.Gd
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.zD))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,D.NQ(this,w,z[x]))}this.f2()},
-f2:function(){var z,y,x
-for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.Ff
+y.h(0,D.Yo(this,w,z[x]))}this.xz()},
+xz:function(){var z,y,x
+for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.lo
 x.sc1(y.t(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
@@ -19698,18 +19832,18 @@
 "^":"Vlh+Pi;",
 $isd3:true},
 uA:{
-"^":"a;Yu<,Du<,fF<",
+"^":"a;Yu<,Du<,pn<",
 $isuA:true},
-Z9:{
-"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,up,Vg,fn",
+xb:{
+"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,GL,Vg,ij",
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gmE:function(){return this.up},
+gP3:function(){return this.GL},
 JM:[function(){var z,y
 z=this.p4
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,73],
+return y.bu(z)},"$0","gqE",0,0,73],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -19718,29 +19852,98 @@
 if(y==null)return
 this.ar=F.Wi(this,C.PX,this.ar,a)
 z=J.dY(a.rK(y))
-this.up=F.Wi(this,C.oI,this.up,z)},
-$isZ9:true},
+this.GL=F.Wi(this,C.oI,this.GL,z)},
+$isxb:true},
+hn:{
+"^":"nla;df,MD,uH<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gUP:function(){return this.df},
+sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
+gky:function(a){return this.MD},
+gjm:function(){return!1},
+gM8:function(){return!0},
+bF:function(a,b,c){var z,y,x,w
+if(c)return
+D.kT(b,J.wg(this.V0))
+z=J.U6(b)
+y=z.t(b,"class")
+this.df=F.Wi(this,C.Wt,this.df,y)
+y=z.t(b,"size")
+this.MD=F.Wi(this,C.da,this.MD,y)
+y=this.uH
+y.V1(y)
+for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
+w=J.U6(x)
+y.h(0,new D.xb(H.BU(w.t(x,"pc"),16,null),w.t(x,"deoptId"),w.t(x,"tokenPos"),w.t(x,"tryIndex"),J.iY(w.t(x,"kind")),null,null,null,null))}}},
+nla:{
+"^":"af+Pi;",
+$isd3:true},
+br:{
+"^":"Pi;oc>,vH>,eb,Jb>,ePv,fY>,Vg,ij",
+$isbr:true},
+Mi:{
+"^":"Fba;df,MD,uH<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gUP:function(){return this.df},
+sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
+gky:function(a){return this.MD},
+gjm:function(){return!1},
+gM8:function(){return!0},
+bF:function(a,b,c){var z,y,x,w
+if(c)return
+D.kT(b,J.wg(this.V0))
+z=J.U6(b)
+y=z.t(b,"class")
+this.df=F.Wi(this,C.Wt,this.df,y)
+y=z.t(b,"size")
+this.MD=F.Wi(this,C.da,this.MD,y)
+y=this.uH
+y.V1(y)
+for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
+w=J.U6(x)
+y.h(0,new D.br(w.t(x,"name"),w.t(x,"index"),w.t(x,"beginPos"),w.t(x,"endPos"),w.t(x,"scopeId"),J.iY(w.t(x,"kind")),null,null))}}},
+Fba:{
+"^":"af+Pi;",
+$isd3:true},
+Ik:{
+"^":"laa;df,MD,C9,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gUP:function(){return this.df},
+sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
+gky:function(a){return this.MD},
+gjm:function(){return!1},
+gM8:function(){return!0},
+bF:function(a,b,c){var z,y
+if(c)return
+D.kT(b,J.wg(this.V0))
+z=J.U6(b)
+y=z.t(b,"class")
+this.df=F.Wi(this,C.Wt,this.df,y)
+y=z.t(b,"size")
+this.MD=F.Wi(this,C.da,this.MD,y)
+z=z.t(b,"privateKey")
+this.C9=F.Wi(this,C.rm,this.C9,z)}},
+laa:{
+"^":"af+Pi;",
+$isd3:true},
 Q4:{
-"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,fn",
-gEB:function(){return this.dh},
+"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,ij",
+gnp:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-gX1:function(){return this.uH.XG.length>0},
-xtx:[function(){var z,y
+ghR:function(){return this.uH.xN.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,73],
 tU:[function(a){var z
 if(a==null)return""
-z=a.gn3().LL.t(0,this.Yu)
+z=a.gn3().tf.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,219,78],
+if(J.xC(z.gpn(),z.gDu()))return""
+return D.Tn(z.gpn(),a.glt())+" ("+H.d(z.gpn())+")"},"$1","gcQ",2,0,219,78],
 P7:[function(a){var z
 if(a==null)return""
-z=a.gn3().LL.t(0,this.Yu)
+z=a.gn3().tf.t(0,this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,219,78],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gAX",2,0,219,78],
 lF:function(){var z,y,x,w
 y=J.BQ(this.u0," ")
 x=y.length
@@ -19757,14 +19960,14 @@
 y=this.lF()
 x=J.x(y)
 if(x.n(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
-return}for(z=a.XG,w=0;w<z.length;++w){v=z[w]
+return}for(z=a.xN,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
 this.nq(this,z)}this.dh=v
 return}}N.QM("").YX("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
+static:{Tn:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"$0","gCR",0,0,73],
@@ -19772,18 +19975,18 @@
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
-else if(z.n(a,"Reused"))return C.yP
-else if(z.n(a,"Tag"))return C.Z7
+else if(z.n(a,"Reused"))return C.AA
+else if(z.n(a,"Tag"))return C.oA
 N.QM("").j2("Unknown code kind "+H.d(a))
 throw H.b(P.a9())}}},
 ta:{
 "^":"a;tT>,Av<",
 $ista:true},
-D5:{
-"^":"a;tT>,Av<,ks>,Jv",
-$isD5:true},
+TH:{
+"^":"a;tT>,Av<,qu>,Jv",
+$isTH:true},
 kx:{
-"^":"Pqb;I0,xM,Du<,fF<,vg,uE,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,oc*,TE@,Mk,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w25;I0,xM,Du<,pn<,vg,QA,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,Mk,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
@@ -19799,16 +20002,16 @@
 gM8:function(){return!0},
 P8:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.Ff.guH(),y=y.gA(y);y.G();)y.Ff.bR(a)},"$1","gH8",2,0,220,221],
-OF:function(){if(this.ar!=null)return
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gH8",2,0,220,221],
+QW:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.uG
 if(z==null)return
-if(J.zE(z)==null){J.SK(this.uG).ml(new D.Em(this))
-return}J.SK(J.zE(this.uG)).ml(this.gH8())},
+if(J.fx(z)==null){J.SK(this.uG).ml(new D.fA(this))
+return}J.SK(J.fx(this.uG)).ml(this.gH8())},
 VD:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.VD.call(this,this)
 return P.Ab(this,null)},
-ui:function(a,b,c){var z,y,x,w,v
+GK:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=0
 while(!0){x=z.gB(b)
@@ -19818,31 +20021,33 @@
 v=H.BU(z.t(b,y+1),null,null)
 if(w>>>0!==w||w>=c.length)return H.e(c,w)
 a.push(new D.ta(c[w],v))
-y+=2}H.ig(a,new D.fx())},
+y+=2}H.ig(a,new D.jm())},
 Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.kr,this.xM,c)
+this.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.pn=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
-this.ui(this.VS,z.t(a,"callers"),b)
-this.ui(this.hw,z.t(a,"callees"),b)
+this.GK(this.VS,z.t(a,"callers"),b)
+this.GK(this.hw,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
 if(y!=null)this.Zk(y)
-z=D.RA(this.fF,this.xM)+" ("+H.d(this.fF)+")"
+z=D.Rd(this.pn,this.xM)+" ("+H.d(this.pn)+")"
 this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.RA(this.Du,this.xM)+" ("+H.d(this.Du)+")"
+z=D.Rd(this.Du,this.xM)+" ("+H.d(this.Du)+")"
 this.rF=F.Wi(this,C.uU,this.rF,z)},
-R5:function(a,b,c){var z,y,x,w,v,u
+bF:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(b)
-this.oc=z.t(b,"name")
-this.TE=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.oc
+y=z.t(b,"name")
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
+this.GR=this.ct(this,C.KS,this.GR,y)
 y=z.t(b,"optimized")!=null&&z.t(b,"optimized")
 this.MH=F.Wi(this,C.pY,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 this.vg=H.BU(z.t(b,"start"),16,null)
-this.uE=H.BU(z.t(b,"end"),16,null)
-y=this.x8
+this.QA=H.BU(z.t(b,"end"),16,null)
+y=this.V0
 x=J.RE(y)
 w=x.god(y).Qn(z.t(b,"function"))
 this.uG=F.Wi(this,C.nf,this.uG,w)
@@ -19852,8 +20057,8 @@
 if(v!=null)this.cr(v)
 u=z.t(b,"descriptors")
 if(u!=null)this.Xd(J.UQ(u,"members"))
-z=this.va.XG
-this.qu=z.length!==0||!J.xC(this.I0,C.l8)
+z=this.va.xN
+this.ks=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.Mk=F.Wi(this,C.zS,this.Mk,z)},
 gUa:function(){return this.Mk},
@@ -19868,22 +20073,22 @@
 v=y.t(a,x+1)
 u=y.t(a,x+2)
 t=!J.xC(y.t(a,x),"")?H.BU(y.t(a,x),null,null):0
-w=D.Z9
+w=D.xb
 s=[]
 s.$builtinTypeInfo=[w]
 s=new Q.wn(null,null,s,null,null)
 s.$builtinTypeInfo=[w]
 z.h(0,new D.Q4(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.Ff.pj(z)},
+x+=3}for(y=z.gA(z);y.G();)y.lo.pj(z)},
 MY:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
 x=z.t(a,"deoptId")
 w=z.t(a,"tokenPos")
 v=z.t(a,"tryIndex")
-u=J.rr(z.t(a,"kind"))
-for(z=this.va,z=z.gA(z);z.G();){t=z.Ff
-if(J.xC(t.gYu(),y)){t.guH().h(0,new D.Z9(y,x,w,v,u,null,null,null,null))
+u=J.iY(z.t(a,"kind"))
+for(z=this.va,z=z.gA(z);z.G();){t=z.lo
+if(J.xC(t.gYu(),y)){t.guH().h(0,new D.xb(y,x,w,v,u,null,null,null,null))
 return}}N.QM("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
 Xd:function(a){var z
 for(z=J.mY(a);z.G();)this.MY(z.gl())},
@@ -19898,29 +20103,29 @@
 y.u(0,v,new D.uA(v,H.BU(z.t(a,x+1),null,null),H.BU(z.t(a,x+2),null,null)))
 x+=3}},
 tg:function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.uE)},
+return z.F(b,this.vg)&&z.C(b,this.QA)},
 gqy:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
-static:{RA:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
-Pqb:{
+static:{Rd:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
+w25:{
 "^":"af+Pi;",
 $isd3:true},
-Em:{
+fA:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
-y=J.zE(z.uG)
+y=J.fx(z.uG)
 if(y==null)return
 J.SK(y).ml(z.gH8())},"$1",null,2,0,null,222,"call"],
 $isEH:true},
-fx:{
+jm:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.bI(b.gAv(),a.gAv())},
 $isEH:true},
 M9x:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"$0","gCR",0,0,73],
-static:{"^":"Cnk,qp,FJy,wr",AR:function(a){var z=J.x(a)
+static:{"^":"Cnk,lTU,FJy,wjk",AR:function(a){var z=J.x(a)
 if(z.n(a,"Listening"))return C.Cn
 else if(z.n(a,"Normal"))return C.lT
 else if(z.n(a,"Pipe"))return C.FJ
@@ -19928,21 +20133,21 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"nla;ip@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w26;V8@,jel,IHj,I0,vu,e5,ho,SI,L7,zw,tO,HO,u8,Wm,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gjm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
-gaB:function(a){return this.vu},
-gm8:function(){return this.DB},
-gaU:function(){return this.XK},
-gaP:function(){return this.FH},
+gA8:function(a){return this.vu},
+gm8:function(){return this.e5},
+gSY:function(){return this.ho},
+gmy:function(){return this.SI},
 gzM:function(){return this.L7},
-gki:function(){return this.zw},
+gq2:function(){return this.zw},
 giP:function(){return this.tO},
-gfJ:function(){return this.HO},
+gbB:function(){return this.HO},
 gNS:function(){return this.u8},
-gzK:function(){return this.EC},
-R5:function(a,b,c){var z,y
+gzK:function(){return this.Wm},
+bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -19951,14 +20156,14 @@
 y=D.AR(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.x8))
+this.ks=!0
+D.kT(b,J.wg(this.V0))
 y=z.t(b,"readClosed")
-this.DB=F.Wi(this,C.I7,this.DB,y)
+this.e5=F.Wi(this,C.I7,this.e5,y)
 y=z.t(b,"writeClosed")
-this.XK=F.Wi(this,C.Uy,this.XK,y)
+this.ho=F.Wi(this,C.Uy,this.ho,y)
 y=z.t(b,"closing")
-this.FH=F.Wi(this,C.To,this.FH,y)
+this.SI=F.Wi(this,C.To,this.SI,y)
 y=z.t(b,"listening")
 this.L7=F.Wi(this,C.cc,this.L7,y)
 y=z.t(b,"protocol")
@@ -19970,37 +20175,37 @@
 y=z.t(b,"remoteAddress")
 this.u8=F.Wi(this,C.dx,this.u8,y)
 y=z.t(b,"remotePort")
-this.EC=F.Wi(this,C.ni,this.EC,y)
+this.Wm=F.Wi(this,C.ni,this.Wm,y)
 y=z.t(b,"fd")
 this.zw=F.Wi(this,C.R3,this.zw,y)
-this.ip=z.t(b,"owner")}},
-nla:{
+this.V8=z.t(b,"owner")}},
+w26:{
 "^":"af+Pi;",
 $isd3:true},
 G9:{
 "^":"a;P>,Fl<",
 $isG9:true},
 YX:{
-"^":"Fba;L5,mw@,Jk<,wE,Qd,FA,zn,LV,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w27;L5,mw@,Jk<,kB,Qd,FA,zn,ay,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gjm:function(){return!0},
 gM8:function(){return!1},
-ghM:function(){return this.wE},
-shM:function(a){this.wE=a
-this.Hi()},
+ghM:function(){return this.kB},
+shM:function(a){this.kB=a
+this.nW()},
 NT:function(a){this.Jk.h(0,a)
-this.Hi()},
-Hi:function(){var z,y,x
+this.nW()},
+nW:function(){var z,y,x
 z=this.Jk
-y=z.XG.length
-x=this.wE
+y=z.xN.length
+x=this.kB
 if(typeof x!=="number")return H.s(x)
 if(y>x)z.oq(0,0,y-x)},
-gGB:function(){return this.Qd},
+gQZ:function(){return this.Qd},
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 gBp:function(a){return this.zn},
-gA5:function(a){return this.LV},
-R5:function(a,b,c){var z,y
+gA5:function(a){return this.ay},
+bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -20013,19 +20218,19 @@
 y=z.t(b,"min")
 this.zn=F.Wi(this,C.a2,this.zn,y)
 z=z.t(b,"max")
-this.LV=F.Wi(this,C.qi,this.LV,z)},
-bu:[function(a){return"ServiceMetric("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
+this.ay=F.Wi(this,C.qi,this.ay,z)},
+bu:[function(a){return"ServiceMetric("+H.d(this.r0)+")"},"$0","gCR",0,0,73],
 $isYX:true},
-Fba:{
+w27:{
 "^":"af+Pi;",
 $isd3:true},
 W1:{
-"^":"a;Jb<,MT>,Cb",
+"^":"a;fj<,MT>,Cb",
 Gv:function(){var z=this.Cb
 if(z!=null)z.Gv()
 this.Cb=null},
-Y0:[function(a,b){var z,y,x,w
-for(z=this.Jb,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=J.LE(z.Ff)
+Lyg:[function(a,b){var z,y,x,w
+for(z=this.fj,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=J.LE(z.lo)
 y.toString
 x=$.X3
 w=new P.Gc(0,x,null,null,x.cR(new D.r6()),null,P.VH(null,$.X3),null)
@@ -20045,17 +20250,17 @@
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
-if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
+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.Gf(b,this.b)},
 $isEH:true}}],["","",,L,{
 "^":"",
 Z5:{
-"^":"a;eX@,A9<,oc*,w8<",
+"^":"a;FH@,A9<,oc*,w8<",
 gp8:function(){return this.A9!==!0},
-Lt:function(){return P.EF(["lastConnectionTime",this.eX,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
+Lt:function(){return P.EF(["lastConnectionTime",this.FH,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
 UT:function(a){var z=J.U6(a)
-this.eX=z.t(a,"lastConnectionTime")
+this.FH=z.t(a,"lastConnectionTime")
 this.A9=z.t(a,"chrome")
 this.oc=z.t(a,"name")
 z=z.t(a,"networkAddress")
@@ -20065,9 +20270,9 @@
 static:{K9:function(a){var z=new L.Z5(0,!1,null,null)
 z.UT(a)
 return z}}},
-U2:{
-"^":"a;jO>,qT<",
-$isU2:true},
+Z8:{
+"^":"a;jO>,mh<",
+$isZ8:true},
 Uon:{
 "^":"wv;N>",
 gEH:function(){return this.Tn.MM},
@@ -20077,26 +20282,26 @@
 z.Xf(this)}},
 giG:function(a){return this.Fq.MM},
 je:function(a){if(this.Sl)this.Ra.bs.close()
-this.M0()
+this.C8()
 this.FZ()},
 z6:function(a,b){var z,y,x
 if(!this.Sl){this.Sl=!0
 this.Ra.Tc(this.N.gw8(),this.gkQ(),this.gM3(),this.gCW(),this.gNu())}z=C.jn.bu(this.x7++)
 y=P.qU
 y=H.VM(new P.Zf(P.Dt(y)),[y])
-x=new L.U2(b,y)
+x=new L.Z8(b,y)
 if(this.Ra.bs.readyState===1)this.Mf(z,x)
 else this.WE.u(0,z,x)
 return y.MM},
-abp:[function(){this.M0()
+abp:[function(){this.C8()
 this.FZ()},"$0","gNu",0,0,17],
-Xs:[function(){this.M0()
+Xs:[function(){this.C8()
 this.FZ()},"$0","gCW",0,0,17],
-LNZ:[function(){var z,y
+LN:[function(){var z,y
 z=this.N
 y=Date.now()
 new P.iP(y,!1).EK()
-z.seX(y)
+z.sFH(y)
 this.e2()
 y=this.Tn.MM
 if(y.YM===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
@@ -20104,7 +20309,7 @@
 y.Xf(this)}},"$0","gkQ",0,0,17],
 PW:[function(a){var z,y,x,w,v
 if(typeof a!=="string"){this.Ra.OI(a).ml(new L.jF(this))
-return}z=C.xr.iQ(a)
+return}z=C.xr.kV(a)
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
 return}if(this.N.gA9()===!0){y=J.U6(z)
 if(!J.xC(y.t(z,"method"),"Dart.observatoryData"))return
@@ -20114,12 +20319,12 @@
 w=y.t(z,"response")}if(x==null){this.EM(w)
 return}v=this.Td.Rz(0,x)
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
-return}y=v.gqT().MM
+return}y=v.gmh().MM
 if(y.YM!==0)H.vh(P.w("Future already completed"))
 y.Xf(w)},"$1","gM3",2,0,19],
-ck:function(a){a.aN(0,new L.aZ(this))
+ck:function(a){a.aN(0,new L.dV(this))
 a.V1(0)},
-M0:function(){var z=this.Td
+C8:function(){var z=this.Td
 if(z.X5>0){N.QM("").To("Cancelling all pending requests.")
 this.ck(z)}z=this.WE
 if(z.X5>0){N.QM("").To("Cancelling all delayed requests.")
@@ -20139,13 +20344,13 @@
 "^":"TpZ:224;a",
 $1:[function(a){var z,y,x,w,v,u,t
 z=J.RE(a)
-y=z.mt(a,0,C.it)
+y=z.mt(a,0,C.eL)
 x=this.a
 w=z.gbg(a)
 v=z.gVl(a)
 if(typeof v!=="number")return v.g()
 w.toString
-u=x.Ur.Sw(H.z4(w,v+8,y))
+u=x.Ur.WJ(H.GG(w,v+8,y))
 t=C.jn.g(8,y)
 v=z.gbg(a)
 w=z.gVl(a)
@@ -20154,10 +20359,10 @@
 if(typeof z!=="number")return z.W()
 x.hQ(u,J.cm(v,w+t,z-t))},"$1",null,2,0,null,15,"call"],
 $isEH:true},
-aZ:{
+dV:{
 "^":"TpZ:225;a",
 $2:function(a,b){var z,y
-z=b.gqT()
+z=b.gmh()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
 z=z.MM
 if(z.YM!==0)H.vh(P.w("Future already completed"))
@@ -20165,16 +20370,16 @@
 $isEH:true}}],["","",,R,{
 "^":"",
 zM:{
-"^":"V56;S4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V57;S4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkc:function(a){return a.S4},
 skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{qa:function(a){var z,y,x,w
+static:{ZmK:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20184,59 +20389,59 @@
 C.U0.LX(a)
 C.U0.XI(a)
 return a}}},
-V56:{
+V57:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,D,{
 "^":"",
 Rk:{
-"^":"V57;Xc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gja:function(a){return a.Xc},
-sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
+"^":"V58;D1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gja:function(a){return a.D1},
+sja:function(a,b){a.D1=this.ct(a,C.ne,a.D1,b)},
 static:{bZp:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Vd.LX(a)
-C.Vd.XI(a)
+C.kgQ.LX(a)
+C.kgQ.XI(a)
 return a}}},
-V57:{
+V58:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 hA:{
 "^":"a;bs",
-Tc:function(a,b,c,d,e){var z=W.P0(a,null)
+Tc:function(a,b,c,d,e){var z=W.D7(a,null)
 this.bs=z
-z=H.VM(new W.RO(z,C.d6.fA,!1),[null])
+z=H.VM(new W.vG(z,"close",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.lo(e)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.MD.fA,!1),[null])
+z=H.VM(new W.vG(z,"error",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.j3(d)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.JL.fA,!1),[null])
+z=H.VM(new W.vG(z,"open",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.Fz(b)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.ph.fA,!1),[null])
+z=H.VM(new W.vG(z,"message",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.oy(c)),z.el),[H.u3(z,0)]).DN()},
 wR:function(a,b){this.bs.send(b)},
 xO:function(a){this.bs.close()},
 OI:function(a){var z,y
 z=new FileReader()
 z.readAsArrayBuffer(a)
-y=H.VM(new W.RO(z,C.G5.fA,!1),[null])
-return y.gqG(y).ml(new U.OW(z))}},
+y=H.VM(new W.vG(z,"loadend",!1),[null])
+return y.gtH(y).ml(new U.OW(z))}},
 lo:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.$0()},"$1",null,2,0,null,226,"call"],
@@ -20258,13 +20463,13 @@
 $1:[function(a){return J.cm(C.kL.gyG(this.a),0,null)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 KM:{
-"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,Ur,Ra,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,Ur,Ra,Ox,GY,RW,Ts,Va,h7,jA,Li,G2,Rk,uj,Qi,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 $isKM:true},
 dS:{
-"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"wv;eG,iW,S3,yb,Ox,GY,RW,Ts,Va,h7,jA,Li,G2,Rk,uj,Qi,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 je:function(a){},
 gEH:function(){return this.eG.MM},
-giG:function(a){return this.rp.MM},
+giG:function(a){return this.iW.MM},
 j03:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -20283,16 +20488,16 @@
 y.u(0,"query",H.d(b));++this.yb
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.S3.u(0,z,x)
-J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
+J.bb(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
-ZH:function(){var z=H.VM(new W.RO(window,C.ph.fA,!1),[null])
+ZH:function(){var z=H.VM(new W.vG(window,"message",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gDi()),z.el),[H.u3(z,0)]).DN()
 z=this.eG.MM
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V58;Ll,Sa,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V59;Ll,Sa,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 gl6:function(a){return a.Sa},
@@ -20302,7 +20507,7 @@
 J.CJ(z,a.Ll)
 return z
 case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.o3(z,a.Ll)
+J.oJ(z,a.Ll)
 return z
 case"Class":z=W.r3("class-view",null)
 J.NZ(z,a.Ll)
@@ -20340,6 +20545,9 @@
 case"HttpServerConnection":z=W.r3("io-http-server-connection-view",null)
 J.i0(z,a.Ll)
 return z
+case"Object":z=W.r3("object-view",null)
+J.h9(z,a.Ll)
+return z
 case"SocketList":z=W.r3("io-socket-list-view",null)
 J.A4(z,a.Ll)
 return z
@@ -20350,7 +20558,7 @@
 J.A4(z,a.Ll)
 return z
 case"WebSocket":z=W.r3("io-web-socket-view",null)
-J.tH(z,a.Ll)
+J.w7(z,a.Ll)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
 J.Rp(z,a.Ll)
@@ -20409,21 +20617,21 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Uv.LX(a)
-C.Uv.XI(a)
+C.Ns.LX(a)
+C.Ns.XI(a)
 return a}}},
-V58:{
+V59:{
 "^":"uL+Pi;",
 $isd3:true},
 Um:{
-"^":"V59;dL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V60;dL,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gBN:function(a){return a.dL},
 sBN:function(a,b){a.dL=this.ct(a,C.nE,a.dL,b)},
 static:{T21:function(a){var z,y,x,w
@@ -20432,7 +20640,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20442,17 +20650,17 @@
 C.Uav.LX(a)
 C.Uav.XI(a)
 return a}}},
-V59:{
+V60:{
 "^":"uL+Pi;",
 $isd3:true},
 VZ:{
-"^":"V60;GW,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V61;GW,C7,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gIr:function(a){return a.GW},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.GW=this.ct(a,C.SR,a.GW,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
+ITt:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
 Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,166],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
@@ -20464,61 +20672,61 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.OX.LX(a)
-C.OX.XI(a)
+C.vmJ.LX(a)
+C.vmJ.XI(a)
 return a}}},
-V60:{
+V61:{
 "^":"uL+Pi;",
 $isd3:true},
 WG:{
-"^":"V61;Jg,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V62;Jg,C7,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Jg},
 sjx:function(a,b){a.Jg=this.ct(a,C.vp,a.Jg,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
+ITt:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
 Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,166],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
 c.$0()},"$2","gus",4,0,230,231,102],
-static:{z0:function(a){var z,y,x,w
+static:{KTC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.DX.LX(a)
-C.DX.XI(a)
+C.dl.LX(a)
+C.dl.XI(a)
 return a}}},
-V61:{
+V62:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"Dsd;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Dsd;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
-gjT:function(a){return a.Pe},
-sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
+gjT:function(a){return a.R1},
+sjT:function(a,b){a.R1=this.ct(a,C.uu,a.R1,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,19,59],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gBj",2,0,19,59],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 z=J.Ds(z)
@@ -20526,19 +20734,19 @@
 return"#"+H.d(z)},
 gJp:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gTE()},
+return z.gzz()},
 goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return J.DA(z)},
-gWw:function(a){return J.FN(this.goc(a))},
+gWw:function(a){return this.goc(a)==null||J.FN(this.goc(a))===!0},
 static:{lKH:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20552,7 +20760,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 f7:{
-"^":"V62;tY,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V63;tY,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
 pY:function(a){var z
@@ -20577,6 +20785,12 @@
 case"Library":z=W.r3("library-ref",null)
 J.PP(z,a.tY)
 return z
+case"Object":z=W.r3("object-ref",null)
+J.PP(z,a.tY)
+return z
+case"Script":z=W.r3("script-ref",null)
+J.PP(z,a.tY)
+return z
 default:if(a.tY.gNs()||a.tY.gl5()){z=W.r3("instance-ref",null)
 J.PP(z,a.tY)
 return z}else{z=W.r3("span",null)
@@ -20590,14 +20804,14 @@
 x=this.pY(a)
 if(x==null){N.QM("").To("Unable to find a ref element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gLe",2,0,12,59],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gBj",2,0,12,59],
 static:{wzV:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20607,19 +20821,38 @@
 C.J9.LX(a)
 C.J9.XI(a)
 return a}}},
-V62:{
+V63:{
 "^":"uL+Pi;",
-$isd3:true}}],["","",,Q,{
+$isd3:true},
+Ce:{
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{FMr:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.Fl(null,null)
+w=P.Fl(null,null)
+a.R1=!1
+a.Iy=[]
+a.OD=!1
+a.kK=!1
+a.ZM=z
+a.ZQ=y
+a.qJ=x
+a.wy=w
+C.ji.LX(a)
+C.ji.XI(a)
+return a}}}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"ImK;kF,IK,bP,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"ImK;kF,IK,bP,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gd4:function(a){return a.kF},
 sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
 sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
-RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+oew:[function(a,b,c,d){var z=J.rp((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
 a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,116,2,232,107],
 static:{AlS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -20627,23 +20860,23 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Yo.LX(a)
-C.Yo.XI(a)
+C.zb.LX(a)
+C.zb.XI(a)
 return a}}},
 ImK:{
 "^":"xc+Pi;",
 $isd3:true}}],["","",,A,{
 "^":"",
 rv:{
-"^":"a;kl,IW,Mg,Yx,ER,Ja,BY,rM",
-xZ:function(a,b){return this.rM.$1(b)},
+"^":"a;kl,IW,Mg,nN,ER,Ja,BY,rM",
+WO:function(a,b){return this.rM.$1(b)},
 bu:[function(a){var z=P.p9("")
 z.KF("(options:")
 z.KF(this.kl?"fields ":"")
@@ -20654,12 +20887,13 @@
 z.KF("annotations: "+H.d(this.BY))
 z.KF(this.rM!=null?"with matcher":"")
 z.KF(")")
-return z.IN},"$0","gCR",0,0,73]},
+z=z.IN
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73]},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
 gZI:function(){return this.fY===C.nU},
-gRS:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.cn},
+gUd:function(){return this.fY===C.BM},
+gUA:function(){return this.fY===C.hU},
 giO:function(a){var z=this.oc
 return z.giO(z)},
 n:function(a,b){if(b==null)return!1
@@ -20672,7 +20906,8 @@
 z.KF(this.Fo?"static ":"")
 z.KF(this.Dv)
 z.KF(")")
-return z.IN},"$0","gCR",0,0,73],
+z=z.IN
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73],
 $isES:true},
 iYn:{
 "^":"a;fY>"}}],["","",,X,{
@@ -20689,17 +20924,17 @@
 ZO:function(a,b){var z,y,x,w,v,u
 z=new H.a7(a,a.length,0,null)
 z.$builtinTypeInfo=[H.u3(a,0)]
-for(;z.G();){y=z.Ff
+for(;z.G();){y=z.lo
 b.length
 x=new H.a7(b,1,0,null)
 x.$builtinTypeInfo=[H.u3(b,0)]
 w=J.x(y)
-for(;x.G();){v=x.Ff
+for(;x.G();){v=x.lo
 if(w.n(y,v))return!0
 if(!!J.x(v).$isLz){u=w.gbx(y)
-u=$.mX().xs(u,v)}else u=!1
+u=$.II().xs(u,v)}else u=!1
 if(u)return!0}}return!1},
-na:function(a){var z,y
+OS:function(a){var z,y
 z=H.G3()
 y=H.KT(z).Zg(a)
 if(y)return 0
@@ -20710,7 +20945,7 @@
 z=H.KT(z,[z,z,z]).Zg(a)
 if(z)return 3
 return 4},
-Zpg:function(a){var z,y
+RI:function(a){var z,y
 z=H.G3()
 y=H.KT(z,[z,z,z]).Zg(a)
 if(y)return 3
@@ -20726,9 +20961,9 @@
 y=b.length
 if(z!==y)return!1
 if(c){x=P.Fl(null,null)
-for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.Ff
+for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.lo
 v=x.t(0,w)
-x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.Ff
+x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.lo
 v=x.t(0,w)
 if(v==null)return!1
 if(v===1)x.Rz(0,w)
@@ -20739,15 +20974,15 @@
 kP:function(){throw H.b(P.eG("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["","",,O,{
 "^":"",
 Oj:{
-"^":"a;II,F8,ZG,of,F3,af<,T4,nX",
-FV:function(a,b){this.II.FV(0,b.gII())
+"^":"a;E4,F8,ZG,YK,t6,fJ<,T4,NI",
+FV:function(a,b){this.E4.FV(0,b.gE4())
 this.F8.FV(0,b.gF8())
 this.ZG.FV(0,b.gZG())
-O.PV(this.of,b.gof())
-O.PV(this.F3,b.gF3())
-this.af.FV(0,b.gaf())
-b.gaf().aN(0,new O.T6(this))},
-IZ:function(a,b,c,d,e,f,g){this.af.aN(0,new O.PO(this))},
+O.PV(this.YK,b.gYK())
+O.PV(this.t6,b.gt6())
+this.fJ.FV(0,b.gfJ())
+b.gfJ().aN(0,new O.W2(this))},
+IZ:function(a,b,c,d,e,f,g){this.fJ.aN(0,new O.PO(this))},
 static:{rH:function(a,b,c,d,e,f,g){var z,y
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -20755,98 +20990,98 @@
 z.IZ(a,b,c,d,e,f,g)
 return z},PV:function(a,b){var z,y
 for(z=b.gvc(b),z=z.gA(z);z.G(),!1;){y=z.gl()
-a.to(0,y,new O.oQ())
+a.to(0,y,new O.D8())
 J.bj(a.t(0,y),b.t(0,y))}}}},
 PO:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-T6:{
+W2:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-oQ:{
+D8:{
 "^":"TpZ:76;",
 $0:function(){return P.Fl(null,null)},
 $isEH:true},
 fH:{
-"^":"a;xV",
-Gp:function(a,b){var z=this.xV.II.t(0,b)
-if(z==null)throw H.b(O.Fm("getter \""+H.d(b)+"\" in "+H.d(a)))
+"^":"a;JE",
+jD:function(a,b){var z=this.JE.E4.t(0,b)
+if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
-Cq:function(a,b,c){var z=this.xV.F8.t(0,b)
-if(z==null)throw H.b(O.Fm("setter \""+H.d(b)+"\" in "+H.d(a)))
+Q1:function(a,b,c){var z=this.JE.F8.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,s
 z=null
-x=this.xV
-if(!!J.x(a).$isLz){w=x.F3.t(0,a)
-z=w==null?null:J.UQ(w,b)}else{v=x.II.t(0,b)
-z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.Fm("method \""+H.d(b)+"\" in "+H.d(a)))
+x=this.JE
+if(!!J.x(a).$isLz){w=x.t6.t(0,a)
+z=w==null?null:J.UQ(w,b)}else{v=x.E4.t(0,b)
+z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){u=X.na(z)
+if(d){u=X.OS(z)
 if(u>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
-c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.Zpg(z)
+c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.RI(z)
 x=t>=0?t:J.q8(c)
 c=X.Na(c,u,x)}}try{x=H.eC(z,c,P.Te(null))
 return x}catch(s){if(!!J.x(H.Ru(s)).$isJS){if(y!=null)P.FL(y)
 throw s}else throw s}}},
 bY:{
-"^":"a;xV",
+"^":"a;JE",
 xs:function(a,b){var z,y,x
 if(J.xC(a,b)||J.xC(b,C.AP))return!0
-for(z=this.xV,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
+for(z=this.JE,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
 if(J.xC(x,b))return!0
-if(x==null){if(!z.nX)return!1
-throw H.b(O.Fm("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
+if(x==null){if(!z.NI)return!1
+throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
 UK:function(a,b){var z=this.NW(a,b)
 return z!=null&&z.gUA()&&z.gFo()!==!0},
 n6:function(a,b){var z,y,x
-z=this.xV
-y=z.of.t(0,a)
-if(y==null){if(!z.nX)return!1
-throw H.b(O.Fm("declarations for "+H.d(a)))}x=J.UQ(y,b)
+z=this.JE
+y=z.YK.t(0,a)
+if(y==null){if(!z.NI)return!1
+throw H.b(O.lA("declarations for "+H.d(a)))}x=J.UQ(y,b)
 return x!=null&&x.gUA()&&x.gFo()===!0},
 CV:function(a,b){var z=this.NW(a,b)
-if(z==null){if(!this.xV.nX)return
-throw H.b(O.Fm("declaration for "+H.d(a)+"."+H.d(b)))}return z},
+if(z==null){if(!this.JE.NI)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.xV
+if(c.Mg){y=this.JE
 x=y.ZG.t(0,b)
-if(x==null){if(y.nX)throw H.b(O.Fm("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.Yx))z=this.Me(0,x,c)}y=this.xV
-w=y.of.t(0,b)
-if(w==null){if(!y.nX)return z
-throw H.b(O.Fm("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
+if(x==null){if(y.NI)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.nN))z=this.Me(0,x,c)}y=this.JE
+w=y.YK.t(0,b)
+if(w==null){if(!y.NI)return z
+throw H.b(O.lA("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
 if(!c.kl&&v.gZI())continue
-if(!c.IW&&v.gRS())continue
-if(c.ER&&J.cL(v)===!0)continue
+if(!c.IW&&v.gUd())continue
+if(c.ER&&J.Z6(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
-if(c.rM!=null&&c.xZ(0,J.DA(v))!==!0)continue
+if(c.rM!=null&&c.WO(0,J.DA(v))!==!0)continue
 u=c.BY
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
 NW:function(a,b){var z,y,x,w,v,u
-for(z=this.xV,y=z.ZG,x=z.of;!J.xC(a,C.AP);a=u){w=x.t(0,a)
+for(z=this.JE,y=z.ZG,x=z.YK;!J.xC(a,C.AP);a=u){w=x.t(0,a)
 if(w!=null){v=J.UQ(w,b)
 if(v!=null)return v}u=y.t(0,a)
-if(u==null){if(!z.nX)return
-throw H.b(O.Fm("superclass of \""+H.d(a)+"\""))}}return}},
+if(u==null){if(!z.NI)return
+throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;xV"},
+"^":"a;JE"},
 tk:{
-"^":"a;GB<",
-bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
-static:{Fm:function(a){return new O.tk(a)}}}}],["","",,K,{
+"^":"a;QZ<",
+bu:[function(a){return"Missing "+this.QZ+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
+static:{lA:function(a){return new O.tk(a)}}}}],["","",,K,{
 "^":"",
 nm:{
-"^":"V63;xP,rs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V64;xP,yl,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
-git:function(a){return a.rs},
-sit:function(a,b){a.rs=this.ct(a,C.B0,a.rs,b)},
+git:function(a){return a.yl},
+sit:function(a,b){a.yl=this.ct(a,C.B0,a.yl,b)},
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-vQ:[function(a,b,c){a.rs=this.ct(a,C.B0,a.rs,b)
+vQ:[function(a,b,c){a.yl=this.ct(a,C.B0,a.yl,b)
 c.$0()},"$2","gus",4,0,230,231,102],
 static:{ant:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -20854,8 +21089,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.rs=!1
-a.f4=[]
+a.yl=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20865,22 +21100,22 @@
 C.dX.LX(a)
 C.dX.XI(a)
 return a}}},
-V63:{
+V64:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,X,{
 "^":"",
 Vu:{
-"^":"V64;Jl,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gtN:function(a){return a.Jl},
-stN:function(a,b){a.Jl=this.ct(a,C.kw,a.Jl,b)},
-pA:[function(a,b){J.LE(a.Jl).wM(b)},"$1","gvC",2,0,19,102],
+"^":"V65;ju,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gtN:function(a){return a.ju},
+stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
+pA:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,19,102],
 static:{lt2:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20890,63 +21125,62 @@
 C.bg3.LX(a)
 C.bg3.XI(a)
 return a}}},
-V64:{
+V65:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,M,{
 "^":"",
-dg:function(a,b){var z,y,x,w,v,u
+iX:function(a,b){var z,y,x,w,v,u
 z=M.pNz(a,b)
 if(z==null)z=new M.XI([],null,null)
-for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
-if(u==null)continue
-if(w==null){w=Array(y.gUN(a).uR.childNodes.length)
+for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
+if(w==null){w=Array(y.gdH(a).uR.childNodes.length)
 w.fixed$length=init}if(v>=w.length)return H.e(w,v)
-w[v]=u}z.ks=w
+w[v]=u}z.qu=w
 return z},
-S0:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.pL(c,a,!1))
-for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.f8(w):null,e,f,g,null)
-if(d.ghK()){M.Xi(z).cl(a)
-if(f!=null)J.D4(M.Xi(z),f)}M.mV(z,d,e,g)
+Ch:function(a,b,c,d,e,f,g,h){var z,y,x,w
+z=b.appendChild(J.Ct(c,a,!1))
+for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.Ch(y,z,c,x?d.f8(w):null,e,f,g,null)
+if(d.ghK()){M.uH(z).rp(a)
+if(f!=null)J.NA(M.uH(z),f)}M.mV(z,d,e,g)
 return z},
-aR:function(a,b){return!!J.x(a).$isUn&&J.xC(b,"text")?"textContent":b},
+b1:function(a,b){return!!J.x(a).$iskJ&&J.xC(b,"text")?"textContent":b},
 xa:function(a){var z
 if(a==null)return
 z=J.UQ(a,"__dartBindable")
-return!!J.x(z).$isAp?z:new M.VB(a)},
+return!!J.x(z).$isAp?z:new M.dP(a)},
 fg:function(a){var z,y,x
-if(!!J.x(a).$isVB)return a.qf
+if(!!J.x(a).$isdP)return a.qf
 z=$.X3
-y=new M.Ra(z)
+y=new M.Vf(z)
 x=new M.aY(z)
-return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.Wb(a)),"deliver",y.$1(new M.SLX(a)),"__dartBindable",a],null,null))},
+return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.eT(a)),"deliver",y.$1(new M.Wb(a)),"__dartBindable",a],null,null))},
 tA:function(a){var z
-for(;z=J.ra5(a),z!=null;a=z);return a},
-cS:function(a,b){var z,y,x,w,v,u
+for(;z=J.cP(a),z!=null;a=z);return a},
+l5: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=$.nR()
+y=$.Uo()
 y.toString
-x=H.vA(a,"expando$values")
-w=x==null?null:H.vA(x,y.V2())
+x=H.of(a,"expando$values")
+w=x==null?null:H.of(x,y.V2())
 y=w==null
-if(!y&&w.gcA()!=null)v=J.yR(w.gcA(),z)
+if(!y&&w.gNK()!=null)v=J.Eh(w.gNK(),z)
 else{u=J.x(a)
-v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
+v=!!u.$isSy||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gXD()
+a=w.gLx()
 if(a==null)return}},
-nk:function(a,b,c){if(c==null)return
-return new M.iT(a,b,c)},
+ah:function(a,b,c){if(c==null)return
+return new M.hg(a,b,c)},
 pNz:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$isUn){y=S.j9(a.textContent,M.nk("text",a,b))
+if(!!z.$iskJ){y=S.iw(a.textContent,M.ah("text",a,b))
 if(y!=null)return new M.XI(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
-return S.j9(z,M.nk(b,a,c))},
+return S.iw(z,M.ah(b,a,c))},
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -20956,18 +21190,18 @@
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
-v=new M.qf(null,null,null,z,null,null)
+v=new M.qfK(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
 v.Z0=z
 x=M.rJ(a,"bind",b)
 v.lC=x
 u=M.rJ(a,"repeat",b)
 v.vJ=u
-if(z!=null&&x==null&&u==null)v.lC=S.j9("{{}}",M.nk("bind",a,b))
+if(z!=null&&x==null&&u==null)v.lC=S.iw("{{}}",M.ah("bind",a,b))
 return v}z=z.a
 return z==null?null:new M.XI(z,null,null)},
 i8:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.cf(0)
+if(b.gqz()){z=b.Bd(0)
 y=z!=null?z.$3(d,c,!0):b.Pn(0).WK(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
 w=x.gB(b)
@@ -20979,23 +21213,23 @@
 while(!0){t=x.gB(b)
 if(typeof t!=="number")return H.s(t)
 if(!(u<t))break
-z=b.cf(u)
+z=b.Bd(u)
 t=z!=null?z.$3(d,c,!1):b.Pn(u).WK(d)
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
-jb:function(a,b,c,d){var z,y,x,w,v,u,t,s
+G5:function(a,b,c,d){var z,y,x,w,v,u,t,s
 if(b.gau())return M.i8(a,b,c,d)
-if(b.gqz()){z=b.cf(0)
+if(b.gqz()){z=b.Bd(0)
 y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.jq1)
 return b.gaW()?y:new Y.cU(y,b.gPf(),null,null,null)}y=new L.nQ(null,!1,[],null,null,null,$.jq1)
-y.vS=[]
+y.z7=[]
 x=J.U6(b)
 w=0
 while(!0){v=x.gB(b)
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{u=b.AX(w)
-z=b.cf(w)
+c$0:{u=b.U0(w)
+z=b.Bd(w)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
 else y.YU(t)
@@ -21005,7 +21239,7 @@
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.RE(b)
 y=z.gCd(b)
-x=!!J.x(a).$isvy?a:M.Xi(a)
+x=!!J.x(a).$ishs?a:M.uH(a)
 w=J.U6(y)
 v=J.RE(x)
 u=0
@@ -21014,78 +21248,78 @@
 if(!(u<t))break
 s=w.t(y,u)
 r=w.t(y,u+1)
-q=v.nR(x,s,M.jb(s,r,a,c),r.gau())
+q=v.nR(x,s,M.G5(s,r,a,c),r.gau())
 if(q!=null&&!0)d.push(q)
 u+=2}v.lL(x)
-if(!z.$isqf)return
-p=M.Xi(a)
+if(!z.$isqfK)return
+p=M.uH(a)
 p.sQk(c)
 o=p.KI(b)
 if(o!=null&&!0)d.push(o)},
-Xi:function(a){var z,y,x,w
-z=$.as()
+uH:function(a){var z,y,x,w
+z=$.rw()
 z.toString
-y=H.vA(a,"expando$values")
-x=y==null?null:H.vA(y,z.V2())
+y=H.of(a,"expando$values")
+x=y==null?null:H.of(y,z.V2())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.bq.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
 else w=!1
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,P.XY(a),null):new M.vy(a,P.XY(a),null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,P.kW(a),null):new M.hs(a,P.kW(a),null)
 z.u(0,a,x)
 return x},
 CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.bq.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
 return z},
-vE:{
+VE:{
 "^":"a;oe",
 op:function(a,b,c){return},
 static:{"^":"ac"}},
 XI:{
-"^":"a;Cd>,ks>,rz>",
+"^":"a;Cd>,qu>,rz>",
 ghK:function(){return!1},
-f8:function(a){var z=this.ks
+f8:function(a){var z=this.qu
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
-qf:{
-"^":"XI;Z0,lC,vJ,Cd,ks,rz",
+qfK:{
+"^":"XI;Z0,lC,vJ,Cd,qu,rz",
 ghK:function(){return!0},
-$isqf:true},
-vy:{
+$isqfK:true},
+hs:{
 "^":"a;KB<,qf,qL?",
 gCd:function(a){var z=J.UQ(this.qf,"bindings_")
 if(z==null)return
 return new M.lb(this.gKB(),z)},
 sCd:function(a,b){var z=this.gCd(this)
-if(z==null){J.kW(this.qf,"bindings_",P.jT(P.Fl(null,null)))
+if(z==null){J.qQ(this.qf,"bindings_",P.jT(P.Fl(null,null)))
 z=this.gCd(this)}z.FV(0,b)},
-nR:function(a,b,c,d){b=M.aR(this.gKB(),b)
+nR:function(a,b,c,d){b=M.b1(this.gKB(),b)
 if(!d&&!!J.x(c).$isAp)c=M.fg(c)
 return M.xa(this.qf.V7("bind",[b,c,d]))},
 lL:function(a){return this.qf.nQ("bindFinished")},
-gmb:function(a){var z=this.qL
+gCn:function(a){var z=this.qL
 if(z!=null);else if(J.Lp(this.gKB())!=null){z=J.Lp(this.gKB())
-z=J.re(!!J.x(z).$isvy?z:M.Xi(z))}else z=null
+z=J.OC(!!J.x(z).$ishs?z:M.uH(z))}else z=null
 return z},
-$isvy:true},
+$ishs:true},
 lb:{
 "^":"ilb;KB<,dn<",
 gvc:function(a){return J.kl(J.UQ($.Xw(),"Object").V7("keys",[this.dn]),new M.Tl(this))},
-t:function(a,b){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
+t:function(a,b){if(!!J.x(this.KB).$iskJ&&J.xC(b,"text"))b="textContent"
 return M.xa(J.UQ(this.dn,b))},
-u:function(a,b,c){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
-J.kW(this.dn,b,M.fg(c))},
+u:function(a,b,c){if(!!J.x(this.KB).$iskJ&&J.xC(b,"text"))b="textContent"
+J.qQ(this.dn,b,M.fg(c))},
 Rz:[function(a,b){var z,y,x
 z=this.KB
-b=M.aR(z,b)
+b=M.b1(z,b)
 y=this.dn
-x=M.xa(J.UQ(y,M.aR(z,b)))
+x=M.xa(J.UQ(y,M.b1(z,b)))
 y.Ji(b)
 return x},"$1","gUS",2,0,233,58],
 V1:function(a){J.Me(this.gvc(this),this.gUS(this))},
@@ -21093,17 +21327,17 @@
 $asT8:function(){return[P.qU,A.Ap]}},
 Tl:{
 "^":"TpZ:12;a",
-$1:[function(a){return!!J.x(this.a.KB).$isUn&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
+$1:[function(a){return!!J.x(this.a.KB).$iskJ&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
 $isEH:true},
-VB:{
+dP:{
 "^":"Ap;qf",
 TR:function(a,b){return this.qf.V7("open",[$.X3.mS(b)])},
 xO:function(a){return this.qf.nQ("close")},
 gP:function(a){return this.qf.nQ("discardChanges")},
 sP:function(a,b){this.qf.V7("setValue",[b])},
 fR:function(){return this.qf.nQ("deliver")},
-$isVB:true},
-Ra:{
+$isdP:true},
+Vf:{
 "^":"TpZ:12;a",
 $1:function(a){return this.a.xi(a,!1)},
 $isEH:true},
@@ -21127,80 +21361,80 @@
 "^":"TpZ:76;f",
 $0:[function(){return J.Vm(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Wb:{
+eT:{
 "^":"TpZ:12;UI",
 $1:[function(a){J.Fc(this.UI,a)
 return a},"$1",null,2,0,null,180,"call"],
 $isEH:true},
-SLX:{
+Wb:{
 "^":"TpZ:76;bK",
 $0:[function(){return this.bK.fR()},"$0",null,0,0,null,"call"],
 $isEH:true},
 qU9:{
-"^":"a;k8>,tA,MC"},
+"^":"a;k8>,tA,ip"},
 DT:{
-"^":"vy;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
+"^":"hs;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
 gKB:function(){return this.KB},
 nR:function(a,b,c,d){var z,y
-if(!J.xC(b,"ref"))return M.vy.prototype.nR.call(this,this,b,c,d)
-z=d?c:J.mu(c,new M.De(this))
+if(!J.xC(b,"ref"))return M.hs.prototype.nR.call(this,this,b,c,d)
+z=d?c:J.mu(c,new M.Aj(this))
 J.Vs(this.KB).dA.setAttribute("ref",z)
 this.NB()
 if(d)return
 if(this.gCd(this)==null)this.sCd(0,P.Fl(null,null))
 y=this.gCd(this)
-J.kW(y.dn,M.aR(y.KB,"ref"),M.fg(c))
+J.qQ(y.dn,M.b1(y.KB,"ref"),M.fg(c))
 return c},
 KI:function(a){var z=this.kr
-if(z!=null)z.la()
+if(z!=null)z.qT()
 if(a.Z0==null&&a.lC==null&&a.vJ==null){z=this.kr
 if(z!=null){z.xO(0)
 this.kr=null}return}z=this.kr
 if(z==null){z=new M.TGm(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
 this.kr=z}z.FE(a,this.Qk)
-J.ZW($.ik(),this.KB,["ref"],!0)
+J.ZW($.TQ(),this.KB,["ref"],!0)
 return this.kr},
-v3:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+eX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(c==null)c=this.Rc
 z=this.XA
-if(z==null){z=this.gPI()
-z=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
+if(z==null){z=this.gws()
+z=J.ti(!!J.x(z).$ishs?z:M.uH(z))
 this.XA=z}y=J.RE(z)
 if(y.gNL(z)==null)return $.zl()
 x=c==null?$.Bu():c
 w=x.oe
 if(w==null){w=H.VM(new P.qo(null),[null])
 x.oe=w}v=w.t(0,z)
-if(v==null){v=M.dg(z,x)
+if(v==null){v=M.iX(z,x)
 x.oe.u(0,z,v)}w=this.dK
-if(w==null){u=J.lu(this.KB)
-w=$.Ou()
+if(w==null){u=J.Do(this.KB)
+w=$.MO()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
-$.Ks().u(0,t,!0)
+$.Tg().u(0,t,!0)
 M.AL(t)
 w.u(0,u,t)}this.dK=t
-w=t}s=J.O2(w)
+w=t}s=J.bs(w)
 w=[]
-r=new M.Fi(w,null,null,null)
-q=$.nR()
-r.XD=this.KB
-r.cA=z
+r=new M.qdK(w,null,null,null)
+q=$.Uo()
+r.Lx=this.KB
+r.NK=z
 q.u(0,s,r)
 p=new M.qU9(b,null,null)
-M.Xi(s).sqL(p)
+M.uH(s).sqL(p)
 for(o=y.gNL(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
 l=z?v.f8(n):null
-k=M.S0(o,s,this.dK,l,b,c,w,null)
-M.Xi(k).sqL(p)
+k=M.Ch(o,s,this.dK,l,b,c,w,null)
+M.uH(k).sqL(p)
 if(m)r.yi=k}p.tA=s.firstChild
-p.MC=s.lastChild
-r.cA=null
-r.XD=null
+p.ip=s.lastChild
+r.NK=null
+r.Lx=null
 return s},
 gk8:function(a){return this.Qk},
-gA0:function(a){return this.Rc},
-sA0:function(a,b){var z
+gG5:function(a){return this.Rc},
+sG5:function(a,b){var z
 if(this.Rc!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
 this.Rc=b
 this.Fe=null
@@ -21210,15 +21444,15 @@
 z.Mv=null}},
 NB:function(){var z,y
 if(this.kr!=null){z=this.XA
-y=this.gPI()
-y=J.f5(!!J.x(y).$isvy?y:M.Xi(y))
+y=this.gws()
+y=J.ti(!!J.x(y).$ishs?y:M.uH(y))
 y=z==null?y==null:z===y
 z=y}else z=!0
 if(z)return
 this.XA=null
 this.kr.Oo(null)
 z=this.kr
-z.OP(z.Tf())},
+z.kY(z.Tf())},
 V1:function(a){var z,y
 this.Qk=null
 this.Rc=null
@@ -21229,62 +21463,62 @@
 y.Oo(null)
 this.kr.xO(0)
 this.kr=null},
-gPI:function(){var z,y
+gws:function(){var z,y
 this.xk()
-z=M.cS(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
+z=M.l5(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
 if(z==null){z=this.Gw
-if(z==null)return this.KB}y=M.Xi(z).gPI()
+if(z==null)return this.KB}y=M.uH(z).gws()
 return y!=null?y:z},
 grz:function(a){var z
 this.xk()
 z=this.Yz
-return z!=null?z:H.Go(this.KB,"$isOH").content},
-cl:function(a){var z,y,x,w,v,u,t
+return z!=null?z:H.Go(this.KB,"$isyY").content},
+rp:function(a){var z,y,x,w,v,u,t
 if(this.CS===!0)return!1
 M.oR()
 M.hb()
 this.CS=!0
-z=!!J.x(this.KB).$isOH
+z=!!J.x(this.KB).$isyY
 y=!z
 if(y){x=this.KB
 w=J.RE(x)
-if(w.gQg(x).dA.hasAttribute("template")===!0&&C.bq.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+if(w.gQg(x).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
 v=M.pZ(this.KB)
-v=!!J.x(v).$isvy?v:M.Xi(v)
+v=!!J.x(v).$ishs?v:M.uH(v)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isOH
+z=!!J.x(v.gKB()).$isyY
 u=!0}else{x=this.KB
 w=J.RE(x)
-if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
+if(w.gq5(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
 w=J.RE(x)
-t=w.gJ8(x).createElement("template",null)
+t=w.gM0(x).createElement("template",null)
 w.gAd(x).insertBefore(t,x)
 t.toString
 new W.E9(t).FV(0,w.gQg(x))
 w.gQg(x).V1(0)
 w.wg(x)
-v=!!J.x(t).$isvy?t:M.Xi(t)
+v=!!J.x(t).$ishs?t:M.uH(t)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isOH}else{v=this
+z=!!J.x(v.gKB()).$isyY}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sYz(J.O2(M.TA(v.gKB())))
+u=!1}if(!z)v.sYz(J.bs(M.TA(v.gKB())))
 if(a!=null)v.sGw(a)
-else if(y)M.O1(v,this.KB,u)
-else M.hM(J.f5(v))
+else if(y)M.KE(v,this.KB,u)
+else M.Af(J.ti(v))
 return!0},
-xk:function(){return this.cl(null)},
+xk:function(){return this.rp(null)},
 $isDT:true,
-static:{"^":"Ub,v2,YO,vU,Xa,joK",TA:function(a){var z,y,x,w
-z=J.lu(a)
+static:{"^":"Ub,Xi,YO,vU,Hg,joK",TA:function(a){var z,y,x,w
+z=J.Do(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.B8().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
 if(w!=null)w.removeChild(x)}$.B8().u(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
-y=z.gJ8(a).createElement("template",null)
+y=z.gM0(a).createElement("template",null)
 z.gAd(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
 switch(w){case"template":v=z.gQg(a).dA
 v.getAttribute(w)
 v.removeAttribute(w)
@@ -21294,27 +21528,27 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},O1:function(a,b,c){var z,y,x,w
-z=J.f5(a)
+break}}return y},KE:function(a,b,c){var z,y,x,w
+z=J.ti(a)
 if(c){J.y2(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gNL(b),w!=null;)x.mx(z,w)},hM:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gNL(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
 z=new M.CE()
-y=J.We(a,$.S1())
+y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
 J.t3(z,H.d($.S1())+" { display: none; }")
 document.head.appendChild(z)},hb:function(){var z,y
-if($.Xa===!0)return
-$.Xa=!0
+if($.Hg===!0)return
+$.Hg=!0
 z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
+if(!!J.x(z).$isyY){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
 if(J.lL(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
-J.dc(z,document.baseURI)
+J.PS(z,document.baseURI)
 J.lL(a).appendChild(z)}}},
-De:{
+Aj:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 J.Vs(z.KB).dA.setAttribute("ref",a)
@@ -21322,26 +21556,26 @@
 $isEH:true},
 CE:{
 "^":"TpZ:19;",
-$1:function(a){if(!M.Xi(a).cl(null))M.hM(J.f5(!!J.x(a).$isvy?a:M.Xi(a)))},
+$1:function(a){if(!M.uH(a).rp(null))M.Af(J.ti(!!J.x(a).$ishs?a:M.uH(a)))},
 $isEH:true},
-DOe:{
+W6o:{
 "^":"TpZ:12;",
 $1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,141,"call"],
 $isEH:true},
-Ufa:{
+YJG:{
 "^":"TpZ:81;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.Xi(J.l2(z.gl())).NB()},"$2",null,4,0,null,183,13,"call"],
+for(z=J.mY(a);z.G();)M.uH(J.l2(z.gl())).NB()},"$2",null,4,0,null,183,13,"call"],
 $isEH:true},
-Raa:{
+DOe:{
 "^":"TpZ:76;",
 $0:function(){var z=document.createDocumentFragment()
-$.nR().u(0,z,new M.Fi([],null,null,null))
+$.Uo().u(0,z,new M.qdK([],null,null,null))
 return z},
 $isEH:true},
-Fi:{
-"^":"a;dn<,yi<,XD<,cA<"},
-iT:{
+qdK:{
+"^":"a;dn<,yi<,Lx<,NK<"},
+hg:{
 "^":"TpZ:12;a,b,c",
 $1:function(a){return this.c.op(a,this.a,this.b)},
 $isEH:true},
@@ -21352,7 +21586,7 @@
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
 else z=!1
 if(z)return
-y=S.j9(b,M.nk(a,this.b,this.c))
+y=S.iw(b,M.ah(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
@@ -21362,11 +21596,11 @@
 z.push(y)}},
 $isEH:true},
 TGm:{
-"^":"Ap;yQ,tM,nH,dO,vx,Up,h6,dz,Gi,vj,lH,AB,z1,iz,Mv",
+"^":"Ap;kb,tM,nH,dO,TE,Up,h6,RS,Gi,vj,lH,AB,z1,iz,Mv",
 ln:function(a){return this.iz.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.h6},
-la:function(){var z,y
+qT:function(){var z,y
 z=this.Up
 y=J.x(z)
 if(!!y.$isAp){y.xO(z)
@@ -21375,14 +21609,14 @@
 if(!!y.$isAp){y.xO(z)
 this.h6=null}},
 FE:function(a,b){var z,y,x,w,v
-this.la()
-z=this.yQ.KB
+this.qT()
+z=this.kb.KB
 y=a.Z0
 x=y!=null
-this.dz=x
+this.RS=x
 this.Gi=a.vJ!=null
 if(x){this.vj=y.au
-w=M.jb("if",y,z,b)
+w=M.G5("if",y,z,b)
 this.Up=w
 y=this.vj===!0
 if(y)x=!(null!=w&&!1!==w)
@@ -21391,11 +21625,11 @@
 return}if(!y)w=H.Go(w,"$isAp").TR(0,this.ge7())}else w=!0
 if(this.Gi===!0){y=a.vJ
 this.lH=y.au
-y=M.jb("repeat",y,z,b)
+y=M.G5("repeat",y,z,b)
 this.h6=y
 v=y}else{y=a.lC
 this.lH=y.au
-y=M.jb("bind",y,z,b)
+y=M.G5("bind",y,z,b)
 this.h6=y
 v=y}if(this.lH!==!0)v=J.mu(v,this.gVN())
 if(!(null!=w&&!1!==w)){this.Oo(null)
@@ -21406,8 +21640,8 @@
 return!(null!=y&&y)?J.Vm(z):z},
 YSS:[function(a){if(!(null!=a&&!1!==a)){this.Oo(null)
 return}this.Ca(this.Tf())},"$1","ge7",2,0,19,235],
-OP:[function(a){var z
-if(this.dz===!0){z=this.Up
+kY:[function(a){var z
+if(this.RS===!0){z=this.Up
 if(this.vj!==!0){H.Go(z,"$isAp")
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Oo([])
 return}}this.Ca(a)},"$1","gVN",2,0,19,20],
@@ -21424,85 +21658,85 @@
 y=y!=null?y:[]
 this.LA(G.jj(y,0,J.q8(y),z,0,z.length))},
 Dk:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.yQ.KB
-z=$.nR()
+if(J.xC(a,-1))return this.kb.KB
+z=$.Uo()
 y=this.tM
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
 x=z.t(0,y[a]).gyi()
 if(x==null)return this.Dk(a-1)
-if(!M.CF(x)||x===this.yQ.KB)return x
-w=M.Xi(x).gkr()
+if(!M.CF(x)||x===this.kb.KB)return x
+w=M.uH(x).gkr()
 if(w==null)return x
 return w.Dk(w.tM.length-1)},
-C8:function(a){var z,y,x,w,v,u,t
+eS:function(a){var z,y,x,w,v,u,t
 z=this.Dk(J.bI(a,1))
 y=this.Dk(a)
-J.ra5(this.yQ.KB)
+J.cP(this.kb.KB)
 x=C.Nm.W4(this.tM,a)
 for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
 if(u==null?y==null:u===y)y=z
 t=u.parentNode
 if(t!=null)t.removeChild(u)
 w.mx(x,u)}return x},
-LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-if(this.vx||J.FN(a)===!0)return
-u=this.yQ
+LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d
+if(this.TE||J.FN(a)===!0)return
+u=this.kb
 t=u.KB
-if(J.ra5(t)==null){this.xO(0)
+if(J.cP(t)==null){this.xO(0)
 return}s=this.nH
-Q.Oi(s,this.dO,a)
+Q.Y5p(s,this.dO,a)
 z=u.Rc
 if(!this.z1){this.z1=!0
-r=J.qy(!!J.x(u.KB).$isDT?u.KB:u)
-if(r!=null){this.iz=r.Mn.CE(t)
+r=J.Ee(!!J.x(u.KB).$isDT?u.KB:u)
+if(r!=null){this.iz=r.xI.CE(t)
 this.Mv=null}}q=P.YM(P.XK(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.Ff
-i=this.C8(J.WB(k.gvH(m),n))
+for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
+i=this.eS(J.WB(k.gvH(m),n))
 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.WB(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
+n-=l}for(p=p.gA(a),o=this.tM;p.G();){m=p.gl()
+for(l=J.RE(m),h=l.gvH(m);J.u6(h,J.WB(l.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
 y=s[h]
 x=q.Rz(0,y)
 if(x==null)try{if(this.iz!=null)y=this.ln(y)
 if(y==null)x=$.zl()
-else x=u.v3(0,y,z)}catch(g){l=H.Ru(g)
-w=l
+else x=u.eX(0,y,z)}catch(g){k=H.Ru(g)
+w=k
 v=new H.oP(g,null)
-l=new P.Gc(0,$.X3,null,null,null,null,null,null)
-l.$builtinTypeInfo=[null]
-new P.Zf(l).$builtinTypeInfo=[null]
-k=w
-if(k==null)H.vh(P.u("Error must not be null"))
-if(l.YM!==0)H.vh(P.w("Future already completed"))
-l.Nk(k,v)
-x=$.zl()}l=x
-f=this.Dk(h-1)
-e=J.ra5(u.KB)
-C.Nm.xe(this.tM,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.Ff)},"$1","gSp",2,0,236,237],
+k=new P.Gc(0,$.X3,null,null,null,null,null,null)
+k.$builtinTypeInfo=[null]
+new P.Zf(k).$builtinTypeInfo=[null]
+f=w
+if(f==null)H.vh(P.u("Error must not be null"))
+if(k.YM!==0)H.vh(P.w("Future already completed"))
+k.Nk(f,v)
+x=$.zl()}k=x
+e=this.Dk(h-1)
+d=J.cP(u.KB)
+C.Nm.aP(o,h,k)
+d.insertBefore(k,J.p7(e))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.lo)},"$1","gSp",2,0,236,237],
 vB:[function(a){var z,y
-z=$.nR()
+z=$.Uo()
 z.toString
-y=H.vA(a,"expando$values")
-for(z=J.mY((y==null?null:H.vA(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,238],
+y=H.of(a,"expando$values")
+for(z=J.mY((y==null?null:H.of(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,238],
 ud:function(){var z=this.AB
 if(z==null)return
 z.Gv()
 this.AB=null},
 xO:function(a){var z
-if(this.vx)return
+if(this.TE)return
 this.ud()
 z=this.tM
 H.bQ(z,this.gJO())
 C.Nm.sB(z,0)
-this.la()
-this.yQ.kr=null
-this.vx=!0}}}],["","",,S,{
+this.qT()
+this.kb.kr=null
+this.TE=!0}}}],["","",,S,{
 "^":"",
 VH2:{
-"^":"a;qN,au<,ll",
+"^":"a;qN,au<,PS",
 gqz:function(){return this.qN.length===5},
 gaW:function(){var z,y
 z=this.qN
@@ -21511,10 +21745,10 @@
 if(J.xC(z[0],"")){if(4>=z.length)return H.e(z,4)
 z=J.xC(z[4],"")}else z=!1}else z=!1
 return z},
-gPf:function(){return this.ll},
+gPf:function(){return this.PS},
 qm:function(a){return this.gPf().$1(a)},
 gB:function(a){return C.jn.BU(this.qN.length,4)},
-AX:function(a){var z,y
+U0:function(a){var z,y
 z=this.qN
 y=a*4+1
 if(y>=z.length)return H.e(z,y)
@@ -21524,7 +21758,7 @@
 y=a*4+2
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-cf:function(a){var z,y
+Bd:function(a){var z,y
 z=this.qN
 y=a*4+3
 if(y>=z.length)return H.e(z,y)
@@ -21548,24 +21782,25 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.IN+=typeof s==="string"?s:H.d(s)}return y.IN},"$1","gYF",2,0,240,241],
-l3:function(a,b){this.ll=this.qN.length===5?this.gSG():this.gYF()},
-static:{"^":"rz5,xN8,t3a,epG,UO,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+y.IN+=typeof s==="string"?s:H.d(s)}z=y.IN
+return z.charCodeAt(0)==0?z:z},"$1","gYF",2,0,240,241],
+l3:function(a,b){this.PS=this.qN.length===5?this.gSG():this.gYF()},
+static:{"^":"rz5,xN8,t3a,epG,UO,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 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)
+s=C.yo.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
+p="}}"}o=t>=0?C.yo.XU(a,p,t+2):-1
 if(o<0){if(w==null)return
-w.push(C.xB.yn(a,v))
+w.push(C.yo.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(C.yo.Nj(a,v,t))
+n=C.yo.DY(C.yo.Nj(a,t+2,o))
 w.push(q)
 u=u&&q
 m=y?null:b.$1(n)
@@ -21599,53 +21834,45 @@
 ez:function(a,b){return this.Ir.$1(b)},
 $islX:true},
 KZ:{
-"^":"d3;RV,NP,Rk*,ro,XY,cU",
+"^":"d3;RV,NP,Rk*,ro,XY,iS",
 Gv:function(){this.RV.Gv()},
-ab:[function(a,b,c){var z=new Z.lX(J.Cl(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
+AS:[function(a,b,c){var z=new Z.lX(J.Ts(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
 z.Ir=Z.d8(c)
-J.bi(this.Rk,z)
-return z},function(a,b){return this.ab(a,b,null)},"ZF","$2$map","$1","gtN",2,3,242,22,243,206],
+J.dH(this.Rk,z)
+return z},function(a,b){return this.AS(a,b,null)},"WL","$2$map","$1","gtN",2,3,242,22,243,206],
 l8:function(){var z=new P.VV(null,null)
-H.Xe()
+H.w4()
 $.Ji=$.xG
 this.NP=z
-z.D5(0)
-this.RV=N.QM("").gSZ().yI(new Z.Ym(this))
+z.wE(0)
+this.RV=N.QM("").gSZ().yI(new Z.QC(this))
 this.NP.CH(0)
-J.Z8(this.Rk)},
-static:{"^":"ax",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
+J.U2(this.Rk)},
+static:{"^":"hm",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
 z.l8()
 return z}}},
-Ym:{
+QC:{
 "^":"TpZ:170;a",
-$1:[function(a){this.a.ZF(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
+$1:[function(a){this.a.WL(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
-GMB:{
-"^":"mW;f9,D1,fO",
-gA:function(a){var z,y
-z=this.D1
-y=this.fO
-if(typeof y!=="number")return H.s(y)
-return new G.vZG(this.f9,z-1,z+y)},
+YZ:{
+"^":"mW;N3,Mn,fO",
+gA:function(a){var z=this.Mn
+return new G.ay(this.N3,z-1,z+this.fO)},
 gB:function(a){return this.fO},
-a0:function(a,b,c){var z,y,x
-z=this.D1
-if(z>this.f9.vF.length)throw H.b(P.N(z))
-y=this.fO
-if(y!=null){if(typeof y!=="number")return y.C()
-x=y<0}else x=!1
-if(x)throw H.b(P.N(y))
-if(typeof y!=="number")return y.g()
-z=y+z
-if(z>this.f9.vF.length)throw H.b(P.N(z))},
+a0:function(a,b,c){var z=this.Mn
+if(z>this.N3.Bx.length)throw H.b(P.N(z))
+if(this.fO<0)throw H.b(P.N(this.fO))
+z=this.fO+z
+if(z>this.N3.Bx.length)throw H.b(P.N(z))},
 $asmW:function(){return[null]},
 $asQV:function(){return[null]}},
-vZG:{
-"^":"a;f9,D1,c0",
-gl:function(){return C.xB.j(this.f9.vF,this.D1)},
-G:function(){return++this.D1<this.c0},
-eR:function(a,b){this.D1+=b}}}],["","",,Z,{
+ay:{
+"^":"a;N3,Mn,c0",
+gl:function(){return C.yo.j(this.N3.Bx,this.Mn)},
+G:function(){return++this.Mn<this.c0},
+eR:function(a,b){this.Mn+=b}}}],["","",,Z,{
 "^":"",
 kb:{
 "^":"a;aH,Rr,O4",
@@ -21654,26 +21881,26 @@
 G:function(){var z,y,x,w,v,u
 this.O4=null
 z=this.aH
-y=++z.D1
+y=++z.Mn
 x=z.c0
 if(y>=x)return!1
-w=z.f9.vF
-v=C.xB.j(w,y)
+w=z.N3.Bx
+v=C.yo.j(w,y)
 if(v>=55296)y=v>57343&&v<=65535
 else y=!0
 if(y)this.O4=v
-else if(v<56320&&++z.D1<x){u=C.xB.j(w,z.D1)
+else if(v<56320&&++z.Mn<x){u=C.yo.j(w,z.Mn)
 if(u>=56320&&u<=57343)this.O4=(v-55296<<10>>>0)+(65536+(u-56320))
-else{if(u>=55296&&u<56320)--z.D1
+else{if(u>=55296&&u<56320)--z.Mn
 this.O4=this.Rr}}else this.O4=this.Rr
 return!0}}}],["","",,U,{
 "^":"",
 LQ:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.vF.length-b
-new G.GMB(a,b,z).a0(a,b,c)
+z=a.Bx.length-b
+new G.YZ(a,b,z).a0(a,b,c)
 z=b+z
 y=b-1
-x=new Z.kb(new G.vZG(a,y,z),d,null)
+x=new Z.kb(new G.ay(a,y,z),d,null)
 w=H.VM(Array(z-y-1),[P.KN])
 for(z=w.length,v=0;x.G();v=u){u=v+1
 y=x.O4
@@ -21686,25 +21913,25 @@
 return t}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V65;GG,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V66;GG,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gN:function(a){return a.GG},
-sN:function(a,b){a.GG=this.ct(a,C.ft,a.GG,b)},
+sN:function(a,b){a.GG=this.ct(a,C.pD,a.GG,b)},
 ghS:function(a){var z=a.GG
 if(z==null)return!1
 return z.gA9()},
 gnI:function(a){var z=$.Kh.Nv
 if(z==null)return!1
 return J.xC(H.Go(z,"$isKM").N,a.GG)},
-xX:[function(a,b,c,d){var z,y,x,w
+f8D:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
-y=z.gEV(b)
+y=z.gAy(b)
 if(typeof y!=="number")return y.D()
-if(y>0||z.gNl(b)===!0||z.gEX(b)===!0||z.gqx(b)===!0||z.gYK(b)===!0)return
-z.e6(b)
+if(y>0||z.gNl(b)===!0||z.gTu(b)===!0||z.gkA(b)===!0||z.gw4(b)===!0)return
+z.TI(b)
 x=$.Kh.Nv
 if(x==null||!J.xC(J.l2(x),a.GG)){z=$.Kh
 y=a.GG
-y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).dA.getAttribute("href")
 $.Kh.Z6.bo(0,w)},"$3","gkD",6,0,171,87,106,186],
@@ -21723,7 +21950,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21733,35 +21960,35 @@
 C.J57.LX(a)
 C.J57.XI(a)
 return a}}},
-V65:{
+V66:{
 "^":"uL+Pi;",
 $isd3:true},
 D2:{
-"^":"V66;ot,YE,E6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V67;ot,KW,E6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gvm:function(a){return a.ot},
 svm:function(a,b){a.ot=this.ct(a,C.uX,a.ot,b)},
-gHL:function(a){return a.YE},
-sHL:function(a,b){a.YE=this.ct(a,C.oE,a.YE,b)},
+gHL:function(a){return a.KW},
+sHL:function(a,b){a.KW=this.ct(a,C.oE,a.KW,b)},
 gFK:function(a){return a.E6},
 sFK:function(a,b){a.E6=this.ct(a,C.am,a.E6,b)},
-yY:function(a){this.iW(a)},
+yY:function(a){this.Wd(a)},
 VP:function(a,b){if(J.co(b,"ws://"))return b
 return"ws://"+H.d(b)+"/ws"},
 nyC:[function(a,b,c,d){var z,y,x
-J.fD(b)
+J.jD(b)
 z=this.VP(a,a.ot)
-d=$.Kh.m2.TP(z)
+d=$.Kh.m2.J8(z)
 y=$.Kh
-x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,116,2,106,107],
-pe:[function(a,b,c,d){J.fD(b)
-this.iW(a)},"$3","gzG",6,0,116,2,106,107],
-iW:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
+$.Kh.Z6.bo(0,"#/vm")},"$3","guZ",6,0,116,2,106,107],
+jLH:[function(a,b,c,d){J.jD(b)
+this.Wd(a)},"$3","gzG",6,0,116,2,106,107],
+Wd:function(a){G.QX(a.KW).ml(new V.Vn(a)).OA(new V.oU(a))},
 Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
-static:{Hr:function(a){var z,y,x,w,v
+static:{n5p:function(a){var z,y,x,w,v
 z=Q.pT(null,L.Z5)
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -21769,9 +21996,9 @@
 w=P.Fl(null,null)
 v=P.Fl(null,null)
 a.ot=""
-a.YE="localhost:9222"
+a.KW="localhost:9222"
 a.E6=z
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
@@ -21782,14 +22009,14 @@
 C.aXh.XI(a)
 C.aXh.Kq(a)
 return a}}},
-V66:{
+V67:{
 "^":"uL+Pi;",
 $isd3:true},
 Vn:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w
 z=this.a
-J.Z8(z.E6)
+J.U2(z.E6)
 if(a==null)return
 y=J.U6(a)
 x=0
@@ -21797,23 +22024,23 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,244,"call"],
+J.dH(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,244,"call"],
 $isEH:true},
 oU:{
 "^":"TpZ:12;b",
-$1:[function(a){J.Z8(this.b.E6)},"$1",null,2,0,null,2,"call"],
+$1:[function(a){J.U2(this.b.E6)},"$1",null,2,0,null,2,"call"],
 $isEH:true}}],["","",,X,{
 "^":"",
 I5:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{yC:function(a){var z,y,x,w
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{vC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21825,7 +22052,7 @@
 return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V67;uB,lc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V68;uB,lc,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
@@ -21837,17 +22064,17 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Hd.LX(a)
-C.Hd.XI(a)
+C.Tkx.LX(a)
+C.Tkx.XI(a)
 return a}}},
-V67:{
+V68:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
@@ -21855,15 +22082,15 @@
 ;(function(){var z=!0,y
 y=P.KN
 y.$isKN=z
-y.$islf=z
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
-y=P.Vf
-y.$isVf=z
-y.$islf=z
+y=P.CP
+y.$isCP=z
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
 y=W.KV
 y.$isKV=z
@@ -21874,11 +22101,11 @@
 y.$isfRn=z
 y.$asfRn=[P.qU]
 y.$isa=z
-W.QI.$isa=z
-y=P.lf
-y.$islf=z
+W.M5K.$isa=z
+y=P.FK
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
 y=N.Ng
 y.$isfRn=z
@@ -21889,61 +22116,61 @@
 y.$isfRn=z
 y.$asfRn=[P.a6]
 y.$isa=z
-y=W.h4
-y.$ish4=z
-y.$isKV=z
-y.$isa=z
+P.a.$isa=z
+P.Od.$isa=z
 y=P.WO
 y.$isWO=z
 y.$isQV=z
 y.$isa=z
-P.Od.$isa=z
-P.oz.$isa=z
-P.a.$isa=z
 y=A.Ap
 y.$isAp=z
 y.$isa=z
-y=K.Aep
-y.$isAep=z
+P.oz.$isa=z
+y=W.h4
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=K.O1
+y.$isO1=z
 y.$isa=z
 y=U.x06
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.FH
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.uku
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.fp
 y.$isfp=z
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.nu
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.Mm
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
-y=U.c0
-y.$isrx=z
+y=U.c09
+y.$ishw=z
 y.$isa=z
-y=U.noG
-y.$isrx=z
+y=U.Dv
+y.$ishw=z
 y.$isa=z
 y=U.RWc
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.vn
 y.$isvn=z
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.x9
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
-y=U.WH
-y.$isWH=z
-y.$isrx=z
+y=U.EO
+y.$isEO=z
+y.$ishw=z
 y.$isa=z
 y=P.IN
 y.$isIN=z
@@ -21955,12 +22182,19 @@
 y=T.yj
 y.$isyj=z
 y.$isa=z
-y=W.Iv
-y.$ish4=z
-y.$isKV=z
+F.d3.$isa=z
+A.XP.$isa=z
+W.O7.$isa=z
+y=P.SQ
+y.$isSQ=z
 y.$isa=z
-y=L.U2
-y.$isU2=z
+G.MQ.$isa=z
+y=D.Mk
+y.$isMk=z
+y.$isaf=z
+y.$isa=z
+y=L.Z8
+y.$isZ8=z
 y.$isa=z
 y=D.af
 y.$isaf=z
@@ -21968,15 +22202,14 @@
 y=D.bv
 y.$isaf=z
 y.$isa=z
+y=G.Zq
+y.$isZq=z
+y.$isyj=z
+y.$isa=z
 D.ta.$isa=z
 D.ER.$isa=z
-y=D.vO
-y.$isvO=z
+y=D.xB
 y.$isaf=z
-y.$isqC=z
-y.$asqC=[null,null]
-y.$isT8=z
-y.$asT8=[null,null]
 y.$isa=z
 y=D.Kp
 y.$isaf=z
@@ -21998,80 +22231,46 @@
 y.$isvx=z
 y.$isaf=z
 y.$isa=z
+D.xb.$isa=z
+D.br.$isa=z
 D.c2.$isa=z
-y=G.Zq
-y.$isZq=z
-y.$isyj=z
-y.$isa=z
-y=W.BI
-y.$isea=z
-y.$isa=z
-y=W.ea
-y.$isea=z
-y.$isa=z
-y=W.cxu
-y.$iscxu=z
-y.$isea=z
-y.$isa=z
-y=P.Ol
+y=P.z5
 y.$isQV=z
 y.$isa=z
-y=P.SQ
-y.$isSQ=z
-y.$isa=z
-y=W.ew7
-y.$isea=z
-y.$isa=z
-D.Z9.$isa=z
-W.fJ.$isa=z
-y=G.Y2
-y.$isY2=z
-y.$isa=z
-y=D.kx
-y.$iskx=z
-y.$isaf=z
-y.$isa=z
-D.D5.$isa=z
-F.d3.$isa=z
-A.So.$isa=z
-y=W.AjY
-y.$isAjY=z
-y.$isea=z
-y.$isa=z
-G.OS.$isa=z
-y=D.Mk
-y.$isMk=z
-y.$isaf=z
-y.$isa=z
-y=W.niR
-y.$isniR=z
-y.$isea=z
-y.$isa=z
 y=Z.lX
 y.$islX=z
 y.$isa=z
 D.W1.$isa=z
-P.A0.$isa=z
-y=W.PGY
-y.$isea=z
+P.A5.$isa=z
+y=G.Y2
+y.$isY2=z
 y.$isa=z
-y=L.Zl
-y.$isZl=z
+y=L.Tv
+y.$isTv=z
 y.$isa=z
 K.PF.$isa=z
+y=W.Iv
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=D.kx
+y.$iskx=z
+y.$isaf=z
+y.$isa=z
+D.TH.$isa=z
 y=N.HV
 y.$isHV=z
 y.$isa=z
-H.yo.$isa=z
+H.HX.$isa=z
 H.IY.$isa=z
 H.aX.$isa=z
 y=W.I0
 y.$ishsw=z
 y.$isKV=z
 y.$isa=z
-Y.qS.$isa=z
-y=U.rx
-y.$isrx=z
+Y.PnY.$isa=z
+y=U.hw
+y.$ishw=z
 y.$isa=z
 y=P.yX
 y.$isyX=z
@@ -22079,38 +22278,50 @@
 y=L.Z5
 y.$isZ5=z
 y.$isa=z
-G.Ni.$isa=z
-y=V.qC
-y.$isqC=z
-y.$isT8=z
+G.c0.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.JBS
+y.$isJBS=z
 y.$isa=z
 y=P.BpP
 y.$isBpP=z
 y.$isa=z
-y=P.V2
-y.$isV2=z
+y=V.qC
+y.$isqC=z
+y.$isT8=z
+y.$isa=z
+y=W.cxu
+y.$iscxu=z
+y.$isea=z
+y.$isa=z
+y=P.Wy
+y.$isWy=z
 y.$isa=z
 y=P.KA
 y.$isKA=z
 y.$isNOT=z
 y.$isyX=z
 y.$isa=z
-y=P.LR
-y.$isLR=z
+y=P.JIw
+y.$isJIw=z
 y.$isKA=z
 y.$isNOT=z
 y.$isyX=z
 y.$isa=z
+y=D.vO
+y.$isvO=z
+y.$isaf=z
+y.$isqC=z
+y.$asqC=[null,null]
+y.$isT8=z
+y.$asT8=[null,null]
+y.$isa=z
 y=D.uq
 y.$isuq=z
 y.$isaf=z
 y.$isa=z
-y=P.e4y
-y.$ise4y=z
-y.$isa=z
-y=P.JBS
-y.$isJBS=z
-y.$isa=z
 y=P.fRn
 y.$isfRn=z
 y.$isa=z
@@ -22129,8 +22340,8 @@
 y=P.EH
 y.$isEH=z
 y.$isa=z
-y=P.wS
-y.$iswS=z
+y=P.cb
+y.$iscb=z
 y.$isa=z
 y=P.b8
 y.$isb8=z
@@ -22138,17 +22349,28 @@
 y=P.NOT
 y.$isNOT=z
 y.$isa=z
-y=P.fIm
-y.$isfIm=z
-y.$isa=z
 y=P.iP
 y.$isiP=z
 y.$isfRn=z
 y.$asfRn=[null]
 y.$isa=z
+y=P.fIm
+y.$isfIm=z
+y.$isa=z
+y=W.v3
+y.$isv3=z
+y.$isea=z
+y.$isa=z
+y=W.ea
+y.$isea=z
+y.$isa=z
 y=O.Hz
 y.$isHz=z
 y.$isa=z
+y=W.niR
+y.$isniR=z
+y.$isea=z
+y.$isa=z
 y=D.wv
 y.$iswv=z
 y.$isaf=z
@@ -22187,13 +22409,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.MZ(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.aN(a)}
+return J.MZ(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
@@ -22202,7 +22424,7 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.MZ(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
 return J.VA7.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
@@ -22210,188 +22432,179 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.MZ(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6L=function(a,b){return J.RE(a).sdl(a,b)}
-J.AC=function(a,b){return J.RE(a).Ky(a,b)}
+J.A6=function(a,b){return J.RE(a).sdl(a,b)}
+J.AE=function(a,b){return J.RE(a).sJb(a,b)}
 J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
+J.AU=function(a){return J.RE(a).gpM(a)}
 J.AW=function(a){return J.RE(a).gnl(a)}
 J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
-J.As=function(a){return J.Wx(a).gVz(a)}
+J.Ag=function(a){return J.RE(a).zd(a)}
+J.Ak=function(a){return J.RE(a).ghy(a)}
 J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
+J.BB=function(a){return J.RE(a).gP9(a)}
 J.BC=function(a,b){return J.RE(a).sja(a,b)}
 J.BL=function(a,b){return J.RE(a).sRd(a,b)}
 J.BQ=function(a,b){return J.Qe(a).Fr(a,b)}
-J.BT=function(a){return J.RE(a).gNG(a)}
+J.BT=function(a){return J.RE(a).goN(a)}
 J.BZ=function(a){return J.RE(a).gnv(a)}
 J.Bj=function(a,b){return J.RE(a).snl(a,b)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
+J.CA=function(a){return J.RE(a).gil(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.CN=function(a){return J.RE(a).gd0(a)}
-J.CP=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.CS=function(a,b){return J.RE(a).sCd(a,b)}
-J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
-J.Cs=function(a){return J.RE(a).gyg(a)}
+J.CNb=function(a){return J.RE(a).gd0(a)}
+J.Co=function(a,b){return J.RE(a).szH(a,b)}
+J.Cr=function(a){return J.RE(a).gEQ(a)}
+J.Cs=function(a){return J.RE(a).gWw(a)}
+J.Ct=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
 J.Cz=function(a,b,c){return J.w1(a).oq(a,b,c)}
-J.D4=function(a,b){return J.RE(a).sA0(a,b)}
-J.D8=function(a){return J.RE(a).gl6(a)}
 J.DA=function(a){return J.RE(a).goc(a)}
-J.DF=function(a,b){return J.RE(a).soc(a,b)}
-J.DG=function(a,b){return J.RE(a).Tk(a,b)}
 J.DP=function(a,b,c){return J.U6(a).XU(a,b,c)}
+J.Dc=function(a){return J.RE(a).gEa(a)}
+J.Do=function(a){return J.RE(a).gM0(a)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
-J.Dv=function(a){return J.Wx(a).zQ(a)}
-J.E3=function(a){return J.RE(a).gRu(a)}
+J.E1=function(a){return J.RE(a).gi0(a)}
 J.EC=function(a,b){return J.RE(a).svm(a,b)}
 J.EE=function(a,b){return J.RE(a).sFF(a,b)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Ed=function(a,b){return J.RE(a).sFK(a,b)}
-J.Eh=function(a,b){return J.Wx(a).O(a,b)}
+J.Ee=function(a){return J.RE(a).gG5(a)}
+J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
 J.Ei=function(a,b){return J.w1(a).uk(a,b)}
 J.Eo=function(a,b){return J.RE(a).sDQ(a,b)}
 J.Er=function(a){return J.RE(a).gu6(a)}
+J.Es=function(a){return J.w1(a).gtH(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.F9=function(a){return J.RE(a).gvm(a)}
 J.FI=function(a,b){return J.RE(a).sih(a,b)}
 J.FN=function(a){return J.U6(a).gl0(a)}
 J.FS=function(a){return J.RE(a).gwp(a)}
+J.FS1=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
 J.FW=function(a,b){return J.Qc(a).iM(a,b)}
 J.Fc=function(a,b){return J.RE(a).sP(a,b)}
 J.Fd=function(a,b,c){return J.w1(a).aM(a,b,c)}
+J.Ff=function(a){return J.RE(a).gLc(a)}
+J.Fi=function(a){return J.RE(a).gnZ(a)}
 J.Fv=function(a,b){return J.RE(a).sFR(a,b)}
 J.Fy=function(a){return J.RE(a).h9(a)}
 J.G7=function(a,b){return J.RE(a).seZ(a,b)}
-J.GF=function(a){return J.RE(a).gz2(a)}
-J.GG=function(a){return J.Qe(a).gNq(a)}
 J.GH=function(a){return J.RE(a).gyW(a)}
-J.GL=function(a){return J.RE(a).gBp(a)}
-J.GW=function(a){return J.RE(a).gVY(a)}
+J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.GZ=function(a,b){return J.RE(a).sph(a,b)}
-J.Gl=function(a){return J.RE(a).ghy(a)}
+J.Gt=function(a){return J.RE(a).gRY(a)}
 J.H1=function(a){return J.RE(a).gLe(a)}
-J.H2=function(a){return J.RE(a).gYi(a)}
-J.H3=function(a,b){return J.RE(a).sZA(a,b)}
+J.H3=function(a){return J.RE(a).gl6(a)}
 J.H4=function(a,b){return J.RE(a).wR(a,b)}
 J.HB=function(a){return J.RE(a).gxT(a)}
-J.HP=function(a){return J.RE(a).gFK(a)}
+J.HL=function(a){return J.RE(a).gvq(a)}
+J.HP=function(a){return J.RE(a).ghf(a)}
+J.HS=function(a){return J.RE(a).guS(a)}
 J.HT=function(a,b){return J.RE(a).sLc(a,b)}
+J.Hd=function(a){return J.RE(a).gLF(a)}
 J.Hf=function(a,b){return J.RE(a).seo(a,b)}
-J.Hg=function(a){return J.RE(a).gP9(a)}
 J.Hh=function(a,b){return J.RE(a).sO9(a,b)}
-J.Hn=function(a,b){return J.RE(a).sxT(a,b)}
-J.Ho=function(a){return J.RE(a).WJ(a)}
+J.Hm=function(a){return J.RE(a).gTK(a)}
+J.Hq=function(a){return J.RE(a).grV(a)}
 J.Hs=function(a){return J.RE(a).goL(a)}
 J.Hy=function(a){return J.RE(a).gZp(a)}
-J.IB=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
-J.II=function(a){return J.w1(a).Jd(a)}
+J.I1=function(a){return J.RE(a).gCF(a)}
 J.IL=function(a){return J.RE(a).goE(a)}
-J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
-J.IR=function(a){return J.RE(a).gkZ(a)}
-J.IX=function(a,b){return J.RE(a).sEu(a,b)}
+J.IR=function(a){return J.RE(a).gYt(a)}
+J.IX=function(a,b){return J.RE(a).sTj(a,b)}
+J.Ij=function(a){return J.w1(a).Oe(a)}
+J.Ip=function(a,b){return J.RE(a).QS(a,b)}
 J.Ir=function(a){return J.RE(a).gyK(a)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J0=function(a,b){return J.RE(a).sR1(a,b)}
-J.J1=function(a,b){return J.RE(a).rW(a,b)}
+J.J1=function(a){return J.RE(a).PJ(a)}
+J.J2g=function(a){return J.RE(a).UV(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.Qe(a).h8(a,b,c)}
+J.JC=function(a){return J.RE(a).gCw(a)}
 J.JG=function(a,b){return J.RE(a).si0(a,b)}
+J.JU=function(a){return J.RE(a).gGc(a)}
 J.JX=function(a){return J.RE(a).gpE(a)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Jj=function(a){return J.RE(a).gWA(a)}
+J.Jh=function(a){return J.RE(a).guh(a)}
 J.Jl=function(a,b){return J.RE(a).sML(a,b)}
-J.Jp=function(a){return J.RE(a).gjl(a)}
-J.Jr=function(a){return J.RE(a).gGV(a)}
-J.Jv=function(a){return J.RE(a).gzG(a)}
-J.K0=function(a){return J.RE(a).gd4(a)}
-J.K2=function(a){return J.RE(a).gtN(a)}
+J.Jp9=function(a){return J.RE(a).gjl(a)}
+J.Jq=function(a){return J.RE(a).gFF(a)}
+J.Jv=function(a){return J.RE(a).gfg(a)}
 J.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.KG=function(a){return J.RE(a).guz(a)}
-J.Kd=function(a){return J.RE(a).gCF(a)}
-J.Kj=function(a){return J.RE(a).gYt(a)}
+J.Kf=function(a){return J.RE(a).gtN(a)}
 J.Kl=function(a){return J.RE(a).gBP(a)}
-J.L1=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
-J.L6=function(a){return J.RE(a).glD(a)}
-J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
+J.Ks=function(a){return J.RE(a).gPe(a)}
+J.Kv=function(a){return J.RE(a).gyZ(a)}
+J.Kw=function(a,b){return J.RE(a).sLF(a,b)}
+J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.L6=function(a){return J.RE(a).gRu(a)}
 J.LE=function(a){return J.RE(a).VD(a)}
+J.LF=function(a){return J.RE(a).gpf(a)}
+J.LL=function(a){return J.RE(a).gFK(a)}
 J.LM=function(a){return J.RE(a).gn9(a)}
-J.LW=function(a,b,c){return J.RE(a).AS(a,b,c)}
-J.LY=function(a){return J.RE(a).gi0(a)}
+J.LY4=function(a){return J.RE(a).gBp(a)}
 J.La=function(a,b){return J.RE(a).sBN(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
-J.Lh=function(a){if(typeof a=="number")return-a
-return J.Wx(a).J(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
-J.M2=function(a){return J.RE(a).gFF(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
 J.MF=function(a,b){return J.RE(a).syK(a,b)}
-J.MI=function(a,b){return J.RE(a).sQR(a,b)}
-J.MQ=function(a){return J.w1(a).grZ(a)}
+J.MI=function(a,b){return J.RE(a).PN(a,b)}
 J.MT=function(a){return J.RE(a).guc(a)}
-J.MU=function(a){return J.RE(a).Fc(a)}
+J.MV=function(a){return J.RE(a).gRq(a)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
-J.Mh=function(a,b){return J.RE(a).sTj(a,b)}
-J.Mp=function(a){return J.w1(a).wg(a)}
-J.Mx=function(a){return J.RE(a).gks(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
-J.NB=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
-J.NC=function(a){return J.RE(a).gHy(a)}
-J.NDJ=function(a){return J.RE(a).gWt(a)}
+J.NA=function(a,b){return J.RE(a).sG5(a,b)}
+J.NC=function(a){return J.RE(a).gNG(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
 J.NH=function(a,b){return J.RE(a).swv(a,b)}
 J.NO=function(a,b){return J.RE(a).soE(a,b)}
-J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
-J.NV=function(a){return J.RE(a).gYe(a)}
+J.NQ=function(a){return J.Wx(a).zQ(a)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-J.Nb=function(a){return J.RE(a).gdH(a)}
-J.Nd=function(a){return J.w1(a).br(a)}
+J.Nb=function(a){return J.RE(a).gt0(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
-J.Nh=function(a,b){return J.RE(a).sz2(a,b)}
 J.Nj=function(a,b,c){return J.Qe(a).Nj(a,b,c)}
-J.Nq=function(a){return J.RE(a).gGc(a)}
-J.O2=function(a){return J.RE(a).JP(a)}
+J.Nx=function(a){return J.RE(a).gMN(a)}
 J.O8=function(a){return J.RE(a).Sd(a)}
-J.OB=function(a){return J.RE(a).gfg(a)}
+J.OC=function(a){return J.RE(a).gCn(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
-J.OT=function(a){return J.RE(a).gXE(a)}
+J.OH=function(a){return J.w1(a).grZ(a)}
+J.OX=function(a){return J.Qe(a).gNq(a)}
 J.Oh=function(a){return J.RE(a).gG1(a)}
-J.Ok=function(a){return J.RE(a).ghU(a)}
+J.Oi=function(a){return J.RE(a).gBo(a)}
+J.Okq=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
+J.P5=function(a){return J.RE(a).gHo(a)}
 J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
 J.PG=function(a){return J.RE(a).gEE(a)}
-J.PK=function(a){return J.RE(a).gQR(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
-J.PR=function(a){return J.RE(a).gA5(a)}
-J.PS=function(a){return J.x(a).gCR(a)}
+J.PQ=function(a){return J.RE(a).gVY(a)}
+J.PS=function(a,b){return J.RE(a).sLU(a,b)}
 J.PW=function(a){return J.RE(a).gVb(a)}
-J.PY=function(a){return J.RE(a).goN(a)}
-J.Pc=function(a,b){return J.RE(a).yU(a,b)}
-J.Pf=function(a){return J.RE(a).gWw(a)}
 J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
 J.Pp=function(a,b){return J.Qe(a).j(a,b)}
 J.Pq=function(a){return J.RE(a).gqF(a)}
-J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
 J.Px=function(a,b){return J.RE(a).swp(a,b)}
-J.Q0=function(a,b){return J.U6(a).OY(a,b)}
+J.Q0=function(a){return J.RE(a).gwh(a)}
 J.Q2=function(a){return J.RE(a).gO3(a)}
+J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
+J.QY=function(a,b,c){return J.U6(a).eM(a,b,c)}
 J.Qd=function(a){return J.RE(a).gRn(a)}
 J.Ql=function(a,b){return J.RE(a).sdu(a,b)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
@@ -22399,85 +22612,79 @@
 J.Qy=function(a,b){return J.RE(a).shf(a,b)}
 J.R1=function(a){return J.RE(a).Fn(a)}
 J.R8=function(a,b){return J.RE(a).sMT(a,b)}
-J.RC=function(a){return J.RE(a).gTA(a)}
-J.RI=function(a){return J.RE(a).gRT(a)}
+J.RH0=function(a){return J.RE(a).gwX(a)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
 J.Rp=function(a,b){return J.RE(a).sod(a,b)}
-J.Rr=function(a){return J.RE(a).ga7(a)}
-J.Ry=function(a){return J.RE(a).gVE(a)}
+J.Rv=function(a){return J.w1(a).wg(a)}
+J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
 J.SK=function(a){return J.RE(a).xW(a)}
 J.SM=function(a){return J.RE(a).gbw(a)}
 J.SO=function(a,b){return J.RE(a).sCF(a,b)}
+J.SS=function(a){return J.RE(a).gQP(a)}
 J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
 J.Sj=function(a,b){return J.RE(a).svC(a,b)}
 J.Sl=function(a){return J.RE(a).gxb(a)}
 J.Sm=function(a,b){return J.RE(a).skZ(a,b)}
-J.Sr=function(a){return J.RE(a).gvq(a)}
 J.T5=function(a,b){return J.RE(a).stT(a,b)}
 J.TG=function(a){return J.RE(a).gFb(a)}
 J.TM=function(a){return J.RE(a).gOd(a)}
-J.TP=function(a,b){return J.RE(a).sGV(a,b)}
-J.TY=function(a){return J.RE(a).gvp(a)}
+J.TP=function(a,b){return J.RE(a).sd0(a,b)}
+J.TR=function(a){return J.RE(a).Um(a)}
 J.TZ=function(a,b){return J.RE(a).sN(a,b)}
-J.Tg=function(a){return J.RE(a).gCI(a)}
-J.Tm=function(a){return J.RE(a).grX(a)}
-J.Ts=function(a){return J.RE(a).gfG(a)}
+J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
 J.Tu=function(a,b){return J.RE(a).sl6(a,b)}
-J.Tv=function(a){return J.RE(a).gB1(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
-J.U8=function(a){return J.RE(a).gEQ(a)}
-J.UA=function(a){return J.RE(a).gP2(a)}
+J.U2=function(a){return J.w1(a).V1(a)}
+J.U8=function(a,b){return J.RE(a).sX7(a,b)}
 J.UE=function(a){return J.w1(a).git(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
-J.UP=function(a){return J.RE(a).gnZ(a)}
 J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
 return J.U6(a).t(a,b)}
-J.UR=function(a){return J.RE(a).Lg(a)}
-J.UT=function(a){return J.RE(a).gDQ(a)}
-J.Ue=function(a){return J.RE(a).gV8(a)}
+J.US=function(a){return J.RE(a).gWt(a)}
+J.UU=function(a,b){return J.RE(a).sng(a,b)}
+J.Ua=function(a){return J.RE(a).gkZ(a)}
+J.Ur=function(a){return J.RE(a).gyX(a)}
 J.Ux=function(a){return J.RE(a).geo(a)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
+J.V2=function(a,b,c){return J.w1(a).aP(a,b,c)}
 J.VA=function(a,b){return J.w1(a).Vr(a,b)}
-J.VU=function(a,b){return J.RE(a).PN(a,b)}
-J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
+J.VB=function(a){return J.RE(a).gRT(a)}
+J.Vj=function(a,b){return J.RE(a).Md(a,b)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.Qe(a).C1(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
-J.W2=function(a){return J.RE(a).gCf(a)}
+J.Vw=function(a,b){return J.U6(a).sB(a,b)}
+J.W2H=function(a){return J.RE(a).gCf(a)}
 J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
-J.WI=function(a,b){return J.RE(a).sLF(a,b)}
+J.WI=function(a,b){return J.RE(a).soc(a,b)}
 J.WT=function(a){return J.RE(a).gFR(a)}
-J.WX=function(a){return J.RE(a).gbJ(a)}
-J.We=function(a,b){return J.RE(a).VG(a,b)}
+J.WX7=function(a){return J.RE(a).gbJ(a)}
 J.Wf=function(a){return J.RE(a).D4(a)}
-J.Wp=function(a){return J.RE(a).gQU(a)}
-J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
-J.X6=function(a){return J.RE(a).gjD(a)}
 J.X7=function(a){return J.RE(a).gcH(a)}
-J.X9=function(a){return J.RE(a).gTK(a)}
+J.X9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).V(a,b)}
+J.XB=function(a){return J.RE(a).gQU(a)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
 J.XHl=function(a){return J.Wx(a).yu(a)}
-J.XP=function(a){return J.RE(a).Um(a)}
+J.Xa=function(a){return J.RE(a).gXc(a)}
 J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xr=function(a){return J.RE(a).gEa(a)}
+J.Xp=function(a){return J.RE(a).gzH(a)}
 J.Xu=function(a,b){return J.RE(a).sFL(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
-J.Y7=function(a){return J.RE(a).gLU(a)}
-J.YG=function(a){return J.RE(a).gQP(a)}
-J.YH=function(a){return J.RE(a).gpM(a)}
+J.YH=function(a){return J.RE(a).gnS(a)}
+J.YN=function(a,b){return J.RE(a).WO(a,b)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
 J.YSV=function(a,b){return J.RE(a).sNJ(a,b)}
-J.Yd=function(a){return J.RE(a).gBV(a)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yq=function(a){return J.RE(a).gph(a)}
+J.Yq=function(a){return J.RE(a).gSR(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a,b){return J.RE(a).sP9(a,b)}
-J.Z8=function(a){return J.w1(a).V1(a)}
+J.Z6=function(a){return J.RE(a).gV5(a)}
+J.ZC=function(a){return J.RE(a).gph(a)}
 J.ZF=function(a){return J.RE(a).gAF(a)}
 J.ZG=function(a,b){return J.w1(a).zV(a,b)}
 J.ZH=function(a){return J.RE(a).gk8(a)}
@@ -22485,186 +22692,193 @@
 J.ZW=function(a,b,c,d){return J.RE(a).MS(a,b,c,d)}
 J.ZZ=function(a,b){return J.Qe(a).yn(a,b)}
 J.Zh=function(a){return J.RE(a).grJ(a)}
+J.Zl=function(a){return J.RE(a).gB1(a)}
 J.Zo=function(a){return J.RE(a).gK4(a)}
 J.Zs=function(a){return J.RE(a).gcY(a)}
-J.a3=function(a){return J.RE(a).gBk(a)}
-J.aA=function(a){return J.RE(a).gzY(a)}
-J.aB=function(a){return J.RE(a).gql(a)}
-J.aT=function(a){return J.RE(a).god(a)}
+J.Zv=function(a){return J.RE(a).grs(a)}
 J.aW=function(a){return J.RE(a).gJp(a)}
-J.an=function(a,b){return J.RE(a).Id(a,b)}
+J.ad=function(a){return J.RE(a).guZ(a)}
 J.au=function(a,b){return J.RE(a).sNG(a,b)}
-J.ay=function(a){return J.RE(a).giB(a)}
 J.b0=function(a,b){return J.RE(a).suc(a,b)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.bH=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
 J.bI=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
-J.bL=function(a){return J.RE(a).ghS(a)}
-J.bS=function(a){return J.RE(a).gUo(a)}
-J.bT=function(a){return J.w1(a).gqG(a)}
-J.bh=function(a){return J.RE(a).geZ(a)}
-J.bi=function(a,b){return J.w1(a).h(a,b)}
+J.bL=function(a){return J.RE(a).gUt(a)}
+J.bb=function(a,b,c){return J.RE(a).X6(a,b,c)}
+J.be=function(a){return J.RE(a).gB3(a)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
+J.bs=function(a){return J.RE(a).JP(a)}
 J.bu=function(a){return J.RE(a).gyw(a)}
-J.c7=function(a){return J.RE(a).guS(a)}
+J.cC=function(a){return J.RE(a).gke(a)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
-J.cL=function(a){return J.RE(a).gV5(a)}
 J.cO=function(a){return J.RE(a).gjx(a)}
+J.cP=function(a){return J.RE(a).gAd(a)}
+J.cS=function(a,b){return J.RE(a).sqF(a,b)}
 J.cV=function(a,b){return J.RE(a).sjT(a,b)}
 J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cj=function(a){return J.RE(a).gMT(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.cm=function(a,b,c){return J.RE(a).kq(a,b,c)}
 J.co=function(a,b){return J.Qe(a).nC(a,b)}
+J.d5=function(a){return J.Wx(a).gKy(a)}
 J.dE=function(a){return J.RE(a).gGs(a)}
-J.dF=function(a){return J.w1(a).zH(a)}
-J.dK=function(a){return J.RE(a).gWk(a)}
+J.dH=function(a,b){return J.w1(a).h(a,b)}
 J.dY=function(a){return J.RE(a).ga4(a)}
-J.dZ=function(a){return J.RE(a).gDX(a)}
-J.dc=function(a,b){return J.RE(a).smH(a,b)}
+J.dd=function(a){return J.RE(a).gqu(a)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a){return J.RE(a).QE(a)}
-J.dj=function(a){return J.RE(a).gyZ(a)}
-J.dv=function(a,b,c){return J.RE(a).v3(a,b,c)}
-J.dw=function(a){return J.RE(a).gMt(a)}
-J.eK=function(a){return J.RE(a).gBN(a)}
+J.dv=function(a){return J.RE(a).gUL(a)}
 J.eS=function(a){return J.RE(a).gjO(a)}
-J.eU=function(a){return J.RE(a).gRh(a)}
 J.eY=function(a){return J.RE(a).gR(a)}
 J.eb=function(a){return J.RE(a).gIb(a)}
 J.ev=function(a){return J.RE(a).gkD(a)}
 J.f2=function(a){return J.RE(a).gRd(a)}
-J.f5=function(a){return J.RE(a).grz(a)}
-J.fD=function(a){return J.RE(a).e6(a)}
-J.fM=function(a){return J.RE(a).gLf(a)}
 J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
+J.fY=function(a){return J.RE(a).gky(a)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
-J.fh=function(a){return J.RE(a).ghf(a)}
 J.fi=function(a){return J.RE(a).gX0(a)}
+J.fm=function(a,b){return J.RE(a).sxr(a,b)}
 J.fv=function(a){return J.RE(a).gZ9(a)}
+J.fx=function(a){return J.RE(a).gtu(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hI=function(a){return J.RE(a).gUQ(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
-J.hn=function(a){return J.RE(a).gEu(a)}
+J.hW=function(a){return J.RE(a).gql(a)}
+J.ho=function(a){return J.RE(a).ghS(a)}
 J.ht=function(a){return J.RE(a).gZ2(a)}
 J.i0=function(a,b){return J.RE(a).sPB(a,b)}
 J.i2=function(a,b){return J.RE(a).sRk(a,b)}
+J.i2U=function(a){return J.RE(a).gCK(a)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
-J.iB=function(a){return J.RE(a).giC(a)}
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iS=function(a){return J.RE(a).gox(a)}
-J.iY=function(a){return J.RE(a).gvc(a)}
-J.id=function(a){return J.RE(a).gR1(a)}
+J.iY=function(a){return J.Qe(a).DY(a)}
+J.iYM=function(a){return J.RE(a).gvc(a)}
+J.iiZ=function(a){return J.RE(a).gfG(a)}
+J.ik=function(a){return J.RE(a).gHt(a)}
 J.io=function(a){return J.RE(a).gja(a)}
+J.iq=function(a){return J.RE(a).gRs(a)}
 J.is=function(a,b){return J.RE(a).snZ(a,b)}
-J.ix=function(a){return J.RE(a).gnI(a)}
-J.j1=function(a){return J.RE(a).gZA(a)}
-J.jB=function(a){return J.RE(a).gpf(a)}
+J.ix=function(a,b){return J.RE(a).sXc(a,b)}
+J.jD=function(a){return J.RE(a).TI(a)}
+J.jE=function(a){return J.RE(a).gA5(a)}
+J.jH=function(a){return J.RE(a).ghN(a)}
+J.jL=function(a){return J.RE(a).gBV(a)}
 J.jOZ=function(a,b){return J.Wx(a).Y(a,b)}
 J.jd=function(a){return J.RE(a).gZm(a)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
-J.jl=function(a){return J.RE(a).gHt(a)}
+J.jg=function(a){return J.RE(a).gEu(a)}
+J.jk=function(a,b,c){return J.RE(a).OP(a,b,c)}
+J.jo=function(a){return J.RE(a).gCI(a)}
 J.jq=function(a,b){return J.RE(a).sZp(a,b)}
+J.ju=function(a,b,c){return J.RE(a).eX(a,b,c)}
+J.jy=function(a,b){return J.RE(a).sPe(a,b)}
+J.jzo=function(a){if(typeof a=="number")return-a
+return J.Wx(a).J(a)}
 J.k0=function(a){return J.RE(a).giZ(a)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
-J.kW=function(a,b,c){if((a.constructor==Array||H.Gp(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
-return J.w1(a).u(a,b,c)}
 J.kX=function(a,b){return J.RE(a).sNb(a,b)}
-J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.kv=function(a){return J.RE(a).gDf(a)}
+J.kv=function(a){return J.RE(a).glp(a)}
 J.l2=function(a){return J.RE(a).gN(a)}
-J.lA=function(a){return J.RE(a).gLc(a)}
+J.lF=function(a,b){return J.RE(a).snS(a,b)}
 J.lL=function(a){return J.RE(a).gQr(a)}
-J.lN=function(a){return J.RE(a).gil(a)}
-J.le=function(a){return J.RE(a).gUt(a)}
-J.lu=function(a){return J.RE(a).gJ8(a)}
+J.lf=function(a,b){return J.Wx(a).O(a,b)}
+J.ls=function(a){return J.RE(a).gnI(a)}
 J.m4=function(a){return J.RE(a).gig(a)}
+J.m8=function(a,b){return J.RE(a).sEu(a,b)}
+J.mB=function(a){return J.RE(a).Zi(a)}
 J.mF=function(a){return J.RE(a).gHn(a)}
+J.mI=function(a,b){return J.RE(a).rW(a,b)}
 J.mN=function(a){return J.RE(a).gRO(a)}
 J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
 return J.Wx(a).i(a,b)}
 J.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
+J.ma=function(a){return J.RE(a).gyG(a)}
+J.mk=function(a){return J.RE(a).gWA(a)}
 J.mu=function(a,b){return J.RE(a).TR(a,b)}
 J.my=function(a,b){return J.RE(a).sQl(a,b)}
 J.mz=function(a,b){return J.RE(a).scH(a,b)}
+J.n8=function(a){return J.RE(a).gUo(a)}
 J.n9=function(a){return J.RE(a).gQq(a)}
 J.nA=function(a,b){return J.RE(a).sPL(a,b)}
+J.nC=function(a,b){return J.RE(a).sCd(a,b)}
+J.nEe=function(a){return J.RE(a).gDf(a)}
 J.nG=function(a){return J.RE(a).gv8(a)}
-J.nN=function(a){return J.RE(a).gTt(a)}
-J.nb=function(a){return J.RE(a).gyX(a)}
+J.nb=function(a,b,c,d,e,f,g,h){return J.RE(a).kN(a,b,c,d,e,f,g,h)}
+J.nl=function(a){return J.RE(a).gDQ(a)}
 J.ns=function(a){return J.RE(a).gjT(a)}
 J.nv=function(a){return J.RE(a).gLW(a)}
-J.o3=function(a,b){return J.RE(a).sjD(a,b)}
-J.o6=function(a){return J.RE(a).Lx(a)}
-J.o8=function(a,b){return J.RE(a).sqF(a,b)}
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
+J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
-J.oO=function(a){return J.RE(a).UV(a)}
-J.of=function(a){return J.RE(a).je(a)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
-J.ol=function(a){return J.RE(a).glp(a)}
-J.on=function(a){return J.RE(a).gtT(a)}
 J.op=function(a){return J.RE(a).gD7(a)}
+J.os=function(a){return J.RE(a).gqA(a)}
 J.p7=function(a){return J.RE(a).guD(a)}
 J.pA=function(a,b){return J.RE(a).sYt(a,b)}
 J.pB=function(a,b){return J.w1(a).sit(a,b)}
 J.pI=function(a){return J.RE(a).gH3(a)}
-J.pL=function(a,b,c){return J.RE(a).d2(a,b,c)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pU=function(a){return J.RE(a).ghN(a)}
-J.pm=function(a){return J.RE(a).gt0(a)}
-J.pq=function(a,b){return J.RE(a).sV8(a,b)}
+J.pU=function(a){return J.RE(a).gYe(a)}
+J.ph=function(a){return J.RE(a).gDX(a)}
+J.pq=function(a,b){return J.RE(a).yU(a,b)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q1=function(a){return J.RE(a).geJ(a)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.ql=function(a){return J.RE(a).gaB(a)}
+J.qA=function(a){return J.w1(a).br(a)}
+J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
+J.qN=function(a){return J.RE(a).giC(a)}
+J.qQ=function(a,b,c){if((a.constructor==Array||H.Gp(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
+return J.w1(a).u(a,b,c)}
+J.qd=function(a,b,c,d){return J.RE(a).aC(a,b,c,d)}
+J.qf=function(a){return J.RE(a).gMl(a)}
+J.ql=function(a){return J.RE(a).gBN(a)}
+J.qq=function(a){return J.RE(a).dQ(a)}
 J.qx=function(a){return J.RE(a).gbe(a)}
-J.qy=function(a){return J.RE(a).gA0(a)}
-J.r0=function(a){return J.RE(a).gi6(a)}
-J.r5=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.rA=function(a,b){return J.RE(a).sbe(a,b)}
 J.rL=function(a,b){return J.RE(a).spE(a,b)}
-J.ra5=function(a){return J.RE(a).gAd(a)}
-J.re=function(a){return J.RE(a).gmb(a)}
-J.rk=function(a){return J.RE(a).gke(a)}
+J.rN=function(a){return J.RE(a).gVE(a)}
+J.rS=function(a){return J.RE(a).gyr(a)}
 J.ro=function(a){return J.RE(a).gOB(a)}
-J.rr=function(a){return J.Qe(a).bS(a)}
-J.rw=function(a){return J.RE(a).gMl(a)}
+J.rp=function(a){return J.RE(a).gd4(a)}
 J.ry=function(a,b){return J.RE(a).stu(a,b)}
 J.t0=function(a){return J.RE(a).gTj(a)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tG=function(a){return J.RE(a).Zi(a)}
-J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tPf=function(a,b){return J.RE(a).X3(a,b)}
-J.tT=function(a,b,c){return J.RE(a).X6(a,b,c)}
+J.tE=function(a,b){return J.RE(a).JX(a,b)}
+J.tX=function(a){return J.RE(a).gtT(a)}
+J.tdY=function(a){return J.RE(a).gng(a)}
+J.ti=function(a){return J.RE(a).grz(a)}
 J.tv=function(a,b){return J.RE(a).sDX(a,b)}
-J.tw=function(a){return J.RE(a).gCK(a)}
+J.tw=function(a){return J.RE(a).je(a)}
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
+J.u5=function(a){return J.RE(a).gA8(a)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uF=function(a,b){return J.w1(a).GT(a,b)}
-J.uH=function(a,b){return J.RE(a).sP2(a,b)}
-J.uN=function(a){return J.RE(a).gHo(a)}
-J.uW=function(a){return J.RE(a).gyG(a)}
-J.uf=function(a){return J.RE(a).gxr(a)}
+J.ufU=function(a){return J.RE(a).gxr(a)}
+J.ug=function(a){return J.x(a).gCR(a)}
 J.ul=function(a){return J.RE(a).gU4(a)}
 J.um=function(a){return J.RE(a).gRk(a)}
-J.un=function(a){return J.RE(a).gRY(a)}
 J.up=function(a){return J.RE(a).gIf(a)}
+J.us=function(a){return J.RE(a).gRN(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.v7=function(a){return J.RE(a).gwX(a)}
+J.v7=function(a){return J.RE(a).Lg(a)}
+J.vE=function(a){return J.RE(a).gMZ(a)}
+J.vF=function(a,b){return J.RE(a).sP9(a,b)}
+J.vI=function(a,b){return J.RE(a).jn(a,b)}
 J.vJ=function(a,b){return J.RE(a).spM(a,b)}
 J.vP=function(a,b){return J.RE(a).sR(a,b)}
+J.vR=function(a,b){return J.RE(a).YP(a,b)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vc=function(a){return J.RE(a).gxD(a)}
@@ -22672,51 +22886,59 @@
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
 J.wJ=function(a,b){return J.RE(a).slp(a,b)}
-J.wK=function(a,b){return J.RE(a).xZ(a,b)}
+J.wS=function(a){return J.RE(a).geZ(a)}
 J.wd=function(a){return J.RE(a).gqw(a)}
-J.we=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
-J.wg=function(a,b){return J.U6(a).sB(a,b)}
+J.wg=function(a){return J.RE(a).god(a)}
 J.wl=function(a,b){return J.RE(a).Ch(a,b)}
 J.wp=function(a){return J.RE(a).gwv(a)}
-J.wt=function(a){return J.RE(a).gP3(a)}
 J.wu=function(a,b){return J.RE(a).sLf(a,b)}
 J.wx=function(a,b){return J.RE(a).Rg(a,b)}
 J.x0=function(a,b){return J.RE(a).sWt(a,b)}
+J.x3=function(a){return J.RE(a).gvp(a)}
 J.xC=function(a,b){if(a==null)return b==null
 if(typeof a!="object")return b!=null&&a===b
 return J.x(a).n(a,b)}
+J.xH=function(a,b){return J.RE(a).sxT(a,b)}
 J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
 J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
 J.xe=function(a){return J.RE(a).gPB(a)}
-J.xo=function(a){return J.RE(a).gJN(a)}
+J.xi=function(a){return J.RE(a).gBj(a)}
+J.xk=function(a){return J.RE(a).gXE(a)}
+J.xlH=function(a){return J.RE(a).gUv(a)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.y3=function(a){return J.RE(a).gFL(a)}
 J.y9=function(a){return J.RE(a).lh(a)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yI=function(a){return J.RE(a).gih(a)}
+J.yI=function(a){return J.RE(a).gLf(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yR=function(a,b){return J.RE(a).XT(a,b)}
+J.yW=function(a){return J.RE(a).gX7(a)}
+J.yb=function(a){return J.RE(a).gWF(a)}
 J.yd=function(a){return J.RE(a).xO(a)}
+J.yf=function(a){return J.RE(a).gzG(a)}
 J.yi=function(a,b){return J.RE(a).sMj(a,b)}
 J.yq=function(a){return J.RE(a).gQl(a)}
-J.yz=function(a){return J.RE(a).gLF(a)}
+J.yr=function(a){return J.RE(a).gJb(a)}
 J.z7Y=function(a,b,c,d,e){return J.RE(a).GM(a,b,c,d,e)}
-J.zE=function(a){return J.RE(a).gtu(a)}
-J.zF=function(a){return J.RE(a).gHL(a)}
+J.zC=function(a){return J.RE(a).gi6(a)}
+J.zD=function(a){return J.RE(a).gEl(a)}
+J.zF=function(a){return J.RE(a).gih(a)}
 J.zH=function(a){return J.RE(a).gt5(a)}
 J.zL=function(a){return J.RE(a).gO9(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
 J.zY=function(a){return J.RE(a).gdu(a)}
+J.za=function(a,b){return J.U6(a).OY(a,b)}
+J.ze=function(a){return J.RE(a).gHL(a)}
 J.zg=function(a,b){return J.w1(a).ad(a,b)}
 J.zj=function(a){return J.RE(a).gvH(a)}
+J.zq=function(a){return J.w1(a).Jd(a)}
 C.Gx=X.hV.prototype
 C.J9=Q.f7.prototype
-C.Gkp=Y.hg.prototype
-C.C8=B.G6.prototype
+C.Gkp=Y.G0.prototype
+C.QD=B.G6.prototype
 C.FC=T.vr.prototype
 C.ic=A.wM.prototype
-C.i3=Q.eW.prototype
+C.YZz=Q.eW.prototype
 C.fe=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
@@ -22724,41 +22946,42 @@
 C.vS=T.uV.prototype
 C.oS=U.NY.prototype
 C.O0=R.JI.prototype
-C.BB=G.Tk.prototype
+C.lG=W.Rb.prototype
+C.vo=G.Tk.prototype
 C.On=F.ZP.prototype
-C.Jh=L.nJ.prototype
-C.lQ=R.Eg.prototype
+C.GhT=L.nJ.prototype
+C.qL=R.Eg.prototype
 C.MC=D.i7.prototype
-C.LTI=A.Gk.prototype
+C.D4=A.Gk.prototype
 C.kL=W.H05.prototype
-C.ls6=X.MJ.prototype
-C.n0=X.J3.prototype
+C.Hb=X.MJ.prototype
+C.N3=X.J3.prototype
 C.Xo=U.DK.prototype
 C.PJ8=N.BS.prototype
 C.Al=O.Vb.prototype
 C.Vc=K.Ly.prototype
-C.W3=W.fJ.prototype
-C.bP=E.WS.prototype
-C.tO=E.H8.prototype
+C.W3=W.O7.prototype
+C.Ug=E.WS.prototype
+C.GII=E.H8.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
-C.VLs=E.U1.prototype
+C.x4=E.U1.prototype
 C.ej=E.qM.prototype
-C.OkI=E.av.prototype
+C.Wa=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
 C.RVQ=E.wN.prototype
 C.wP=E.ds.prototype
-C.Ag=E.Mb.prototype
+C.aj2=E.Mb.prototype
 C.ozm=E.oF.prototype
-C.IXz=E.qh.prototype
+C.wK=E.qh.prototype
 C.rU=E.Q6.prototype
-C.j1o=E.L4.prototype
+C.j1=E.L4.prototype
 C.ag=E.Zn.prototype
-C.Fw=E.uE.prototype
+C.js=E.uE.prototype
 C.UZ=E.n5.prototype
 C.QFk=O.Im.prototype
-C.uRw=B.pR.prototype
+C.hM=B.pR.prototype
 C.yKx=Z.EZ.prototype
 C.aXP=D.Z4.prototype
 C.rCJ=D.Qh.prototype
@@ -22768,45 +22991,48 @@
 C.F2=D.IW.prototype
 C.mb=D.Oz.prototype
 C.OoF=D.St.prototype
-C.hys=L.qk.prototype
+C.Xe=L.qk.prototype
 C.Nm=J.Q.prototype
 C.YI=J.VA7.prototype
 C.jn=J.imn.prototype
-C.jN=J.CDU.prototype
+C.bP=J.CDU.prototype
 C.CD=J.P.prototype
-C.xB=J.O.prototype
+C.yo=J.O.prototype
 C.Du=Z.vj.prototype
 C.xA=A.UK.prototype
 C.Z3=R.LU.prototype
-C.fQ=M.CX.prototype
-C.DX=U.WG.prototype
-C.OX=U.VZ.prototype
+C.MG=M.CX.prototype
+C.dl=U.WG.prototype
+C.vmJ=U.VZ.prototype
 C.Ax=N.I2.prototype
-C.Mw=N.FB.prototype
+C.h1=N.FB.prototype
 C.po=N.qn.prototype
-C.S2=W.x76.prototype
+C.S2=W.H9.prototype
 C.yp=H.eEV.prototype
-C.aV=A.md.prototype
+C.Jm=H.V6a.prototype
+C.kD=A.md.prototype
 C.pl=A.ye.prototype
 C.IG=A.Bm.prototype
 C.nn=A.Ya.prototype
 C.BJj=A.NK.prototype
 C.L8=A.Zx.prototype
 C.J7=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.br=L.qV.prototype
+C.z0=W.BH3.prototype
+C.aD=L.qV.prototype
+C.ji=Q.Ce.prototype
+C.LQi=L.NT.prototype
 C.YpE=V.F1.prototype
-C.mk=Z.uL.prototype
+C.Pfz=Z.uL.prototype
 C.Sx=J.iCW.prototype
-C.GBL=A.xc.prototype
-C.za=T.ov.prototype
-C.Wa=A.kn.prototype
+C.Vk=A.xc.prototype
+C.vy=T.ov.prototype
+C.Mh=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
-C.Vd=D.Rk.prototype
-C.Uv=U.Ti.prototype
+C.kgQ=D.Rk.prototype
+C.Ns=U.Ti.prototype
 C.HRc=Q.xI.prototype
-C.Yo=Q.CY.prototype
+C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
 C.bg3=X.Vu.prototype
 C.OKl=A.G1.prototype
@@ -22815,35 +23041,35 @@
 C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
 C.V8=X.I5.prototype
-C.Hd=U.el.prototype
-C.Ui=W.K5.prototype
+C.Tkx=U.el.prototype
+C.ol=W.K5.prototype
 C.Kn=new H.i6()
-C.x4=new U.WH()
+C.OL=new U.EO()
 C.Ar=new H.MB()
 C.MS=new H.FuS()
 C.Eq=new P.k5C()
 C.qY=new T.WM()
 C.ZB=new P.yRf()
 C.Xh=new P.mgb()
-C.zr=new L.iNc()
+C.aZ=new L.iNc()
 C.NU=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
-C.yP=new D.WAE("Reused")
-C.Z7=new D.WAE("Tag")
+C.AA=new D.WAE("Reused")
+C.oA=new D.WAE("Tag")
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
-C.cn=new A.iYn(2)
+C.hU=new A.iYn(2)
 C.hf=new H.tx("label")
-C.lY=H.Kxv('qU')
+C.Gh=H.Kxv('qU')
 C.B10=new K.vly()
 C.vrd=new A.xn(!1)
 I.uLC=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
 C.ucP=I.uLC([C.B10,C.vrd])
-C.V0=new A.ES(C.hf,C.BM,!1,C.lY,!1,C.ucP)
+C.V0=new A.ES(C.hf,C.BM,!1,C.Gh,!1,C.ucP)
 C.EV=new H.tx("library")
 C.Jny=H.Kxv('U4')
 C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
@@ -22864,11 +23090,11 @@
 C.UL=new H.tx("profileChanged")
 C.yQP=H.Kxv('EH')
 C.xD=I.uLC([])
-C.bG=new A.ES(C.UL,C.cn,!1,C.yQP,!1,C.xD)
+C.bG=new A.ES(C.UL,C.hU,!1,C.yQP,!1,C.xD)
 C.TU=new H.tx("endPosChanged")
-C.Cp=new A.ES(C.TU,C.cn,!1,C.yQP,!1,C.xD)
+C.Cp=new A.ES(C.TU,C.hU,!1,C.yQP,!1,C.xD)
 C.Wm=new H.tx("refChanged")
-C.QW=new A.ES(C.Wm,C.cn,!1,C.yQP,!1,C.xD)
+C.QW=new A.ES(C.Wm,C.hU,!1,C.yQP,!1,C.xD)
 C.UY=new H.tx("result")
 C.SmN=H.Kxv('af')
 C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -22878,7 +23104,7 @@
 C.esx=I.uLC([C.B10,C.J19])
 C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.esx)
 C.zU=new H.tx("uncheckedText")
-C.uT=new A.ES(C.zU,C.BM,!1,C.lY,!1,C.ucP)
+C.uT=new A.ES(C.zU,C.BM,!1,C.Gh,!1,C.ucP)
 C.mr=new H.tx("expanded")
 C.iz=new A.ES(C.mr,C.BM,!1,C.Ow,!1,C.esx)
 C.VI=new H.tx("line")
@@ -22888,7 +23114,7 @@
 C.yw=H.Kxv('KN')
 C.NL=new A.ES(C.IT,C.BM,!1,C.yw,!1,C.ucP)
 C.A7=new H.tx("height")
-C.SD=new A.ES(C.A7,C.BM,!1,C.lY,!1,C.ucP)
+C.SD=new A.ES(C.A7,C.BM,!1,C.Gh,!1,C.ucP)
 C.fn=new H.tx("instance")
 C.Q56=H.Kxv('uq')
 C.Kk=new A.ES(C.fn,C.BM,!1,C.Q56,!1,C.ucP)
@@ -22901,30 +23127,30 @@
 C.jFX=H.Kxv('dy')
 C.dq=new A.ES(C.XA,C.BM,!1,C.jFX,!1,C.ucP)
 C.aH=new H.tx("displayCutoff")
-C.w3=new A.ES(C.aH,C.BM,!1,C.lY,!1,C.esx)
+C.w3=new A.ES(C.aH,C.BM,!1,C.Gh,!1,C.esx)
 C.rB=new H.tx("isolate")
 C.a2p=H.Kxv('bv')
 C.xY=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.esx)
 C.mJ=new H.tx("color")
-C.Qu=new A.ES(C.mJ,C.BM,!1,C.lY,!1,C.ucP)
+C.Qu=new A.ES(C.mJ,C.BM,!1,C.Gh,!1,C.ucP)
 C.bz=new H.tx("isolateChanged")
-C.Bk=new A.ES(C.bz,C.cn,!1,C.yQP,!1,C.xD)
+C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.xD)
 C.CG=new H.tx("posChanged")
-C.Ml=new A.ES(C.CG,C.cn,!1,C.yQP,!1,C.xD)
+C.Ml=new A.ES(C.CG,C.hU,!1,C.yQP,!1,C.xD)
 C.yh=new H.tx("error")
 C.oUD=H.Kxv('N7')
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
 C.Gs=new H.tx("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.lY,!1,C.esx)
+C.iO=new A.ES(C.Gs,C.BM,!1,C.Gh,!1,C.esx)
 C.oj=new H.tx("httpServer")
 C.GT=new A.ES(C.oj,C.BM,!1,C.MR,!1,C.ucP)
 C.td=new H.tx("object")
 C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
-C.ft=new H.tx("target")
+C.pD=new H.tx("target")
 C.NBK=H.Kxv('Z5')
-C.Gz=new A.ES(C.ft,C.BM,!1,C.NBK,!1,C.ucP)
+C.Gz=new A.ES(C.pD,C.BM,!1,C.NBK,!1,C.ucP)
 C.TW=new H.tx("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.lY,!1,C.esx)
+C.H0=new A.ES(C.TW,C.BM,!1,C.Gh,!1,C.esx)
 C.vp=new H.tx("list")
 C.Rz=new A.ES(C.vp,C.BM,!1,C.hAX,!1,C.ucP)
 C.uO=new H.tx("inboundReferences")
@@ -22932,14 +23158,16 @@
 C.B0=new H.tx("expand")
 C.iH=new A.ES(C.B0,C.BM,!1,C.Ow,!1,C.ucP)
 C.ba=new H.tx("pollPeriodChanged")
-C.kQ=new A.ES(C.ba,C.cn,!1,C.yQP,!1,C.xD)
+C.kQ=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.xD)
 C.Rs=new H.tx("currentPosChanged")
-C.EW=new A.ES(C.Rs,C.cn,!1,C.yQP,!1,C.xD)
+C.EW=new A.ES(C.Rs,C.hU,!1,C.yQP,!1,C.xD)
 C.zz=new H.tx("timeSpan")
-C.lS=new A.ES(C.zz,C.BM,!1,C.lY,!1,C.esx)
+C.lS=new A.ES(C.zz,C.BM,!1,C.Gh,!1,C.esx)
 C.EP=new H.tx("page")
-C.wIp=H.Kxv('JM')
-C.db=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.ucP)
+C.VW=H.Kxv('JM')
+C.db=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.ucP)
+C.CZi=H.Kxv('cn')
+C.tO=new A.ES(C.yh,C.BM,!1,C.CZi,!1,C.ucP)
 C.kw=new H.tx("trace")
 C.oC=new A.ES(C.kw,C.BM,!1,C.MR,!1,C.ucP)
 C.Ys=new H.tx("pad")
@@ -22947,12 +23175,15 @@
 C.nr=new H.tx("context")
 C.cL5=H.Kxv('lI')
 C.BO=new A.ES(C.nr,C.BM,!1,C.cL5,!1,C.ucP)
+C.WQ=new H.tx("field")
+C.n8S=H.Kxv('xB')
+C.on=new A.ES(C.WQ,C.BM,!1,C.n8S,!1,C.ucP)
 C.qX=new H.tx("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.cn,!1,C.yQP,!1,C.xD)
+C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.xD)
 C.UX=new H.tx("msg")
 C.Pt=new A.ES(C.UX,C.BM,!1,C.MR,!1,C.ucP)
 C.rP=new H.tx("mapChanged")
-C.Nt=new A.ES(C.rP,C.cn,!1,C.yQP,!1,C.xD)
+C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.xD)
 C.kB=new H.tx("metric")
 C.nq=new A.ES(C.kB,C.BM,!1,C.cdY,!1,C.ucP)
 C.nf=new H.tx("function")
@@ -22962,7 +23193,7 @@
 C.Mda=H.Kxv('Ix')
 C.bp=new A.ES(C.ne,C.BM,!1,C.Mda,!1,C.ucP)
 C.kV=new H.tx("link")
-C.vz=new A.ES(C.kV,C.BM,!1,C.lY,!1,C.ucP)
+C.vz=new A.ES(C.kV,C.BM,!1,C.Gh,!1,C.ucP)
 C.Ve=new H.tx("socket")
 C.Xmq=H.Kxv('WP')
 C.X4=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.ucP)
@@ -22973,14 +23204,14 @@
 C.vY=new H.tx("currentPos")
 C.ZS=new A.ES(C.vY,C.BM,!1,C.yw,!1,C.ucP)
 C.p8=new H.tx("event")
-C.Kp2=H.Kxv('Mk')
-C.uc=new A.ES(C.p8,C.BM,!1,C.Kp2,!1,C.ucP)
+C.x8=H.Kxv('Mk')
+C.uc=new A.ES(C.p8,C.BM,!1,C.x8,!1,C.ucP)
 C.YD=new H.tx("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.lY,!1,C.esx)
+C.fP=new A.ES(C.YD,C.BM,!1,C.Gh,!1,C.esx)
 C.Aa=new H.tx("results")
 C.k5=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.esx)
 C.t6=new H.tx("mapAsString")
-C.b6=new A.ES(C.t6,C.BM,!1,C.lY,!1,C.esx)
+C.b6=new A.ES(C.t6,C.BM,!1,C.Gh,!1,C.esx)
 C.qs=new H.tx("io")
 C.MN=new A.ES(C.qs,C.BM,!1,C.MR,!1,C.ucP)
 C.QH=new H.tx("fragmentation")
@@ -22994,37 +23225,34 @@
 C.Wj=new H.tx("process")
 C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR,!1,C.ucP)
 C.LH=new H.tx("metricChanged")
-C.oB=new A.ES(C.LH,C.cn,!1,C.yQP,!1,C.xD)
+C.oB=new A.ES(C.LH,C.hU,!1,C.yQP,!1,C.xD)
 C.He=new H.tx("hideTagsChecked")
 C.fz=new A.ES(C.He,C.BM,!1,C.Ow,!1,C.esx)
 C.eh=new H.tx("lineMode")
-C.jO=new A.ES(C.eh,C.BM,!1,C.lY,!1,C.esx)
+C.jO=new A.ES(C.eh,C.BM,!1,C.Gh,!1,C.esx)
 C.PM=new H.tx("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.lY,!1,C.esx)
+C.jv=new A.ES(C.PM,C.BM,!1,C.Gh,!1,C.esx)
 C.Zi=new H.tx("lastAccumulatorReset")
-C.xx=new A.ES(C.Zi,C.BM,!1,C.lY,!1,C.esx)
+C.xx=new A.ES(C.Zi,C.BM,!1,C.Gh,!1,C.esx)
 C.lH=new H.tx("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.lY,!1,C.ucP)
+C.dG=new A.ES(C.lH,C.BM,!1,C.Gh,!1,C.ucP)
 C.VK=new H.tx("devtools")
 C.lW=new A.ES(C.VK,C.BM,!1,C.Ow,!1,C.ucP)
-C.AV=new H.tx("callback")
-C.QiO=H.Kxv('Sa')
-C.fr=new A.ES(C.AV,C.BM,!1,C.QiO,!1,C.ucP)
 C.vs=new H.tx("endLine")
 C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.esx)
 C.li=new H.tx("startPosChanged")
-C.Tz=new A.ES(C.li,C.cn,!1,C.yQP,!1,C.xD)
+C.Tz=new A.ES(C.li,C.hU,!1,C.yQP,!1,C.xD)
 C.ox=new H.tx("countersChanged")
-C.Rh=new A.ES(C.ox,C.cn,!1,C.yQP,!1,C.xD)
+C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.xD)
 C.XM=new H.tx("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR,!1,C.ucP)
-C.GO=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.esx)
+C.GO=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.esx)
 C.bJ=new H.tx("counters")
 C.UI=new A.ES(C.bJ,C.BM,!1,C.SXK,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.lY,!1,C.esx)
+C.h3=new A.ES(C.bE,C.BM,!1,C.Gh,!1,C.esx)
 C.N8=new H.tx("scriptChanged")
-C.qE=new A.ES(C.N8,C.cn,!1,C.yQP,!1,C.xD)
+C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.xD)
 C.YT=new H.tx("expr")
 C.wG=H.Kxv('dynamic')
 C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
@@ -23033,42 +23261,42 @@
 C.jU=new H.tx("file")
 C.bw=new A.ES(C.jU,C.BM,!1,C.MR,!1,C.ucP)
 C.xS=new H.tx("tagSelectorChanged")
-C.hd=new A.ES(C.xS,C.cn,!1,C.yQP,!1,C.xD)
+C.hd=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.xD)
 C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
 C.uu=new H.tx("internal")
 C.NJ=new A.ES(C.uu,C.BM,!1,C.Ow,!1,C.ucP)
 C.YE=new H.tx("webSocket")
 C.Wl=new A.ES(C.YE,C.BM,!1,C.MR,!1,C.ucP)
 C.Dj=new H.tx("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.lY,!1,C.esx)
+C.Ay=new A.ES(C.Dj,C.BM,!1,C.Gh,!1,C.esx)
 C.Gr=new H.tx("endPos")
 C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
 C.RJ=new H.tx("vm")
-C.n8S=H.Kxv('wv')
-C.BP=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.ucP)
+C.U0P=H.Kxv('wv')
+C.BP=new A.ES(C.RJ,C.BM,!1,C.U0P,!1,C.ucP)
 C.uX=new H.tx("standaloneVmAddress")
-C.Eb=new A.ES(C.uX,C.BM,!1,C.lY,!1,C.ucP)
+C.Eb=new A.ES(C.uX,C.BM,!1,C.Gh,!1,C.ucP)
 C.PX=new H.tx("script")
-C.KB=H.Kxv('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
+C.iF=H.Kxv('vx')
+C.jz=new A.ES(C.PX,C.BM,!1,C.iF,!1,C.ucP)
 C.Gn=new H.tx("objectChanged")
-C.az=new A.ES(C.Gn,C.cn,!1,C.yQP,!1,C.xD)
+C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.xD)
 C.o0=new A.ES(C.vp,C.BM,!1,C.MR,!1,C.ucP)
 C.i4=new H.tx("code")
-C.nqy=H.Kxv('kx')
-C.aJ=new A.ES(C.i4,C.BM,!1,C.nqy,!1,C.ucP)
+C.pM=H.Kxv('kx')
+C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
 C.nE=new H.tx("tracer")
 C.Tbd=H.Kxv('KZ')
 C.FM=new A.ES(C.nE,C.BM,!1,C.Tbd,!1,C.ucP)
 C.kI=new H.tx("currentLine")
 C.Bf=new A.ES(C.kI,C.BM,!1,C.yw,!1,C.esx)
 C.kG=new H.tx("classTable")
-C.rX=H.Kxv('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.rX,!1,C.esx)
+C.m7I=H.Kxv('UC')
+C.Pr=new A.ES(C.kG,C.BM,!1,C.m7I,!1,C.esx)
 C.uk=new H.tx("last")
 C.rY=new A.ES(C.uk,C.BM,!1,C.Ow,!1,C.ucP)
 C.TN=new H.tx("lastServiceGC")
-C.Gj=new A.ES(C.TN,C.BM,!1,C.lY,!1,C.esx)
+C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.esx)
 C.OO=new H.tx("flag")
 C.Cf=new A.ES(C.OO,C.BM,!1,C.SXK,!1,C.ucP)
 C.S4=new H.tx("busy")
@@ -23078,21 +23306,22 @@
 C.am=new H.tx("chromeTargets")
 C.JD=new A.ES(C.am,C.BM,!1,C.Gsc,!1,C.esx)
 C.oE=new H.tx("chromiumAddress")
-C.r2=new A.ES(C.oE,C.BM,!1,C.lY,!1,C.ucP)
-C.WQ=new H.tx("field")
-C.ah=new A.ES(C.WQ,C.BM,!1,C.MR,!1,C.ucP)
+C.r2=new A.ES(C.oE,C.BM,!1,C.Gh,!1,C.ucP)
+C.AV=new H.tx("callback")
+C.Fyq=H.Kxv('Sa')
+C.k1=new A.ES(C.AV,C.BM,!1,C.Fyq,!1,C.ucP)
 C.r1=new H.tx("expandChanged")
-C.nP=new A.ES(C.r1,C.cn,!1,C.yQP,!1,C.xD)
+C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.xD)
 C.Mc=new H.tx("flagList")
 C.f0=new A.ES(C.Mc,C.BM,!1,C.MR,!1,C.ucP)
 C.rE=new H.tx("frame")
 C.B7=new A.ES(C.rE,C.BM,!1,C.SXK,!1,C.ucP)
 C.cg=new H.tx("anchor")
-C.ll=new A.ES(C.cg,C.BM,!1,C.lY,!1,C.ucP)
+C.ll=new A.ES(C.cg,C.BM,!1,C.Gh,!1,C.ucP)
 C.ngm=I.uLC([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.nqy,!1,C.ngm)
+C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ngm)
 C.mi=new H.tx("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.lY,!1,C.esx)
+C.yV=new A.ES(C.mi,C.BM,!1,C.Gh,!1,C.esx)
 C.tW=new H.tx("pos")
 C.It=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.ucP)
 C.TO=new A.ES(C.kY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -23100,25 +23329,12 @@
 C.Df=new A.ES(C.uG,C.BM,!1,C.Ow,!1,C.esx)
 C.IBq=H.Kxv('T8')
 C.xR=new A.ES(C.SR,C.BM,!1,C.IBq,!1,C.ucP)
-C.oqo=H.Kxv('pD')
-C.Ul=new A.ES(C.yh,C.BM,!1,C.oqo,!1,C.ucP)
 C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
 C.vb=new H.tx("profile")
 C.Mq=new A.ES(C.vb,C.BM,!1,C.MR,!1,C.ucP)
 C.KK=new A.ES(C.uO,C.BM,!1,C.Gsc,!1,C.esx)
 C.ny=new P.a6(0)
-C.it=new P.moY(!1)
-C.d6=H.VM(new W.FkO("close"),[W.BI])
-C.iw=H.VM(new W.FkO("disconnect"),[W.PGY])
-C.JN=H.VM(new W.FkO("error"),[W.ew7])
-C.MD=H.VM(new W.FkO("error"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.ew7])
-C.G5=H.VM(new W.FkO("loadend"),[W.ew7])
-C.ph=H.VM(new W.FkO("message"),[W.cxu])
-C.Whw=H.VM(new W.FkO("mousedown"),[W.AjY])
-C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
-C.JL=H.VM(new W.FkO("open"),[W.ea])
-C.yf=H.VM(new W.FkO("popstate"),[W.niR])
+C.eL=new P.moY(!1)
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -23251,16 +23467,16 @@
   hooks.prototypeForTag = prototypeForTagFixed;
 }
 C.xr=new P.byg(null,null)
-C.A3=new P.c5(null)
-C.cb=new P.ojF(null,null)
+C.A3=new P.Mx(null)
+C.Sr=new P.ojF(null,null)
 C.EkO=new N.Ng("FINER",400)
-C.t4=new N.Ng("FINE",500)
+C.R5=new N.Ng("FINE",500)
 C.IF=new N.Ng("INFO",800)
-C.oOA=new N.Ng("OFF",2000)
+C.oO=new N.Ng("OFF",2000)
 C.cd=new N.Ng("SEVERE",1000)
 C.nT=new N.Ng("WARNING",900)
 C.Gb=H.VM(I.uLC([127,2047,65535,1114111]),[P.KN])
-C.Q5=I.uLC([1,6])
+C.jb=I.uLC([1,6])
 C.rz=I.uLC([0,0,32776,33792,1,10240,0,0])
 C.SY=new H.tx("keys")
 C.l4=new H.tx("values")
@@ -23270,22 +23486,22 @@
 C.WK=I.uLC([C.SY,C.l4,C.Wn,C.ai,C.nZ])
 C.o5=I.uLC([0,0,65490,45055,65535,34815,65534,18431])
 C.fW=H.VM(I.uLC(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.qq=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
-C.Fa=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
+C.mKy=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
+C.yD=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
 C.fJ3=H.Kxv('iv')
-C.bfK=I.uLC([C.fJ3])
+C.fo=I.uLC([C.fJ3])
 C.ip=I.uLC(["==","!=","<=",">=","||","&&"])
 C.jY=I.uLC(["as","in","this"])
 C.jx=I.uLC([0,0,32722,12287,65534,34815,65534,18431])
-C.QC=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.Jp=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.uLC([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.B2=I.uLC([0,0,24576,1023,65534,34815,65534,18431])
 C.aa=I.uLC([0,0,32754,11263,65534,34815,65534,18431])
 C.ZJ=I.uLC([0,0,65490,12287,65535,34815,65534,18431])
-C.yk=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
-C.iq=I.uLC([40,41,91,93,123,125])
+C.jr=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
+C.ML=I.uLC([40,41,91,93,123,125])
 C.zao=I.uLC(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.bq=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
+C.lY=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
 C.Vgv=I.uLC(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.yt=new H.LPe(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
 C.rW=I.uLC(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
@@ -23293,17 +23509,17 @@
 C.kKi=I.uLC(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.w0=new H.LPe(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
 C.MEG=I.uLC(["enumerate"])
-C.mB=new H.LPe(1,{enumerate:K.FLA()},C.MEG)
+C.c7=new H.LPe(1,{enumerate:K.HZg()},C.MEG)
 C.tq=H.Kxv('Bo')
 C.uwj=H.Kxv('wA')
 C.wE=I.uLC([C.uwj])
 C.Tb=new A.rv(!1,!1,!0,C.tq,!1,!0,C.wE,null)
 C.eQn=H.Kxv('Yj')
 C.Qnw=I.uLC([C.eQn])
-C.m8=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
+C.jJ=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
 C.jUO=H.Kxv('xn')
-C.erP=I.uLC([C.jUO])
-C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.erP,null)
+C.qv=I.uLC([C.jUO])
+C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.qv,null)
 C.wj=new D.M9x("Internal")
 C.Cn=new D.M9x("Listening")
 C.lT=new D.M9x("Normal")
@@ -23311,7 +23527,7 @@
 C.BE=new H.tx("averageCollectionPeriodInMillis")
 C.IH=new H.tx("address")
 C.j2=new H.tx("app")
-C.US=new H.tx("architecture")
+C.ke=new H.tx("architecture")
 C.Wq=new H.tx("asStringLiteral")
 C.ET=new H.tx("assertsEnabled")
 C.WC=new H.tx("bpt")
@@ -23337,6 +23553,7 @@
 C.RG=new H.tx("currentPage")
 C.hJ=new H.tx("dartMetrics")
 C.ee=new H.tx("data")
+C.yC=new H.tx("declaredType")
 C.Lw=new H.tx("deleteVm")
 C.eR=new H.tx("deoptimizations")
 C.LS=new H.tx("description")
@@ -23374,6 +23591,9 @@
 C.RY=new H.tx("getTabs")
 C.d4=new H.tx("goto")
 C.cF=new H.tx("gotoLink")
+C.ft=new H.tx("guardClass")
+C.fX=new H.tx("guardLength")
+C.dr=new H.tx("guardNullable")
 C.SI=new H.tx("hasDescriptors")
 C.zS=new H.tx("hasDisassembly")
 C.YA=new H.tx("hasNoAllocations")
@@ -23403,6 +23623,7 @@
 C.Yg=new H.tx("isDartCode")
 C.bR=new H.tx("isDouble")
 C.ob=new H.tx("isError")
+C.dR=new H.tx("isFinal")
 C.WV=new H.tx("isFinalized")
 C.Ih=new H.tx("isImplemented")
 C.MY=new H.tx("isInlinable")
@@ -23424,7 +23645,7 @@
 C.b5=new H.tx("jumpTarget")
 C.z6=new H.tx("key")
 C.Lc=new H.tx("kind")
-C.kA=new H.tx("lastTokenPos")
+C.qa=new H.tx("lastTokenPos")
 C.GI=new H.tx("lastUpdate")
 C.ur=new H.tx("lib")
 C.VN=new H.tx("libraries")
@@ -23445,9 +23666,10 @@
 C.BJ=new H.tx("newSpace")
 C.OV=new H.tx("noSuchMethod")
 C.c6=new H.tx("notifications")
-C.jo=new H.tx("objectClass")
+C.as=new H.tx("objectClass")
 C.zO=new H.tx("objectPool")
 C.vg=new H.tx("oldSpace")
+C.Yp=new H.tx("owner")
 C.YV=new H.tx("owningClass")
 C.If=new H.tx("owningLibrary")
 C.zm=new H.tx("padding")
@@ -23458,6 +23680,7 @@
 C.yG=new H.tx("pauseEvent")
 C.uI=new H.tx("pid")
 C.Jf=new H.tx("possibleBpt")
+C.rm=new H.tx("privateKey")
 C.AY=new H.tx("protocol")
 C.AO=new H.tx("qualifiedName")
 C.Xd=new H.tx("reachable")
@@ -23468,7 +23691,7 @@
 C.KX=new H.tx("refreshCoverage")
 C.ja=new H.tx("refreshGC")
 C.mn=new H.tx("refreshRateChange")
-C.SE=new H.tx("registerCallback")
+C.L9=new H.tx("registerCallback")
 C.ir=new H.tx("relativeLink")
 C.dx=new H.tx("remoteAddress")
 C.ni=new H.tx("remotePort")
@@ -23514,7 +23737,7 @@
 C.dA=new H.tx("tokenPos")
 C.bc=new H.tx("topFrame")
 C.h5=new H.tx("totalCollectionTimeInSeconds")
-C.kr=new H.tx("totalSamplesInProfile")
+C.Kj=new H.tx("totalSamplesInProfile")
 C.ep=new H.tx("tree")
 C.hB=new H.tx("type")
 C.J2=new H.tx("typeChecksEnabled")
@@ -23525,7 +23748,7 @@
 C.Fh=new H.tx("url")
 C.yv=new H.tx("usageCounter")
 C.LP=new H.tx("used")
-C.Gy=new H.tx("userName")
+C.ct=new H.tx("userName")
 C.jh=new H.tx("v")
 C.zd=new H.tx("value")
 C.Db=new H.tx("valueAsString")
@@ -23535,6 +23758,7 @@
 C.zn=new H.tx("version")
 C.Sk=new H.tx("vmMetrics")
 C.KS=new H.tx("vmName")
+C.MA=new H.tx("vmType")
 C.Uy=new H.tx("writeClosed")
 C.hP=H.Kxv('uz')
 C.Qb=H.Kxv('J3')
@@ -23543,15 +23767,15 @@
 C.Dl=H.Kxv('F1')
 C.mK=H.Kxv('Mb')
 C.UJ=H.Kxv('oa')
-C.uh=H.Kxv('aI')
+C.E0=H.Kxv('aI')
 C.Y3=H.Kxv('CY')
 C.QJ=H.Kxv('WG')
-C.Bc=H.Kxv('Hl')
-C.kq=H.Kxv('Nn')
+C.ra=H.Kxv('Nn')
 C.j4=H.Kxv('IW')
 C.Ke=H.Kxv('EZ')
 C.Vx=H.Kxv('MJ')
 C.Vh=H.Kxv('Pz')
+C.HC=H.Kxv('F0')
 C.rR=H.Kxv('wN')
 C.kt=H.Kxv('Um')
 C.yS=H.Kxv('G6')
@@ -23572,20 +23796,21 @@
 C.dD=H.Kxv('av')
 C.FA=H.Kxv('Ya')
 C.PFz=H.Kxv('yyN')
+C.T1=H.Kxv('Wy')
 C.Th=H.Kxv('fI')
-C.cz=H.Kxv('Vf')
 C.tU=H.Kxv('L4')
+C.yT=H.Kxv('FK')
 C.cK=H.Kxv('I5')
 C.jA=H.Kxv('Eg')
 C.K4=H.Kxv('hV')
 C.Mt=H.Kxv('hu')
-C.laj=H.Kxv('ZX')
+C.qB=H.Kxv('ZX')
+C.CR=H.Kxv('CP')
 C.ca=H.Kxv('Z4')
 C.pJ=H.Kxv('Q6')
 C.Yy=H.Kxv('uE')
-C.WU=H.Kxv('lf')
-C.nC=H.Kxv('cQ')
 C.M5=H.Kxv('yc')
+C.kA=H.Kxv('G0')
 C.Yxm=H.Kxv('Pg')
 C.il=H.Kxv('xI')
 C.lp=H.Kxv('LU')
@@ -23594,9 +23819,12 @@
 C.EG=H.Kxv('Oz')
 C.nw=H.Kxv('eo')
 C.OG=H.Kxv('eW')
+C.hD=H.Kxv('lM')
 C.km=H.Kxv('fl')
 C.jV=H.Kxv('rF')
 C.rC=H.Kxv('qV')
+C.OZ=H.Kxv('Ce')
+C.Ho=H.Kxv('zt')
 C.Tq=H.Kxv('vj')
 C.ou=H.Kxv('ak')
 C.JW=H.Kxv('Ww')
@@ -23609,27 +23837,25 @@
 C.FG=H.Kxv('qh')
 C.bC=H.Kxv('D2')
 C.Nw=H.Kxv('vr')
+C.kq=H.Kxv('NT')
 C.a8=H.Kxv('Zx')
-C.YZ=H.Kxv('zt')
 C.NR=H.Kxv('nm')
 C.Fn=H.Kxv('qn')
 C.DD=H.Kxv('Zn')
-C.nj=H.Kxv('hg')
+C.Ev=H.Kxv('Un')
 C.qF=H.Kxv('mO')
-C.JA3=H.Kxv('b0B')
 C.Ey=H.Kxv('wM')
 C.pF=H.Kxv('WS')
 C.qZ=H.Kxv('DE')
 C.jw=H.Kxv('xc')
 C.NW=H.Kxv('ye')
+C.jRi=H.Kxv('we')
 C.pi=H.Kxv('FB')
 C.Xv=H.Kxv('n5')
 C.KO=H.Kxv('ZP')
-C.nW=H.Kxv('V2')
 C.he=H.Kxv('qM')
 C.Wz=H.Kxv('pR')
 C.tc=H.Kxv('Ma')
-C.Wr=H.Kxv('m9')
 C.Io=H.Kxv('Qh')
 C.Qt=H.Kxv('NK')
 C.wk=H.Kxv('nJ')
@@ -23644,7 +23870,7 @@
 C.Az=H.Kxv('Gk')
 C.GX=H.Kxv('c8')
 C.R9=H.Kxv('f7')
-C.QP=H.Kxv('vi')
+C.J0=H.Kxv('vi')
 C.tQ=H.Kxv('Vu')
 C.X8=H.Kxv('Ti')
 C.Lg=H.Kxv('JI')
@@ -23655,28 +23881,28 @@
 C.oT=H.Kxv('VY')
 C.jK=H.Kxv('el')
 C.xM=new P.u5F(!1)
-C.NA=new P.Uf(C.NU,P.RN())
-C.Xk=new P.Uf(C.NU,P.Dk())
-C.F6=new P.Uf(C.NU,P.H9())
-C.Rt=new P.Uf(C.NU,P.wLZ())
-C.Sq=new P.Uf(C.NU,P.zci())
-C.mc=new P.Uf(C.NU,P.OjX())
-C.uo=new P.Uf(C.NU,P.uy1())
-C.pj=new P.Uf(C.NU,P.W7())
-C.lk=new P.Uf(C.NU,P.qKH())
-C.Gu=new P.Uf(C.NU,P.xd())
-C.Yl=new P.Uf(C.NU,P.MM())
-C.Zc=new P.Uf(C.NU,P.yA())
-C.zb=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
+C.rj=new P.Ls(C.NU,P.Uwa())
+C.Xk=new P.Ls(C.NU,P.Dk())
+C.pm=new P.Ls(C.NU,P.zi())
+C.Rt=new P.Ls(C.NU,P.wLZ())
+C.Sq=new P.Ls(C.NU,P.zci())
+C.mc=new P.Ls(C.NU,P.xN())
+C.uo=new P.Ls(C.NU,P.uy1())
+C.pj=new P.Ls(C.NU,P.u3Q())
+C.lk=new P.Ls(C.NU,P.qKH())
+C.Gu=new P.Ls(C.NU,P.xd())
+C.Yl=new P.Ls(C.NU,P.MM())
+C.Zc=new P.Ls(C.NU,P.yA())
+C.Qq=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
 $.VzC=null
-$.kz=1
+$.v0=1
 $.z7="$cachedFunction"
 $.Mr="$cachedInvocation"
 $.xG=null
 $.hG=null
 $.OK=0
-$.mJs=null
+$.bf=null
 $.P4=null
 $.lcs=!1
 $.NF=null
@@ -23701,112 +23927,113 @@
 $.RL=!1
 $.DR=C.IF
 $.xO=0
-$.Nc=0
+$.dL=0
 $.Oo=null
 $.Td=!1
 $.jq1=0
-$.ljh=1
-$.ls=2
+$.ng=1
+$.H2=2
 $.rf=null
 $.ok=!1
-$.HE=!1
+$.DG=!1
 $.M6=null
 $.UG=!0
 $.RQ="objects/"
 $.vU=null
-$.Xa=null
-$.ax=null
-$.AuW=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.Br},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.Zgg},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.z0},C.j4,D.IW,{created:D.dmb},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.KU},C.Sb,A.kn,{created:A.Thl},C.kH,U.NY,{created:U.q5n},C.IZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.fm},C.uC,O.Im,{created:O.eka},C.PT,M.CX,{created:M.SPd},C.iD,O.Vb,{created:O.teo},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.yC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.bUN},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.YtF},C.rC,L.qV,{created:L.P5f},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.TH},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.qa},C.Mz,Z.uL,{created:Z.ew},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.Hr},C.Nw,T.vr,{created:T.aed},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.kf},C.nj,Y.hg,{created:Y.Ifw},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.oaJ},C.NW,A.ye,{created:A.mBQ},C.pi,N.FB,{created:N.kUw},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Wz,B.pR,{created:B.luW},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.aMd},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.tQ,X.Vu,{created:X.lt2},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
+$.Hg=null
+$.hm=null
+$.uv=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.PU},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.Zgg},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.KTC},C.j4,D.IW,{created:D.v8},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.wZ7},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.KU},C.Sb,A.kn,{created:A.Thl},C.kH,U.NY,{created:U.ui},C.IZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.Qje},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.FeK},C.uC,O.Im,{created:O.eka},C.PT,M.CX,{created:M.ec},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.CM},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.P5Z},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.Ln},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.kA,Y.G0,{created:Y.zE},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.Le},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.zf},C.rC,L.qV,{created:L.P5f},C.OZ,Q.Ce,{created:Q.FMr},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.zB},C.JW,A.Ww,{created:A.wC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.Mz,Z.uL,{created:Z.LD},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.n5p},C.Nw,T.vr,{created:T.aed},C.kq,L.NT,{created:L.di},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.n0},C.qF,E.mO,{created:E.V6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.yk},C.NW,A.ye,{created:A.mBQ},C.jRi,H.we,{"":H.m6},C.pi,N.FB,{created:N.kUw},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.TEI},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.kR},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.aMd},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.tQ,X.Vu,{created:X.lt2},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
 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($,"workerIds","Fa","cz",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($,"notClosurePattern","xq","bN",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
 I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"undefinedCallPattern","GK","BN",function(){return H.cM(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Y9",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"nullPropertyPattern","BX","W6",function(){return H.cM(H.Mj(null))})
 I.$lazy($,"nullLiteralPropertyPattern","tt","PB",function(){return H.cM(function(){try{null.$method$}catch(z){return z.message}}())})
 I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.cM(H.Mj(void 0))})
 I.$lazy($,"undefinedLiteralPropertyPattern","Ai","qK",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_matcher","lZ","NP",function(){return new H.VR("isolates/.*/metrics",H.v4("isolates/.*/metrics",!1,!0,!1),null,null)})
-I.$lazy($,"_isolateMatcher","AX","qL",function(){return new H.VR("isolates/.*/",H.v4("isolates/.*/",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","lZ","NP",function(){return new H.VR("isolates/.*/metrics",H.Vq("isolates/.*/metrics",!1,!0,!1),null,null)})
+I.$lazy($,"_isolateMatcher","M2","Il",function(){return new H.VR("isolates/.*/",H.Vq("isolates/.*/",!1,!0,!1),null,null)})
 I.$lazy($,"POLL_PERIODS","Bw","c3",function(){return[8000,4000,2000,1000,100]})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","Mn","zp",function(){return P.xg()})
-I.$lazy($,"_rootMap","ln","OL",function(){return P.YM(null,null,null,null,null)})
+I.$lazy($,"_rootMap","ln","wb",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
 I.$lazy($,"context","Lt","Xw",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","Os","Qg",function(){return[0,0,0,255]})
+I.$lazy($,"_pageSeparationColor","dg","vl",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.TJ)})
-I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","HS","ptP",function(){return new L.vH([])})
-I.$lazy($,"_identRegExp","pVY","cx",function(){return new L.lPa().$0()})
-I.$lazy($,"_logger","y7Y","YLt",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","zC","fX",function(){return P.L5(null,null,null,P.qU,L.Zl)})
-I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.Mo(null,C.qY),null)})
+I.$lazy($,"_logger","y7","aT",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","l7","O3",function(){return new L.vH([])})
+I.$lazy($,"_identRegExp","fZ","cD",function(){return new L.MdQ().$0()})
+I.$lazy($,"_logger","y7Y","Nd",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
+I.$lazy($,"_polymerSyntax","Kb","Cl",function(){return new A.Li(T.GF(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.Lz)})
-I.$lazy($,"_declarations","Hq","w3G",function(){return P.L5(null,null,null,P.qU,A.So)})
-I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
+I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_hasShadowDomPolyfill","PR","oo",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
 I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","pe","Is",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.rv(!1,!1,!0,C.tq,!1,!0,null,A.hU())})
-I.$lazy($,"_ATTRIBUTES_REGEX","TS","FF",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"_sheetLog","pe","eU",function(){return N.QM("polymer.stylesheet")})
+I.$lazy($,"_changedMethodQueryOptions","cq","or",function(){return new A.rv(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
+I.$lazy($,"_ATTRIBUTES_REGEX","TS","FF",function(){return new H.VR("\\s|,",H.Vq("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Xw(),"Platform")})
-I.$lazy($,"bindPattern","ZA","VCp",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_Polymer","kz","uj",function(){return J.UQ($.Xw(),"Polymer")})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.Vq("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_onReady","T8g","j6",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","fo","vo",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","Lu",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_watchLog","p5","REM",function(){return N.QM("polymer.watch")})
-I.$lazy($,"_readyLog","nS","lg",function(){return N.QM("polymer.ready")})
-I.$lazy($,"_PolymerGestures","Jm","tNi",function(){return J.UQ($.Xw(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","f8","Dw",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","FZ4","h2",function(){return P.EF([C.lY,new Z.lP(),C.GX,new Z.wJY(),C.Yc,new Z.zOQ(),C.Ow,new Z.W6o(),C.yw,new Z.MdQ(),C.cz,new Z.YJG()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"!",new K.w11()],null,null)})
+I.$lazy($,"_observeLog","DZ","a3",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_eventsLog","PK","xW",function(){return N.QM("polymer.events")})
+I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_bindLog","xz","aQ",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_watchLog","p5","Is",function(){return N.QM("polymer.watch")})
+I.$lazy($,"_readyLog","nS","Fs",function(){return N.QM("polymer.ready")})
+I.$lazy($,"_PolymerGestures","Yd","Op",function(){return J.UQ($.Xw(),"PolymerGestures")})
+I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
+I.$lazy($,"_typeHandlers","lq","RO",function(){return P.EF([C.Gh,new Z.DO(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.Ow,new Z.Ra(),C.yw,new Z.wJY(),C.CR,new Z.zOQ()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"*",new K.w11(),"/",new K.w12(),"%",new K.w13(),"==",new K.w14(),"!=",new K.w15(),"===",new K.w16(),"!==",new K.w17(),">",new K.w18(),">=",new K.w19(),"<",new K.w20(),"<=",new K.w21(),"||",new K.w22(),"&&",new K.w23(),"|",new K.w24()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","oQ","EU",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"!",new K.Raa()],null,null)})
 I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","vf","fA",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"kRegularFunction","Ij","qu",function(){return new D.ma("function")})
-I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.ma("closure function")})
-I.$lazy($,"kGetterFunction","F0","xW",function(){return new D.ma("getter function")})
-I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.ma("setter function")})
-I.$lazy($,"kConstructor","G8","kj",function(){return new D.ma("constructor")})
-I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.ma("implicit getter function")})
-I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.ma("implicit setter function")})
-I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.ma("static initializer")})
-I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.ma("method extractor")})
-I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.ma("noSuchMethod dispatcher")})
-I.$lazy($,"kInvokeFieldDispatcher","HU","f6",function(){return new D.ma("invoke field dispatcher")})
-I.$lazy($,"kCollected","bt","b1",function(){return new D.ma("Collected")})
-I.$lazy($,"kNative","dQ","Nk",function(){return new D.ma("Native")})
-I.$lazy($,"kTag","z3","zx",function(){return new D.ma("Tag")})
-I.$lazy($,"kReused","Gh","dh",function(){return new D.ma("Reused")})
-I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.ma("UNKNOWN")})
+I.$lazy($,"_currentIsolateMatcher","vf","jN",function(){return new H.VR("isolates/\\d+",H.Vq("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","r0",function(){return new H.VR("isolates/\\d+/",H.Vq("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"kRegularFunction","et","xK",function(){return new D.yz("function")})
+I.$lazy($,"kClosureFunction","jX","HU",function(){return new D.yz("closure function")})
+I.$lazy($,"kGetterFunction","PZ","rQ",function(){return new D.yz("getter function")})
+I.$lazy($,"kSetterFunction","Bs","en",function(){return new D.yz("setter function")})
+I.$lazy($,"kConstructor","G8","kj",function(){return new D.yz("constructor")})
+I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.yz("implicit getter function")})
+I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.yz("implicit setter function")})
+I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.yz("static initializer")})
+I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.yz("method extractor")})
+I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.yz("noSuchMethod dispatcher")})
+I.$lazy($,"kInvokeFieldDispatcher","fJ","bh",function(){return new D.yz("invoke field dispatcher")})
+I.$lazy($,"kCollected","bt","Dh",function(){return new D.yz("Collected")})
+I.$lazy($,"kNative","dQ","Nk",function(){return new D.yz("Native")})
+I.$lazy($,"kTag","z3","zx",function(){return new D.yz("Tag")})
+I.$lazy($,"kReused","tT","OA",function(){return new D.yz("Reused")})
+I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.yz("UNKNOWN")})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
-I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
+I.$lazy($,"typeInspector","Yv","II",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","vu",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.vE(null)})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
 I.$lazy($,"_contentsOwner","Ub","B8",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","v2","Ou",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.xB.g("template, ",J.ZG(J.kl(C.bq.gvc(C.bq),new M.DOe()),", "))})
-I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.Ufa())})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Raa().$0()})
-I.$lazy($,"_instanceExtension","nB","nR",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_expando","fF","as",function(){return H.VM(new P.qo("template_binding"),[null])})
+I.$lazy($,"_ownerStagingDocument","Xi","MO",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.yo.g("template, ",J.ZG(J.kl(C.lY.gvc(C.lY),new M.W6o()),", "))})
+I.$lazy($,"_templateObserver","joK","TQ",function(){return W.Ws(new M.YJG())})
+I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.DOe().$0()})
+I.$lazy($,"_instanceExtension","lET","Uo",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_isStagingDocument","Fg","Tg",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"a1",ret:P.lf},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"T9",void:true},{func:"LP",void:true,args:[{func:"T9",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"HQr",ret:{func:"ny"},args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"qs",ret:{func:"l4",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},{func:"tD",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"T9",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"JX",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"qa",ret:P.SQ,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"DW",ret:U.rx,args:[P.qU]},{func:"ZU",args:[U.rx,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"I6a",ret:P.qU},"invocation","fractionDigits",{func:"ny"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"lrq",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.Ix]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.SQ,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.niR]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"jB",args:[D.uq]},{func:"Np8",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"ux",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"aG",void:true,args:[P.EH]},{func:"lJL",args:[{func:"T9",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"yV",args:[null],opt:[null]},{func:"Wy",ret:P.SQ},"ignored","convert","element",{func:"K5",args:[P.SQ]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.Vf,args:[P.qU]},{func:"cd",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"bB",void:true,args:[W.AjY]},{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"T5",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"Ig",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.Vf]},"time",{func:"FJ",ret:P.qU,args:[P.qU],opt:[P.SQ]},"wasTruncated",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Zl,null]},"model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"zi",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.SQ]},{func:"qj",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.rx,U.rx]},{func:"Qc",args:[U.rx]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"K7",void:true,args:[[P.WO,P.KN]]},"counters",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"ze",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.U2]},{func:"Riv",args:[P.V2]},{func:"T3G",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"S0",void:true,args:[P.SQ,null]},"exp","details",{func:"D2",ret:A.Ap,args:[P.qU]},"ref","ifValue",{func:"PzC",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
+init.metadata=["object","sender","e",{func:"rb",args:[P.qU]},{func:"Za",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"qt",void:true},{func:"n9F",void:true,args:[{func:"qt",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"HQr",ret:{func:"ny"},args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"qs",ret:{func:"aB",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},{func:"tD",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"qt",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"pe",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"qa",ret:P.SQ,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"DW",ret:U.hw,args:[P.qU]},{func:"ZU",args:[U.hw,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"mb",ret:P.qU},"invocation","fractionDigits",{func:"ny"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"HF",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"F3",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.Ix]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.SQ,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.niR]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"le",args:[D.uq]},{func:"jM",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"ff",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"hF",void:true,args:[P.EH]},{func:"jF",args:[{func:"qt",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"Hp",args:[null],opt:[null]},{func:"cA",ret:P.SQ},"ignored","convert","element",{func:"K5",args:[P.SQ]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"nY",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"QO",void:true,args:[W.v3]},{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"rb",args:[P.qU]}]},{func:"T5",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.v3,null,W.h4]},{func:"zs",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"FJ",ret:P.qU,args:[P.qU],opt:[P.SQ]},"wasTruncated",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Tv,null]},"model","node","oneTime",{func:"zI",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"zi",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.SQ]},{func:"qj",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.hw,U.hw]},{func:"mM9",args:[U.hw]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"K7",void:true,args:[[P.WO,P.KN]]},"counters",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"RC",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.Z8]},{func:"Riv",args:[P.Wy]},{func:"Kg",args:[P.qU,L.Z8]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"K8",void:true,args:[P.SQ,null]},"exp","details",{func:"kn",ret:A.Ap,args:[P.qU]},"ref","ifValue",{func:"PzC",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -23941,7 +24168,7 @@
 a[c]=y
 a[d]=function(){var w=$[c]
 try{if(w===y){$[c]=x
-try{w=$[c]=e()}finally{if(w===y)if($[c]===x)$[c]=null}}else{if(w===x)H.eQK(b)}return w}finally{$[d]=function(){return this[c]}}}}
+try{w=$[c]=e()}finally{if(w===y)$[c]=null}}else{if(w===x)H.eQK(b)}return w}finally{$[d]=function(){return this[c]}}}}
 I.$finishIsolateConstructor=function(a){var y=a.p
 function Isolate(){var x=Object.prototype.hasOwnProperty
 for(var w in y)if(x.call(y,w))this[w]=y[w]
@@ -23967,5 +24194,5 @@
 return}if(document.currentScript){a(document.currentScript)
 return}var z=document.scripts
 function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.jk(),b)},[])}else{(function(b){H.wW(E.jk(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.V7A(),b)},[])}else{(function(b){H.wW(E.V7A(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html
index afb894c..cf2ff8d 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html
@@ -1,4 +1,5 @@
-<!DOCTYPE html><html><head>
+<!DOCTYPE html><html><head><script src="packages/web_components/dart_support.js"></script>
+
   <title>Dart VM Observatory</title>
   <meta charset="utf-8">
   
@@ -73,15 +74,23 @@
 }
 
 html /deep/ [flex] {
-  -ms-flex: 1;
+  -ms-flex: 1 1 0.000000001px;
   -webkit-flex: 1;
   flex: 1;
+  -webkit-flex-basis: 0.000000001px;
+  flex-basis: 0.000000001px;
+}
+
+html /deep/ [vertical][layout] > [flex][auto-vertical], html /deep/ [vertical][layout]::shadow [flex][auto-vertical] {
+  -ms-flex: 1 1 auto;
+  -webkit-flex-basis: auto;
+  flex-basis: auto;
 }
 
 html /deep/ [flex][auto] {
   -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
+  -webkit-flex-basis: auto;
+  flex-basis: auto;
 }
 
 html /deep/ [flex][none] {
@@ -203,7 +212,7 @@
 }
 
 html /deep/ [layout][around-justified] {
-  -ms-flex-pack: around;
+  -ms-flex-pack: distribute;
   -webkit-justify-content: space-around;
   justify-content: space-around;
 }
@@ -597,6 +606,8 @@
 
 
 
+
+
 <polymer-element name="curly-block">
   <template>
     <style>
@@ -652,6 +663,271 @@
 <polymer-element name="any-service-ref" extends="observatory-element">
 </polymer-element>
 
+<polymer-element name="object-ref" extends="service-ref">
+  <template><style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered-big {
+  padding-left: 5%;
+  padding-right: 5%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+h1 {
+  font: 400 18px 'Montserrat', sans-serif;
+}
+
+.memberList {
+  display: table;
+}
+
+.memberItem {
+  display: table-row;
+}
+
+.memberName, .memberValue {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.memberSmall {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 12px 'Montserrat', sans-serif;
+}
+
+.monospace {
+  font-family: consolas, courier, monospace;
+  font-size: 1em;
+  line-height: 1.2em;
+  white-space: nowrap;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <template if="{{ nameIsEmpty }}">
+      <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.vmType }}</em></a>
+    </template>
+    <template if="{{ !nameIsEmpty }}">
+      <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ name }}</em></a>
+    </template>
+  </template>
+</polymer-element>
+
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
@@ -1644,6 +1920,13 @@
         <a class="boxclose" on-click="{{ closeItem }}">×</a>
       </div>
     </template>
+    <template if="{{ event.eventType == 'VMDisconnected' }}">
+      <div class="item">
+        Disconnected from VM
+        <br><br>
+        <a class="boxclose" on-click="{{ closeItem }}">×</a>
+      </div>
+    </template>
   </template>
 </polymer-element>
 
@@ -3238,15 +3521,15 @@
 }
 </style>
     <span>
-      <template if="{{ ref['static'] }}">static</template>
-      <template if="{{ ref['final'] }}">final</template>
-      <template if="{{ ref['const'] }}">const</template>
-      <template if="{{ (ref['declaredType'].name == 'dynamic' &amp;&amp;
-                        !ref['final'] &amp;&amp; !ref['const']) }}">
+      <template if="{{ ref.isStatic] }}">static</template>
+      <template if="{{ ref.isFinal }}">final</template>
+      <template if="{{ ref.isConst }}">const</template>
+      <template if="{{ (ref.declaredType.name == 'dynamic' &amp;&amp;
+                        !ref.isFinal &amp;&amp; !ref.isConst) }}">
         var
       </template>
-      <template if="{{ (ref['declaredType'].name != 'dynamic') }}">
-        <instance-ref ref="{{ ref['declaredType'] }}"></instance-ref>
+      <template if="{{ (ref.declaredType.name != 'dynamic') }}">
+        <instance-ref ref="{{ ref.declaredType }}"></instance-ref>
       </template>
       <a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a>
     </span>
@@ -4561,8 +4844,8 @@
                   <field-ref ref="{{ field }}"></field-ref>
                 </div>
                 <div class="memberValue">
-                  <template if="{{ field['value'] != null }}">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                  <template if="{{ field.value != null }}">
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </template>
                 </div>
               </div>
@@ -5885,12 +6168,12 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
-      <template if="{{ field['owner'].type == 'Class' }}">
+      <template if="{{ field.owner.type == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ field.owner }}"></class-nav-menu>
       </template>
-      <template if="{{ field['owner'].type == 'Library' }}">
-        <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
+      <template if="{{ field.owner.type == 'Library' }}">
+        <library-nav-menu library="{{ field.owner }}"></library-nav-menu>
       </template>
       <nav-menu link="{{ field.link }}" anchor="{{ field.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -5899,15 +6182,15 @@
 
     <div class="content">
       <h1>
-        <template if="{{ field['static'] }}">static</template>
-        <template if="{{ field['final'] }}">final</template>
-        <template if="{{ field['const'] }}">const</template>
-        <template if="{{ (field['declaredType'].name == 'dynamic' &amp;&amp;
-                         !field['final'] &amp;&amp; !field['const']) }}">
+        <template if="{{ field.isStatic }}">static</template>
+        <template if="{{ field.isFinal }}">final</template>
+        <template if="{{ field.isConst }}">const</template>
+        <template if="{{ (field.declaredType.name == 'dynamic' &amp;&amp;
+                         !field.isFinal &amp;&amp; !field.isConst) }}">
           var
         </template>
-        <template if="{{ (field['declaredType'].name != 'dynamic') }}">
-          {{ field['declaredType'].name }}
+        <template if="{{ (field.declaredType.name != 'dynamic') }}">
+          {{ field.declaredType.name }}
         </template>
         {{ field.name }}
       </h1>
@@ -5915,48 +6198,48 @@
         <div class="memberItem">
           <div class="memberName">owner</div>
           <div class="memberValue">
-            <template if="{{ field['owner'].type == 'Class' }}">
-              <class-ref ref="{{ field['owner'] }}"></class-ref>
+            <template if="{{ field.owner.type == 'Class' }}">
+              <class-ref ref="{{ field.owner }}"></class-ref>
             </template>
-            <template if="{{ field['owner'].type != 'Class' }}">
-              <library-ref ref="{{ field['owner'] }}"></library-ref>
+            <template if="{{ field.owner.type != 'Class' }}">
+              <library-ref ref="{{ field.owner }}"></library-ref>
             </template>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ field['script'] }}"></script-ref>
+            <script-ref ref="{{ field.script }}"></script-ref>
           </div>
         </div>
-        <template if="{{ !field['static'] }}">
+        <template if="{{ !field.isStatic }}">
           <div class="memberItem" title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
             <div class="memberName">observed types</div>
             <div class="memberValue">
-              <template if="{{ field['guardClass'] == 'dynamic' }}">
+              <template if="{{ field.guardClass == 'dynamic' }}">
                 various
               </template>
-              <template if="{{ field['guardClass'] == 'unknown' }}">
+              <template if="{{ field.guardClass == 'unknown' }}">
                 none
               </template>
-              <template if="{{ field['guardClass'] != 'unknown' &amp;&amp;
-                            field['guardClass'] != 'dynamic' }}">
-                <class-ref ref="{{ field['guardClass'] }}"></class-ref>
-                <template if="{{ field['guardNullable'] }}">
+              <template if="{{ field.guardClass != 'unknown' &amp;&amp;
+                            field.guardClass != 'dynamic' }}">
+                <class-ref ref="{{ field.guardClass }}"></class-ref>
+                <template if="{{ field.guardNullable }}">
                   — null observed
                 </template>
-                <template if="{{ !field['guardNullable'] }}">
+                <template if="{{ !field.guardNullable }}">
                   — null not observed
                 </template>
               </template>
             </div>
           </div>
         </template>
-        <template if="{{ field['value'] != null }}">
+        <template if="{{ field.value != null }}">
           <div class="memberItem">
             <div class="memberName">static value</div>
             <div class="memberValue">
-              <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+              <any-service-ref ref="{{ field.value }}"></any-service-ref>
             </div>
           </div>
         </template>
@@ -14854,10 +15137,19 @@
         </div>
       </div>
 
-      <div class="memberItem" title="Space for this object in memory">
-        <div class="memberName">size</div>
-        <div class="memberValue">{{ object.size | formatSize }}</div>
-      </div>
+      <template if="{{ object.size != null }}">
+        <div class="memberItem" title="Space for this object in memory">
+          <div class="memberName">size</div>
+          <div class="memberValue">{{ object.size | formatSize }}</div>
+        </div>
+      </template>
+
+      <template if="{{ object.size == null }}">
+        <div class="memberItem" title="Space for this object in memory">
+          <div class="memberName">size</div>
+          <div class="memberValue">0</div>
+        </div>
+      </template>
 
       <div class="memberItem" title="Space that would be reclaimed if references to this object were replaced with null">
         <div class="memberName">retained size</div>
@@ -15601,7 +15893,7 @@
                     <field-ref ref="{{ field['decl'] }}"></field-ref>
                   </div>
                   <div class="memberValue">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </div>
                 </div>
               </template>
@@ -16012,8 +16304,8 @@
                   <field-ref ref="{{ field }}"></field-ref>
                 </div>
                 <div class="memberValue">
-                  <template if="{{ field['value'] != null }}">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                  <template if="{{ field.value != null }}">
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </template>
                 </div>
               </div>
@@ -16962,6 +17254,292 @@
 
 
 
+<polymer-element name="object-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered-big {
+  padding-left: 5%;
+  padding-right: 5%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+h1 {
+  font: 400 18px 'Montserrat', sans-serif;
+}
+
+.memberList {
+  display: table;
+}
+
+.memberItem {
+  display: table-row;
+}
+
+.memberName, .memberValue {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.memberSmall {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 12px 'Montserrat', sans-serif;
+}
+
+.monospace {
+  font-family: consolas, courier, monospace;
+  font-size: 1em;
+  line-height: 1.2em;
+  white-space: nowrap;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ object.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="object" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
+    </nav-bar>
+
+    <div class="content">
+      <object-common object="{{ object }}"></object-common>
+    </div>
+
+    <hr>
+  </template>
+</polymer-element>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
 
 
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data
index 1ec5d7a..9e8e93a 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data
+++ b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/object_common.dart"],["observatory","lib/src/elements/context_ref.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/context_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/object_common.dart"],["observatory","lib/src/elements/context_ref.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/object_view.dart"],["observatory","lib/src/elements/context_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js
index e4629fc..b8d37aa5 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -157,7 +157,7 @@
 "^":"",
 x:function(a){return void 0},
 uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-aN:function(a){var z,y,x,w
+MZ:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -169,23 +169,23 @@
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.Sx
 else return C.vB}return w},
-e1g:function(a){var z,y,x,w
-z=$.AuW
+zG:function(a){var z,y,x,w
+z=$.uv
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
 if(x.n(a,y[w]))return w}return},
-Dc:function(a){var z,y,x
-z=J.e1g(a)
+Xr:function(a){var z,y,x
+z=J.zG(a)
 if(z==null)return
-y=$.AuW
+y=$.uv
 x=z+1
 if(x>=y.length)return H.e(y,x)
 return y[x]},
-KE:function(a,b){var z,y,x
-z=J.e1g(a)
+YC:function(a,b){var z,y,x
+z=J.zG(a)
 if(z==null)return
-y=$.AuW
+y=$.uv
 x=z+2
 if(x>=y.length)return H.e(y,x)
 return y[x][b]},
@@ -213,7 +213,7 @@
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
-gbx:function(a){return C.Bc}},
+gbx:function(a){return C.Ho}},
 iCW:{
 "^":"Ue1;"},
 kdQ:{
@@ -227,7 +227,7 @@
 if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
-xe:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
+aP:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
@@ -238,13 +238,13 @@
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 uk:function(a,b){H.DQ(a,b)},
-ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0)])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
+ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.TNQ(),[H.u3(a,0)]),0)])},
+yx:[function(a,b){return H.VM(new H.Fm(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kY",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -252,17 +252,17 @@
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
 y[x]=w}return y.join(b)},
-eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0))},
+eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.TNQ(),[H.u3(a,0)]),0))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
 if(b===c)return H.VM([],[H.u3(a,0)])
 return H.VM(a.slice(b,c),[H.u3(a,0)])},
-Yc:function(a,b,c){var z=H.VM(new H.wb(),[H.u3(a,0)])
-H.xF(a,b,c)
+Yc:function(a,b,c){var z=H.VM(new H.TNQ(),[H.u3(a,0)])
+H.K0(a,b,c)
 return H.c1(a,b,c,H.u3(z,0))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -280,7 +280,7 @@
 Jd:function(a){return this.GT(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
+Pk:function(a,b,c){return H.EHn(a,b,a.length-1)},
 cn:function(a,b){return this.Pk(a,b,null)},
 tg:function(a,b){var z
 for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
@@ -294,7 +294,7 @@
 z.fixed$length=init
 return z}},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.u3(a,0))
+Oe:function(a){var z=P.fM(null,null,null,H.u3(a,0))
 z.FV(0,a)
 return z},
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)])},
@@ -330,7 +330,7 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gzr:function(a){return isFinite(a)},
+gx8:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
@@ -346,7 +346,7 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gVz",2,0,14,75],
+return y},"$1","gKy",2,0,14,75],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
@@ -398,20 +398,20 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-gbx:function(a){return C.WU},
-$islf:true,
+gbx:function(a){return C.yT},
+$isFK:true,
 static:{"^":"SAz,N6l"}},
 imn:{
 "^":"P;",
 gbx:function(a){return C.yw},
-$isVf:true,
-$islf:true,
+$isCP:true,
+$isFK:true,
 $isKN:true},
 VA7:{
 "^":"P;",
-gbx:function(a){return C.cz},
-$isVf:true,
-$islf:true},
+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))
@@ -460,7 +460,7 @@
 if(J.xZ(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
-bS:function(a){var z,y,x,w,v
+DY:function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
@@ -479,6 +479,9 @@
 b=b>>>1
 if(b===0)break
 z+=z}return y},
+LL:function(a,b,c){var z=b-a.length
+if(z<=0)return a
+return this.U(c,z)+a},
 gNq:function(a){return new J.IA(a)},
 XU:function(a,b,c){var z,y,x,w
 if(b==null)H.vh(P.u(null))
@@ -514,7 +517,7 @@
 y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
 y^=y>>11
 return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.lY},
+gbx:function(a){return C.Gh},
 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))
@@ -531,10 +534,10 @@
 x=a.charCodeAt(y)
 if(x!==32&&x!==13&&!J.Ga(x))break}return b}}},
 IA:{
-"^":"w2Y;vF",
-gB:function(a){return this.vF.length},
+"^":"w2Y;Bx",
+gB:function(a){return this.Bx.length},
 t:function(a,b){var z,y
-z=this.vF
+z=this.Bx
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 y=J.Wx(b)
 if(y.C(b,0))H.vh(P.N(b))
@@ -542,7 +545,7 @@
 return z.charCodeAt(b)},
 $asw2Y:function(){return[P.KN]},
 $asark:function(){return[P.KN]},
-$aseD:function(){return[P.KN]},
+$asE9h:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
 $asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
@@ -559,15 +562,15 @@
 z.a=b
 y=b}else y=b
 if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
-y=new H.dl(0,0,1,null,null,null,null,null,null,null,null,null,a)
+y=new H.O2(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.N8(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.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,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+x=P.L5(null,null,null,P.KN,H.HX)
+w=P.fM(null,null,null,P.KN)
+v=new H.HX(0,null,!1)
+u=new H.aX(y,x,w,new I(),v,new H.iV(H.t4()),new H.iV(H.t4()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
 w.h(0,0)
 u.ac(0,v)
 init.globalState.Nr=u
@@ -580,11 +583,11 @@
 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.mfx()
+if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.cL()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.mfx()
+if(init.globalState.EF===!0)return H.cL()
 return},
-mfx:function(){var z,y
+cL: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"))
@@ -593,24 +596,24 @@
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=H.Ln(b.data)
+z=H.BK(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.NO=y.t(z,"id")
 x=y.t(z,"functionName")
 w=x==null?init.globalState.w2:init.globalFunctions[x]()
 v=y.t(z,"args")
-u=H.Ln(y.t(z,"msg"))
+u=H.BK(y.t(z,"msg"))
 t=y.t(z,"isSpawnUri")
 s=y.t(z,"startPaused")
-r=H.Ln(y.t(z,"replyTo"))
+r=H.BK(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,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+q=P.L5(null,null,null,P.KN,H.HX)
+p=P.fM(null,null,null,P.KN)
+o=new H.HX(0,null,!1)
+n=new H.aX(y,q,p,new I(),o,new H.iV(H.t4()),new H.iV(H.t4()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
 p.h(0,0)
 n.ac(0,o)
-init.globalState.Xz.Rk.B7(0,new H.IY(n,new H.MA(w,v,u,t,s,r),"worker-start"))
+init.globalState.Xz.Rk.B7(0,new H.IY(n,new H.jl3(w,v,u,t,s,r),"worker-start"))
 init.globalState.N0=n
 init.globalState.Xz.bL()
 break
@@ -618,19 +621,19 @@
 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))
+case"close":init.globalState.XC.Rz(0,$.cz().t(0,a))
 a.terminate()
 init.globalState.Xz.bL()
 break
-case"log":H.Vj(y.t(z,"msg"))
+case"log":H.VLM(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.rj
 q=H.GyL(P.EF(["command","print","msg",z],null,null))
 y.toString
 self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","va",4,0,null,1,2],
-Vj:function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NBB",4,0,null,1,2],
+VLM:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.rj
 x=H.GyL(P.EF(["command","log","msg",a],null,null))
 y.toString
@@ -642,20 +645,20 @@
 y=z.jO
 $.z7=$.z7+("_"+y)
 $.Mr=$.Mr+("_"+y)
-y=z.er
+y=z.D5
 x=init.globalState.N0.jO
 w=z.Qy
-J.H4(f,["spawned",new H.Kg(y,x),w,z.PX])
+J.H4(f,["spawned",new H.VU(y,x),w,z.PX])
 x=new H.zX(a,b,c,d,z)
-if(e===!0){z.V0(w,w)
+if(e===!0){z.oz(w,w)
 init.globalState.Xz.Rk.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
 GyL:function(a){var z
-if(init.globalState.ji===!0){z=new H.RS(0,new H.oV())
+if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
 z.dZ=new H.m3(null)
-return z.h7(a)}else{z=new H.fL(new H.oV())
+return z.Zo(a)}else{z=new H.fL(new H.cx())
 z.dZ=new H.m3(null)
-return z.h7(a)}},
-Ln:function(a){if(init.globalState.ji===!0)return new H.EU(null).QS(a)
+return z.Zo(a)}},
+BK:function(a){if(init.globalState.ji===!0)return new H.hq(null).ug(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
@@ -667,7 +670,7 @@
 "^":"TpZ:76;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
-dl:{
+O2:{
 "^":"a;Hg,NO,hJ,N0,Nr,Xz,Ws,EF,ji,i2<,rj,XC,w2<",
 N8:function(a){var z,y,x
 z=self.window==null
@@ -678,10 +681,7 @@
 else y=!0
 this.ji=y
 this.Ws=z&&!x
-y=H.IY
-x=H.VM(new P.nd(null,0,0,0),[y])
-x.Eo(null,y)
-this.Xz=new H.ae(x,0)
+this.Xz=new H.ae(P.NZ2(null,H.IY),0)
 this.i2=P.L5(null,null,null,P.KN,H.aX)
 this.XC=P.L5(null,null,null,P.KN,null)
 if(this.EF===!0){z=new H.JH()
@@ -690,15 +690,15 @@
 self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
 static:{wI:[function(a){return H.GyL(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,A4,fW,En<,er<,Qy,PX,xF?,UF<,C9<,lJ,QC,fB,P0,pa,ir",
-V0:function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,A4,fW,En<,D5<,Qy,PX,xF?,UF<,Vp<,lJ,QC,fB,P0,pa,ir",
+oz:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.CX()},
 NR:function(a){var z,y,x,w,v,u
 if(!this.UF)return
 z=this.lJ
 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)
+if(z.X5===0){for(z=this.Vp;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
 y=init.globalState.Xz.Rk
 w=y.QN
@@ -726,21 +726,19 @@
 return}y=new H.NYh(a)
 if(z.n(b,2)){init.globalState.Xz.Rk.B7(0,new H.IY(this,y,"ping"))
 return}z=this.fB
-if(z==null){z=H.VM(new P.nd(null,0,0,0),[null])
-z.Eo(null,null)
+if(z==null){z=P.NZ2(null,null)
 this.fB=z}z.B7(0,y)},
 w1:function(a,b){var z,y
 if(!this.PX.n(0,a))return
 z=J.x(b)
 if(!z.n(b,0))y=z.n(b,1)&&!this.P0
 else y=!0
-if(y){this.Dm()
+if(y){this.Pb()
 return}if(z.n(b,2)){z=init.globalState.Xz
 y=this.gIm()
 z.Rk.B7(0,new H.IY(this,y,"kill"))
 return}z=this.fB
-if(z==null){z=H.VM(new P.nd(null,0,0,0),[null])
-z.Eo(null,null)
+if(z==null){z=P.NZ2(null,null)
 this.fB=z}z.B7(0,this.gIm())},
 hk:function(a,b){var z,y
 z=this.ir
@@ -762,13 +760,13 @@
 x=u
 w=new H.oP(v,null)
 this.hk(x,w)
-if(this.pa===!0){this.Dm()
+if(this.pa===!0){this.Pb()
 if(this===init.globalState.Nr)throw v}}finally{this.P0=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
 if(this.fB!=null)for(;u=this.fB,!u.gl0(u);)this.fB.AR().$0()}return y},"$1","gZ2",2,0,77,78],
 Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
+switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
@@ -791,17 +789,17 @@
 if(z.NZ(0,a))throw H.b(P.eG("Registry: ports must be registered only once."))
 z.u(0,a,b)},
 CX:function(){if(this.A4.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.i2.u(0,this.jO,this)
-else this.Dm()},
-Dm:[function(){var z,y
+else this.Pb()},
+Pb:[function(){var z,y
 z=this.fB
 if(z!=null)z.V1(0)
-for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.Ff.BG()
+for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.BG()
 z.V1(0)
 this.fW.V1(0)
 init.globalState.i2.Rz(0,this.jO)
 this.ir.V1(0)
 z=this.QC
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.Ff,null)
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.lo,null)
 this.QC=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NYh:{
@@ -810,11 +808,11 @@
 $isEH:true},
 ae:{
 "^":"a;Rk>,kv",
-mj:function(){var z=this.Rk
+MK:function(){var z=this.Rk
 if(z.QN===z.Bq)return
 return z.AR()},
-d5:function(){var z,y,x
-z=this.mj()
+xB:function(){var z,y,x
+z=this.MK()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.NZ(0,init.globalState.Nr.jO)&&init.globalState.Ws===!0&&init.globalState.Nr.A4.X5===0)H.vh(P.eG("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.i2.X5===0&&y.Xz.kv===0){y=y.rj
@@ -823,7 +821,7 @@
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
 nT:function(){if(self.window!=null)new H.Rm(this).$0()
-else for(;this.d5(););},
+else for(;this.xB(););},
 bL:function(){var z,y,x,w,v
 if(init.globalState.EF!==!0)this.nT()
 else try{this.nT()}catch(x){w=H.Ru(x)
@@ -835,17 +833,17 @@
 self.postMessage(v)}}},
 Rm:{
 "^":"TpZ:17;a",
-$0:[function(){if(!this.a.d5())return
+$0:[function(){if(!this.a.xB())return
 P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,xh,G1>",
-Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
+Fn:[function(a){if(this.od.gUF()){this.od.gVp().push(this)
 return}J.QT(this.od,this.xh)},"$0","gpE",0,0,17],
 $isIY:true},
 JH:{
 "^":"a;"},
-MA:{
+jl3:{
 "^":"TpZ:76;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -864,9 +862,9 @@
 $isEH:true},
 Iy4:{
 "^":"a;",
-$ispW:true,
-$ishq:true},
-Kg:{
+$isRZ:true,
+$isXY:true},
+VU:{
 "^":"Iy4;kx,AJ",
 wR:function(a,b){var z,y,x,w,v
 z={}
@@ -878,22 +876,22 @@
 v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
 z.a=b
 if(v)z.a=H.GyL(b)
-if(x.ger()===w){x.Ds(z.a)
+if(x.gD5()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.B7(0,new H.IY(x,new H.Ua(z,this,v),w))},
+y.Rk.B7(0,new H.IY(x,new H.cR(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isKg&&J.xC(this.kx,b.kx)},
-giO:function(a){return J.Rr(this.kx)},
-$isKg:true,
-$ispW:true,
-$ishq:true},
-Ua:{
+return!!J.x(b).$isVU&&J.xC(this.kx,b.kx)},
+giO:function(a){return J.dv(this.kx)},
+$isVU:true,
+$isRZ:true,
+$isXY:true},
+cR:{
 "^":"TpZ:76;a,b,c",
 $0:[function(){var z,y
 z=this.b.kx
 if(!z.geL()){if(this.c){y=this.a
-y.a=H.Ln(y.a)}J.Pc(z,this.a.a)}},"$0",null,0,0,null,"call"],
+y.a=H.BK(y.a)}J.pq(z,this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 bM:{
 "^":"Iy4;Bi,ma,AJ",
@@ -905,16 +903,16 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isbM&&J.xC(this.Bi,b.Bi)&&J.xC(this.AJ,b.AJ)&&J.xC(this.ma,b.ma)},
 giO:function(a){var z,y,x
-z=J.Eh(this.Bi,16)
-y=J.Eh(this.AJ,8)
+z=J.lf(this.Bi,16)
+y=J.lf(this.AJ,8)
 x=this.ma
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isbM:true,
-$ispW:true,
-$ishq:true},
-yo:{
-"^":"a;a7>,Oy,eL<",
+$isRZ:true,
+$isXY:true},
+HX:{
+"^":"a;UL>,Oy,eL<",
 mY:function(a){return this.Oy.$1(a)},
 BG:function(){this.eL=!0
 this.Oy=null},
@@ -923,29 +921,29 @@
 this.eL=!0
 this.Oy=null
 z=init.globalState.N0
-y=this.a7
+y=this.UL
 z.A4.Rz(0,y)
 z.fW.Rz(0,y)
 z.CX()},
 yU:function(a,b){if(this.eL)return
 this.mY(b)},
-$isyo:true,
-static:{"^":"kz"}},
+$isHX:true,
+static:{"^":"v0"}},
 RS:{
-"^":"hz;uP,dZ",
-DE:function(a){if(!!a.$isKg)return["sendport",init.globalState.NO,a.AJ,J.Rr(a.kx)]
+"^":"jP1;uP,dZ",
+DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.AJ,J.dv(a.kx)]
 if(!!a.$isbM)return["sendport",a.Bi,a.AJ,a.ma]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$iskuS)return["capability",a.a7]
+yf:function(a){if(!!a.$isiV)return["capability",a.UL]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 fL:{
 "^":"ooy;dZ",
-DE:function(a){if(!!a.$isKg)return new H.Kg(a.kx,a.AJ)
+DE:function(a){if(!!a.$isVU)return new H.VU(a.kx,a.AJ)
 if(!!a.$isbM)return new H.bM(a.Bi,a.ma,a.AJ)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$iskuS)return new H.kuS(a.a7)
+yf:function(a){if(!!a.$isiV)return new H.iV(a.UL)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-EU:{
+hq:{
 "^":"fPc;Bw",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
@@ -956,19 +954,19 @@
 if(v==null)return
 u=v.hV(w)
 if(u==null)return
-return new H.Kg(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.kuS(J.UQ(a,1))}},
+return new H.VU(u,x)}else return new H.bM(y,w,x)},
+Op:function(a){return new H.iV(J.UQ(a,1))}},
 m3:{
-"^":"a;At",
+"^":"a;Vz",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.At.push(b)
+u:function(a,b,c){this.Vz.push(b)
 b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.At=[]},
+CH:function(a){this.Vz=[]},
 F4:function(){var z,y,x
-for(z=this.At.length,y=0;y<z;++y){x=this.At
+for(z=this.Vz.length,y=0;y<z;++y){x=this.Vz
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.At=null}},
-oV:{
+x[y].__MessageTraverser__attached_info__=null}this.Vz=null}},
+cx:{
 "^":"a;",
 t:function(a,b){return},
 u:function(a,b,c){},
@@ -976,18 +974,18 @@
 F4:function(){}},
 HU5:{
 "^":"a;",
-h7:function(a){var z
+Zo:function(a){var z
 if(H.vM(a))return this.Wp(a)
 this.dZ.CH(0)
 z=null
-try{z=this.B3(a)}finally{this.dZ.F4()}return z},
-B3:function(a){var z
+try{z=this.GP(a)}finally{this.dZ.F4()}return z},
+GP:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Wp(a)
 z=J.x(a)
 if(!!z.$isWO)return this.wb(a)
-if(!!z.$isT8)return this.TI(a)
-if(!!z.$ispW)return this.DE(a)
-if(!!z.$ishq)return this.yf(a)
+if(!!z.$isT8)return this.pi(a)
+if(!!z.$isRZ)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:{
@@ -1001,9 +999,9 @@
 z=Array(x)
 z.fixed$length=init
 this.dZ.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.B3(y.t(a,w))
+for(w=0;w<x;++w)z[w]=this.GP(y.t(a,w))
 return z},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z={}
 y=this.dZ.t(0,a)
 z.a=y
@@ -1018,9 +1016,9 @@
 RK:{
 "^":"TpZ:81;a,b",
 $2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.B3(a),z.B3(b))},"$2",null,4,0,null,79,80,"call"],
+J.qQ(this.a.a,z.GP(a),z.GP(b))},"$2",null,4,0,null,79,80,"call"],
 $isEH:true},
-hz:{
+jP1:{
 "^":"HU5;",
 Wp:function(a){return a},
 wb:function(a){var z,y
@@ -1029,26 +1027,26 @@
 y=this.uP++
 this.dZ.u(0,a,y)
 return["list",y,this.IP(a)]},
-TI:function(a){var z,y,x
+pi:function(a){var z,y,x
 z=this.dZ.t(0,a)
 if(z!=null)return["ref",z]
 y=this.uP++
 this.dZ.u(0,a,y)
 x=J.RE(a)
-return["map",y,this.IP(J.Nd(x.gvc(a))),this.IP(J.Nd(x.gUQ(a)))]},
+return["map",y,this.IP(J.qA(x.gvc(a))),this.IP(J.qA(x.gUQ(a)))]},
 IP:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
 C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.B3(z.t(a,w))
+for(w=0;w<y;++w){v=this.GP(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 fPc:{
 "^":"a;",
-QS:function(a){if(H.ZR(a))return a
+ug:function(a){if(H.ZR(a))return a
 this.Bw=P.YM(null,null,null,null,null)
 return this.H6(a)},
 H6:function(a){var z,y
@@ -1088,12 +1086,12 @@
 return z},
 fp:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
-"^":"a;bf,TD,Iw",
+"^":"a;zY,TD,Iw",
 Gv:function(){if(self.setTimeout!=null){if(this.TD)throw H.b(P.f("Timer in event loop cannot be canceled."))
 if(this.Iw==null)return
 H.cv()
 var z=this.Iw
-if(this.bf)self.clearTimeout(z)
+if(this.zY)self.clearTimeout(z)
 else self.clearInterval(z)
 this.Iw=null}else throw H.b(P.f("Canceling a timer."))},
 WI:function(a,b){if(self.setTimeout!=null){++init.globalState.Xz.kv
@@ -1109,7 +1107,7 @@
 this.Iw=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
 static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
 z.Qa(a,b)
-return z},zw:function(a,b){var z=new H.Oe(!1,!1,null)
+return z},jW:function(a,b){var z=new H.Oe(!1,!1,null)
 z.WI(a,b)
 return z}}},
 Av:{
@@ -1127,10 +1125,10 @@
 "^":"TpZ:76;a,b",
 $0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-kuS:{
-"^":"a;a7>",
+iV:{
+"^":"a;UL>",
 giO:function(a){var z,y,x
-z=this.a7
+z=this.UL
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1143,11 +1141,11 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$iskuS){z=this.a7
-y=b.a7
+if(!!J.x(b).$isiV){z=this.UL
+y=b.UL
 return z==null?y==null:z===y}return!1},
-$iskuS:true,
-$ishq:true}}],["","",,H,{
+$isiV:true,
+$isXY:true}}],["","",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1163,9 +1161,9 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
+nN:[function(a){throw H.b(P.rr(a,null,null))},"$1","UR",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
-if(c==null)c=H.kk()
+if(c==null)c=H.UR()
 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
@@ -1192,20 +1190,20 @@
 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(b==null)b=H.UR()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
-if(isNaN(z)){y=J.rr(a)
+if(isNaN(z)){y=J.iY(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)
+if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.yo.j(z,0)===36)z=C.yo.yn(z,1)
 return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
 a5:function(a){return"Instance of '"+H.lh(a)+"'"},
 Qn:[function(){return Date.now()},"$0","EY",0,0,4],
-Xe:function(){var z,y
+w4:function(){var z,y
 if($.xG!=null)return
 $.xG=1000
 $.hG=H.EY()
@@ -1228,13 +1226,13 @@
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.u3(a,0)]
-for(;y.G();){x=y.Ff
+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.wG(x-65536,10)&1023))
 z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
-eT:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
+LY:function(a){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
 if(y>65535)return H.Cq(a)}return H.RF(a)},
@@ -1263,7 +1261,7 @@
 KL:function(a){return a.aL?H.o2(a).getUTCHours()+0:H.o2(a).getHours()+0},
 ch:function(a){return a.aL?H.o2(a).getUTCMinutes()+0:H.o2(a).getMinutes()+0},
 Sw:function(a){return a.aL?H.o2(a).getUTCSeconds()+0:H.o2(a).getSeconds()+0},
-vA:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+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},
@@ -1308,7 +1306,7 @@
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
 z.name=""}else z.toString=H.tM
 return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
+tM:[function(){return J.AG(this.dartException)},"$0","nR",0,0,null],
 vh:function(a){throw H.b(a)},
 Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Hk(a)
@@ -1322,11 +1320,11 @@
 if((C.jn.wG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
 case 445:case 5007:v=H.d(y)+" (Error "+w+")"
 return z.$1(new H.W0(v,null))}}if(a instanceof TypeError){v=$.WD()
-u=$.Up()
+u=$.bN()
 t=$.PH()
 s=$.D1()
 r=$.BN()
-q=$.Kr()
+q=$.Y9()
 p=$.W6()
 $.PB()
 o=$.eA()
@@ -1357,11 +1355,11 @@
 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))
+if(z.n(c,0))return H.dB(b,new H.TL(a))
+else if(z.n(c,1))return H.dB(b,new H.uZ(a,d))
+else if(z.n(c,2))return H.dB(b,new H.OQ(a,d,e))
+else if(z.n(c,3))return H.dB(b,new H.Qx(a,d,e,f))
+else if(z.n(c,4))return H.dB(b,new H.RM(a,d,e,f,g))
 else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,5,6,7,8,9,10,11],
 tR:function(a,b){var z
 if(a==null)return
@@ -1391,7 +1389,7 @@
 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
+else if(u&&typeof x=="function"){q=t?H.HY:H.DVi
 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
@@ -1400,7 +1398,7 @@
 if(n!=null){m=d?o:H.CW(a,o,t)
 w[n]=m}}w["call*"]=s
 return v},
-vq:function(a,b,c,d){var z=H.uj
+vq:function(a,b,c,d){var z=H.DVi
 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)
@@ -1409,27 +1407,27 @@
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
 default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
 CW:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.Kv(a,b)
+if(c)return H.na(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.mJs
-if(w==null){w=H.B3("self")
-$.mJs=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+if(y===0){w=$.bf
+if(w==null){w=H.Iq("self")
+$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.WB(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
-v=$.mJs
-if(v==null){v=H.B3("self")
-$.mJs=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+v=$.bf
+if(v==null){v=H.Iq("self")
+$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(v+H.d(w)+"}")()},
-rm:function(a,b,c,d){var z,y
-z=H.uj
+ps:function(a,b,c,d){var z,y
+z=H.DVi
 y=H.HY
 switch(b?-1:a){case 0:throw H.b(H.S3("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
@@ -1441,16 +1439,16 @@
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
 return e.apply(f(this),h)}}(d,z,y)}},
-Kv:function(a,b){var z,y,x,w,v,u,t,s
+na:function(a,b){var z,y,x,w,v,u,t,s
 z=H.bO()
 y=$.P4
-if(y==null){y=H.B3("receiver")
+if(y==null){y=H.Iq("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.rm(w,!t,x,b)
+if(v||!t||w>=28)return H.ps(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.WB(t,1)
@@ -1472,16 +1470,16 @@
 eQK:function(a){throw H.b(P.mE("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Ogz:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.tu(z)
+if(b==null||b.length===0)return new H.Fp(z)
 return new H.KEA(z,b,null)},
 G3:function(){return C.Kn},
-rp:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
+t4:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
 Kxv:function(a){return new H.cu(a,null)},
 VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},
 oX:function(a){if(a==null)return
 return a.$builtinTypeInfo},
-IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
+IM:function(a,b){return H.Z9(a["$as"+H.d(b)],H.oX(a))},
 W8:function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},
 u3:function(a,b){var z=H.oX(a)
@@ -1503,7 +1501,7 @@
 wO:function(a){var z=J.x(a).constructor.builtin$cls
 if(a==null)return z
 return z+H.ia(a.$builtinTypeInfo,0,null)},
-Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+Z9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function")b=H.ml(a,null,b)}return b},
@@ -1512,7 +1510,7 @@
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
+return H.hv(H.Z9(y[d],z),c)},
 hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
@@ -1544,7 +1542,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},
+return H.hv(H.Z9(t,y),w)},
 Hc:function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
@@ -1667,18 +1665,18 @@
 z=H.VM([],[P.Od])
 y=b.length
 x=a.length
-for(;!0;){w=C.xB.XU(b,a,c)
+for(;!0;){w=C.yo.XU(b,a,c)
 if(w===-1)break
 z.push(new H.Vo(w,b,a))
 v=w+x
 if(v===y)break
 else c=w===v?c+1:v}return z},
 m2:function(a,b,c){var z,y
-if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
+if(typeof b==="string")return C.yo.XU(a,b,c)!==-1
 else{z=J.x(b)
-if(!!z.$isVR){z=C.xB.yn(a,c)
+if(!!z.$isVR){z=C.yo.yn(a,c)
 y=b.Yr
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},
+return y.test(z)}else return J.pO(z.dd(b,C.yo.yn(a,c)))}},
 ys:function(a,b,c){var z,y,x,w
 if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -1686,7 +1684,8 @@
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.IN+=w
-z.IN=w+c}return z.IN}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
+z.IN=w+c}w=z.IN
+return w.charCodeAt(0)==0?w:w}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
 ysD:{
 "^":"a;",
 gl0:function(a){return J.xC(this.gB(this),0)},
@@ -1711,18 +1710,18 @@
 z=this.md
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.Uf(x))}},
-gvc:function(a){return H.VM(new H.Ns(this),[H.u3(this,0)])},
+gvc:function(a){return H.VM(new H.dZ(this),[H.u3(this,0)])},
 gUQ:function(a){return H.K1(this.md,new H.hY(this),H.u3(this,0),H.u3(this,1))},
 $isyN:true},
 hY:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.Uf(a)},"$1",null,2,0,null,79,"call"],
 $isEH:true},
-Ns:{
+dZ:{
 "^":"mW;Nt",
 gA:function(a){return J.mY(this.Nt.md)}},
 LI:{
-"^":"a;r9,yl,Jt,TX,Y2,Ok",
+"^":"a;r9,yV,Jt,TX,Y2,Ok",
 gWa:function(){return this.r9},
 gUA:function(){return this.Jt===0},
 gnd:function(){var z,y,x,w
@@ -1748,9 +1747,9 @@
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
 v.u(0,new H.tx(t),x[s])}return v},
-static:{"^":"hAw,eHF,oJ"}},
+static:{"^":"hAw,eHF,De4"}},
 FD:{
-"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
+"^":"a;mr,Rn>,xm,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
@@ -1828,7 +1827,7 @@
 x=this.lT
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,GK,rZ,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
+static:{"^":"lm,xq,Re,fN,GK,rZ,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
 a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
@@ -1864,7 +1863,7 @@
 vV:{
 "^":"XS;yy",
 bu:[function(a){var z=this.yy
-return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,73]},
+return C.yo.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,73]},
 Hk:{
 "^":"TpZ:12;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
@@ -1880,23 +1879,23 @@
 z=y==null?"":y
 this.j0=z
 return z},"$0","gCR",0,0,73]},
-dr:{
+TL:{
 "^":"TpZ:76;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
-TL:{
+uZ:{
 "^":"TpZ:76;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
-uZ:{
+OQ:{
 "^":"TpZ:76;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
-OQ:{
+Qx:{
 "^":"TpZ:76;UI,bK,Gq,Rm",
 $0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
-Qx:{
+RM:{
 "^":"TpZ:76;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
@@ -1908,7 +1907,7 @@
 Bp:{
 "^":"TpZ;"},
 v:{
-"^":"Bp;tx,J6,lT,JL",
+"^":"Bp;tx,J6,lT,N7",
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isv)return!1
@@ -1919,9 +1918,9 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.J6))},
 $isv:true,
-static:{"^":"mJs,P4",uj:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.mJs
-if(z==null){z=H.B3("self")
-$.mJs=z}return z},B3:function(a){var z,y,x,w,v
+static:{"^":"bf,P4",DVi:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.bf
+if(z==null){z=H.Iq("self")
+$.bf=z}return z},Iq:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
@@ -1933,10 +1932,10 @@
 bu:[function(a){return this.G1},"$0","gCR",0,0,73],
 $isXS:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
-bb:{
+rg:{
 "^":"XS;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
-static:{S3:function(a){return new H.bb(a)}}},
+static:{S3:function(a){return new H.rg(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
@@ -1985,7 +1984,7 @@
 bu:[function(a){return"dynamic"},"$0","gCR",0,0,73],
 za:function(){return},
 $isi6:true},
-tu:{
+Fp:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
@@ -2002,7 +2001,7 @@
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.Ff.za())
+for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},
 bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gCR",0,0,73]},
@@ -2036,13 +2035,13 @@
 gHc:function(){var z=this.HN
 if(z!=null)return z
 z=this.Yr
-z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
+z=H.Vq(this.zO,z.multiline,!z.ignoreCase,!0)
 this.HN=z
 return z},
 gIa:function(){var z=this.mV
 if(z!=null)return z
 z=this.Yr
-z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.Vq(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
 this.mV=z
 return z},
 ik:function(a){var z
@@ -2052,7 +2051,7 @@
 return H.yx(this,z)},
 B0:function(a){if(typeof a!=="string")H.vh(P.u(a))
 return this.Yr.test(a)},
-e5:function(a){var z,y
+ii:function(a){var z,y
 z=this.ik(a)
 if(z!=null){y=z.pX
 if(0>=y.length)return H.e(y,0)
@@ -2086,14 +2085,14 @@
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $iswL:true,
-static:{v4:function(a,b,c,d){var z,y,x,w,v
+static:{Vq:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
+throw H.b(P.rr("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
 EK:{
 "^":"a;zO,pX",
 t:function(a,b){var z=this.pX
@@ -2105,17 +2104,17 @@
 z.fw(a,b)
 return z}}},
 KW:{
-"^":"mW;ve,BZ,wQ",
-gA:function(a){return new H.Pb(this.ve,this.BZ,this.wQ,null)},
+"^":"mW;ve,vF,wQ",
+gA:function(a){return new H.Pb(this.ve,this.vF,this.wQ,null)},
 $asmW:function(){return[P.Od]},
 $asQV:function(){return[P.Od]}},
 Pb:{
-"^":"a;UW,BZ,Ij,Jz",
+"^":"a;UW,vF,XB,Jz",
 gl:function(){return this.Jz},
 G:function(){var z,y,x,w,v
-z=this.BZ
+z=this.vF
 if(z==null)return!1
-y=this.Ij
+y=this.XB
 if(y<=z.length){x=this.UW.UZ(z,y)
 if(x!=null){this.Jz=x
 z=x.pX
@@ -2124,9 +2123,9 @@
 w=J.q8(z[0])
 if(typeof w!=="number")return H.s(w)
 v=y+w
-this.Ij=z.index===v?v+1:v
+this.XB=z.index===v?v+1:v
 return!0}}this.Jz=null
-this.BZ=null
+this.vF=null
 return!1}},
 Vo:{
 "^":"a;M,f1,zO",
@@ -2135,7 +2134,7 @@
 $isOd:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"LPc;IF,Qw,cw,oX,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"LPc;IF,Qw,cw,yQ,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gO9:function(a){return a.IF},
 sO9:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
 gFR:function(a){return a.Qw},
@@ -2144,12 +2143,12 @@
 sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
 gph:function(a){return a.cw},
 sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
-gih:function(a){return a.oX},
-sih:function(a,b){a.oX=this.ct(a,C.mJ,a.oX,b)},
+gih:function(a){return a.yQ},
+sih:function(a,b){a.yQ=this.ct(a,C.mJ,a.yQ,b)},
 pp:[function(a,b,c,d){var z=a.IF
 if(z===!0)return
 if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
-this.LY(a,null).wM(new X.jE(a))}},"$3","gYi",6,0,84,49,50,85],
+this.LY(a,null).wM(new X.IB(a))}},"$3","gMN",6,0,84,49,50,85],
 static:{zy:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -2159,8 +2158,8 @@
 a.IF=!1
 a.Qw=null
 a.cw="action"
-a.oX=null
-a.f4=[]
+a.yQ=null
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -2173,10 +2172,10 @@
 LPc:{
 "^":"xc+Pi;",
 $isd3:true},
-jE:{
+IB:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-z.IF=J.NB(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
@@ -2184,23 +2183,23 @@
 z=J.UQ(J.UQ($.Xw(),"google"),"visualization")
 $.BY=z
 return z},"$1","vN",2,0,12,13],
-DUC:function(a){var z=$.Vy().getItem(a)
+DU:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
-return C.xr.iQ(z)},
-n8:function(a){if(a==null)return P.pz(null,null,null)
-return W.qw("/crdptargets/"+P.jW(C.Fa,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
-G0:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
+return C.xr.kV(z)},
+QX:function(a){if(a==null)return P.t5(null,null,null)
+return W.Kz("/crdptargets/"+H.d(P.Mp(C.yD,a,C.xM,!1)),null,null).ml(new G.KF()).OA(new G.XN())},
+dj:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"},
 o1:function(a,b){var z
 for(z="";b>1;){--b
 if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-avE:[function(a){var z,y,x
+le:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
 y=z.Y(a,1000)
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","OA",2,0,14],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","nI",2,0,14],
 J8:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.RE(a*1000))
 y=C.jn.BU(z,3600000)
@@ -2211,15 +2210,15 @@
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-Xz:[function(a){var z=J.Wx(a)
+XzS:[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","Gt",2,0,14,15],
-mG:function(a){var z,y,x,w
+else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","RC",2,0,14,15],
+mGl:function(a){var z,y,x,w
 if(a==null)return"-"
-z=J.Dv(J.vX(a,1000))
+z=J.NQ(J.vX(a,1000))
 y=C.jn.BU(z,3600000)
 z=C.jn.Y(z,3600000)
 x=C.jn.BU(z,60000)
@@ -2229,34 +2228,34 @@
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;wc,fN,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,fn",
+"^":"Pi;k5,Ef,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,ij",
 gwv:function(a){return this.Nv},
 swv:function(a,b){var z,y
 if(J.xC(this.Nv,b))return
-if(this.Nv!=null){J.Z8(this.cC)
-J.of(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
-b.gEH().ml(this.gAQ())
+if(this.Nv!=null){J.U2(this.cC)
+J.tw(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
+b.gEH().ml(this.gEX())
 z=J.RE(b)
 z.giG(b).ml(this.gm6())
 y=b.gG2()
-H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gtb())
-J.Sr(z.gRk(b)).yI(this.gR7())
+H.VM(new P.rk(y),[H.u3(y,0)]).yI(this.gbf())
+J.HL(z.gRk(b)).yI(this.gfF())
 z=b.gLi()
-H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
+H.VM(new P.rk(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
 gvK:function(){return this.cC},
 svK:function(a){this.cC=F.Wi(this,C.c6,this.cC,a)},
-KO:function(a){var z,y
+of:function(a){var z,y
 $.Kh=this
-z=this.wc
+z=this.k5
 z.push(new G.t9(this,null,null,null,null))
 z.push(new G.ki(this,null,null,null,null))
-z.push(new G.Sy(this,null,null,null,null))
-z.push(G.Gi(this))
+z.push(new G.lO(this,null,null,null,null))
+z.push(G.b2(this))
 z.push(new G.by(this,null,null,null,null))
 z=this.Z6
 z.By=this
-y=H.VM(new W.RO(window,C.yf.fA,!1),[null])
-H.VM(new W.Ov(0,y.bi,y.fA,W.Yt(z.gnt()),y.el),[H.u3(y,0)]).DN()
+y=H.VM(new W.vG(window,"popstate",!1),[null])
+H.VM(new W.Ov(0,y.bi,y.fA,W.Yt(z.gTk()),y.el),[H.u3(y,0)]).DN()
 z.VA()},
 pZ:function(a){J.Ei(this.cC,new G.xE(a,new G.cE()))},
 rG:[function(a){var z=J.RE(a)
@@ -2266,28 +2265,28 @@
 case"BreakpointResolved":z.god(a).Xb()
 break
 case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.pZ(z.god(a))
-J.bi(this.cC,a)
+J.dH(this.cC,a)
 break
 case"GC":break
 default:N.QM("").YX("Unrecognized event: "+H.d(a))
-break}},"$1","gR7",2,0,86,87],
+break}},"$1","gfF",2,0,86,87],
 kj:[function(a){this.Pv=a
-this.aX("error/",null)},"$1","gtb",2,0,88,23],
+this.aX("error/",null)},"$1","gbf",2,0,88,23],
 m0:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
 else this.aX("error/",null)},"$1","geO",2,0,89,90],
 aX:function(a,b){var z,y,x,w,v,u
-z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
+z=b==null?P.Fl(null,null):P.WX(b,C.xM)
 y=J.U6(z)
 if(y.t(z,"trace")!=null){x=y.t(z,"trace")
 y=J.x(x)
-if(y.n(x,"on")){if($.ax==null)$.ax=Z.JQ()}else if(y.n(x,"off")){y=$.ax
+if(y.n(x,"on")){if($.hm==null)$.hm=Z.JQ()}else if(y.n(x,"off")){y=$.hm
 if(y!=null){y.RV.Gv()
-$.ax=null}}}y=$.ax
+$.hm=null}}}y=$.hm
 if(y!=null){y.NP.CH(0)
-J.Z8(y.Rk)}y=this.HJ
-if(y!=null)J.La(y,$.ax)
-for(y=this.wc,w=0;w<y.length;++w){v=y[w]
+J.U2(y.Rk)}y=this.HJ
+if(y!=null)J.La(y,$.hm)
+for(y=this.k5,w=0;w<y.length;++w){v=y[w]
 if(v.VU(a)){this.yN(v)
 y=R.tB(z)
 u=v.fz
@@ -2297,37 +2296,43 @@
 v.Q0(a)
 return}}throw H.b(P.a9())},
 yN:function(a){var z,y,x,w
-if(J.xC(this.fN,a))return
-if(this.fN!=null){N.QM("").To("Uninstalling page: "+H.d(this.fN))
-this.fN.oV()
+if(J.xC(this.Ef,a))return
+if(this.Ef!=null){N.QM("").To("Uninstalling page: "+H.d(this.Ef))
+this.Ef.oV()
 J.Wf(this.bn)}N.QM("").To("Installing page: "+H.d(a))
-try{a.ak()}catch(y){x=H.Ru(y)
+try{a.ci()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Failed to install page: "+H.d(z))}x=this.bn
 x.appendChild(a.gyF())
 w=W.r3("trace-view",null)
 this.HJ=w
-J.La(w,$.ax)
+J.La(w,$.hm)
 x.appendChild(this.HJ)
 x=a
-w=this.fN
+w=this.Ef
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.fN=x},
-rY:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gAQ",2,0,91,92],
-T0:[function(a){if(!J.xC(this.Nv,a))return
+this.nq(this,w)}this.Ef=x},
+vW:function(){J.Ei(this.cC,new G.cw())},
+rY:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)
+this.vW()},"$1","gEX",2,0,91,92],
+T0:[function(a){var z,y
+if(!J.xC(this.Nv,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gm6",2,0,91,92],
+z=this.cC
+y=new D.Mk(null,null,null,null,null,null,null,null,null,null,!1,null,null,null,null,null)
+y.eq=F.Wi(y,C.qR,null,"VMDisconnected")
+J.dH(z,y)},"$1","gm6",2,0,91,92],
 Ty:function(a){var z=this.m2.TY
-z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
-this.KO(!1)},
-E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A0),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+this.of(!1)},
+E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A5),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
-this.KO(!0)},
+this.of(!0)},
 static:{"^":"Kh<"}},
 cE:{
 "^":"TpZ:93;",
@@ -2336,33 +2341,37 @@
 $isEH:true},
 xE:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
+$1:[function(a){return J.xC(J.wg(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
 $isEH:true},
-Kf:{
+cw:{
+"^":"TpZ:12;",
+$1:[function(a){return J.xC(J.iiZ(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"],
+$isEH:true},
+eM:{
 "^":"a;Yb",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
 Ai:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-Id:function(a,b){var z=[]
+QS:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
 this.Yb.V7("addRow",[H.VM(new P.GD(z),[null])])}},
-yD:{
+qu:{
 "^":"a;vR,bG",
 Am:function(a,b){var z=P.jT(this.bG)
 this.vR.V7("draw",[b.Yb,z])}},
 yVe:{
 "^":"d3;",
 bo:function(a,b){var z
-if(this.By.Nv==null)b=this.wa("/vm-connect/")
-z=this.BE
+if(this.By.Nv==null){if(window.confirm("Connection with VM has been lost. Proceeding will lose current page.")!==!0)return
+b=this.wa("/vm-connect/")}z=this.BE
 if(z==null?b!=null:z!==b){N.QM("").To("Navigated to "+H.d(b))
 window.history.pushState(b,document.title,b)
 this.BE=b}this.UJ(b)},
 UJ:function(a){var z,y,x
-if(J.Qe(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("---")
+if(J.Qe(a).nC(a,"#"))a=C.yo.yn(a,1)
+if(C.yo.nC(a,"/"))a=C.yo.yn(a,1)
+if(C.yo.tg(a,"---")){z=a.split("---")
 y=z.length
 if(0>=y)return H.e(z,0)
 a=z[0]
@@ -2372,94 +2381,94 @@
 Cz:function(a,b,c){var z,y,x
 z=J.Vs(c).dA.getAttribute("href")
 y=J.RE(a)
-x=y.gEV(a)
+x=y.gAy(a)
 if(typeof x!=="number")return x.D()
-if(x>0||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gYK(a)===!0)return
+if(x>0||y.gNl(a)===!0||y.gTu(a)===!0||y.gkA(a)===!0||y.gw4(a)===!0)return
 this.bo(0,z)
-y.e6(a)}},
-ng:{
-"^":"yVe;Zz,By,BE,ro,XY,cU",
+y.TI(a)}},
+OR:{
+"^":"yVe;Zz,By,BE,ro,XY,iS",
 VA:function(){var z=H.d(window.location.hash)
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.Zz
 window.history.pushState(z,document.title,z)
 this.UJ(window.location.hash)},
-fH:[function(a){this.UJ(window.location.hash)},"$1","gnt",2,0,95,13],
+fH:[function(a){this.UJ(window.location.hash)},"$1","gTk",2,0,95,13],
 wa:function(a){return"#"+H.d(a)}},
-OS:{
+MQ:{
 "^":"Pi;i6>,yF<",
 gFL:function(a){return this.yF},
 sFL:function(a,b){this.yF=F.Wi(this,C.GP,this.yF,b)},
 gl6:function(a){return this.fz},
 sl6:function(a,b){this.fz=F.Wi(this,C.Zg,this.fz,b)},
 oV:function(){this.yF=F.Wi(this,C.GP,this.yF,null)},
-$isOS:true},
+$isMQ:true},
 by:{
-"^":"OS;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
+"^":"MQ;i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){if(J.xC(a,""))return
-this.i6.Nv.cv(a).ml(new G.mo(this)).OA(new G.Go5())},
+this.i6.Nv.cv(a).ml(new G.GL(this)).OA(new G.mo())},
 VU:function(a){return!0}},
-mo:{
+GL:{
 "^":"TpZ:12;a",
 $1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-Go5:{
+mo:{
 "^":"TpZ:12;",
 $1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 t9:{
-"^":"OS;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("class-tree",null)
+"^":"MQ;i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){a=J.ZZ(a,11)
-this.i6.Nv.cv(a).ml(new G.Hb(this)).OA(new G.ZaW())},
+this.i6.Nv.cv(a).ml(new G.Za(this)).OA(new G.hh())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
-Hb:{
+Za:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a.yF
 if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-ZaW:{
+hh:{
 "^":"TpZ:12;",
 $1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-Sy:{
-"^":"OS;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
+lO:{
+"^":"MQ;i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){var z,y
 z=H.Go(this.yF,"$isTi")
 y=this.i6.Pv
-z.Ll=J.NB(z,C.td,z.Ll,y)},
+z.Ll=J.Q5(z,C.td,z.Ll,y)},
 VU:function(a){return J.co(a,"error/")}},
 ki:{
-"^":"OS;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
+"^":"MQ;i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){},
 VU:function(a){return J.co(a,"vm-connect/")}},
 JM:{
-"^":"OS;cX@,K3,i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("metrics-page",null)
+"^":"MQ;cX@,K3,i6,yF,fz,Vg,ij",
+ci:function(){if(this.yF==null){var z=W.r3("metrics-page",null)
 z=F.Wi(this,C.GP,this.yF,z)
 this.yF=z
 H.Go(z,"$isqn")
-z.GC=J.NB(z,C.EP,z.GC,this)}},
+z.GC=J.Q5(z,C.EP,z.GC,this)}},
 ZW:function(a,b){var z
 if(b.gmw()!=null){if(J.cj(b.gmw()).gVs()===a)return
-C.Nm.Rz(b.gmw().gJb(),b)
+C.Nm.Rz(b.gmw().gfj(),b)
 b.smw(null)}if(J.xC(a,0))return
 z=this.K3.t(0,a)
-if(z!=null){z.gJb().push(b)
+if(z!=null){z.gfj().push(b)
 b.smw(z)
 return}throw H.b(P.a9())},
 Q0:function(a){var z,y,x
 z=this.i6.Nv
-y=$.qL().e5(a)
+y=$.Il().ii(a)
 x=J.U6(y)
-z.cv(x.Nj(y,0,J.bI(x.gB(y),1))).ml(new G.YhF(this))},
+z.cv(x.Nj(y,0,J.bI(x.gB(y),1))).ml(new G.VP(this))},
 VU:function(a){var z=$.NP().Yr
 if(typeof a!=="string")H.vh(P.u(a))
 return z.test(a)},
@@ -2471,21 +2480,21 @@
 w=new D.W1(w,v,null)
 w.Cb=P.SZ(v,w.gia(w))
 z.u(0,x,w)}},
-static:{"^":"lZ,AX,Bw",Gi:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
+static:{"^":"lZ,M2,Bw",b2:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
 z.LS(a)
 return z}}},
-YhF:{
+VP:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=H.Go(this.a.yF,"$isqn")
-z.OM=J.NB(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
+z.OM=J.Q5(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
 V3:{
 "^":"a;IU",
-cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
+cv:function(a){return G.DU(this.IU+"."+H.d(a))}},
 KF:{
 "^":"TpZ:3;",
 $1:[function(a){var z,y,x,w
-z=C.xr.iQ(a)
+z=C.xr.kV(a)
 if(z==null)return z
 y=J.U6(z)
 x=0
@@ -2498,10 +2507,10 @@
 "^":"TpZ:12;",
 $1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-nD:{
-"^":"d3;wo,bq>,TY,ro,XY,cU",
+uh:{
+"^":"d3;wo,bq>,TY,ro,XY,iS",
 k6:function(){return"ws://"+H.d(window.location.host)+"/ws"},
-TP:function(a){var z=this.Xk(a)
+J8:function(a){var z=this.Xk(a)
 if(z!=null)return z
 z=new L.Z5(0,!1,null,a)
 z.oc=a
@@ -2533,7 +2542,7 @@
 A7:function(){var z,y,x,w,v
 z=this.bq
 z.V1(z)
-y=G.DUC(this.wo.IU+".history")
+y=G.DU(this.wo.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2542,8 +2551,8 @@
 if(!(w<v))break
 x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
 this.TV()},
-lK:function(){this.A7()
-var z=this.TP(this.k6())
+vs:function(){this.A7()
+var z=this.J8(this.k6())
 this.TY=z
 this.h(0,z)},
 static:{"^":"lGN"}},
@@ -2553,42 +2562,42 @@
 $isEH:true},
 jQ:{
 "^":"TpZ:99;",
-$2:function(a,b){return J.FW(b.geX(),a.geX())},
+$2:function(a,b){return J.FW(b.gFH(),a.gFH())},
 $isEH:true},
 Y2:{
-"^":"Pi;eT>,yt<,ks>,oH<",
+"^":"Pi;eT>,yt<,qu>,oH<",
 gyX:function(a){return this.PU},
-gty:function(){return this.aZ},
+grm:function(){return this.aZ},
 goE:function(a){return this.Lk},
 soE:function(a,b){var z=J.xC(this.Lk,b)
 this.Lk=b
 if(!z){z=this.PU
 if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
 this.Pz(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.cO()}}},
+this.aY()}}},
 r8:function(){this.soE(0,this.Lk!==!0)
 return this.Lk},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
 ih:{
-"^":"Pi;vp>,Vg,fn",
-G7:function(a){var z,y
+"^":"Pi;vp>,Vg,ij",
+rT:function(a){var z,y
 z=this.vp
 y=J.w1(z)
 y.V1(z)
 a.Pz(0)
-y.FV(z,a.ks)},
-lo:function(a){var z,y,x
+y.FV(z,a.qu)},
+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.OY(z,x)+1,J.Mx(x))
+if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.dd(x))
 else this.nm(x)},
 nm:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.q8(z.gks(a))
+y=J.q8(z.gqu(a))
 if(y===0)return
-for(x=0;x<y;++x)if(J.IL(J.UQ(z.gks(a),x))===!0)this.nm(J.UQ(z.gks(a),x))
+for(x=0;x<y;++x)if(J.IL(J.UQ(z.gqu(a),x))===!0)this.nm(J.UQ(z.gqu(a),x))
 z.soE(a,!1)
 z=this.vp
 w=J.U6(z)
@@ -2596,15 +2605,15 @@
 w.oq(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy<",
-static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,16]}},
-Ni:{
+static:{mbk:[function(a){return a!=null?J.AG(a):"<null>"},"$1","NZt",2,0,16]}},
+c0:{
 "^":"a;UQ>",
-$isNi:true},
+$isc0:true},
 Vz:{
-"^":"Pi;oH<,vp>,zz<",
-sxp:function(a){this.pT=a
+"^":"Pi;oH<,vp>,GD<",
+sn4:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
-gxp:function(){return this.pT},
+gn4:function(){return this.pT},
 gT3:function(){return this.Rj},
 sT3:function(a){this.Rj=a
 F.Wi(this,C.JB,0,1)},
@@ -2613,19 +2622,19 @@
 return J.UQ(J.hI(z[a]),b)},
 oa:[function(a,b){var z=this.Ey(a,this.pT)
 return J.FW(this.Ey(b,this.pT),z)},"$2","gMG",4,0,100],
-ws:[function(a,b){return J.FW(this.Ey(a,this.pT),this.Ey(b,this.pT))},"$2","gfL",4,0,100],
+iJ8:[function(a,b){return J.FW(this.Ey(a,this.pT),this.Ey(b,this.pT))},"$2","gfL",4,0,100],
 Jd:function(a){var z,y
-H.Xe()
+H.w4()
 $.Ji=$.xG
-new P.VV(null,null).D5(0)
-z=this.zz
+new P.VV(null,null).wE(0)
+z=this.GD
 if(this.Rj){y=this.gMG()
 H.ig(z,y)}else{y=this.gfL()
 H.ig(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
-C.Nm.sB(this.zz,0)},
-Id:function(a,b){var z=this.vp
-this.zz.push(z.length)
+C.Nm.sB(this.GD,0)},
+QS:function(a,b){var z=this.vp
+this.GD.push(z.length)
 z.push(b)},
 Gu:function(a,b){var z,y
 z=this.vp
@@ -2637,25 +2646,25 @@
 ra:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.WB(J.Yq(z[a]),"\u2003")}z=this.oH
+return J.WB(J.ZC(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.Yq(z[a])
+z=J.ZC(z[a])
 return J.WB(z,this.Rj?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,101]}}],["","",,E,{
 "^":"",
 Jz:[function(){var z,y,x
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.Wq,new E.wa(),C.ET,new E.Or(),C.BE,new E.YL(),C.WC,new E.wf(),C.hR,new E.Oa(),C.S4,new E.emv(),C.Ro,new E.Lbd(),C.hN,new E.QAa(),C.AV,new E.CvS(),C.bV,new E.edy(),C.C0,new E.waE(),C.eZ,new E.Ore(),C.bk,new E.YLa(),C.lH,new E.wfa(),C.am,new E.Oaa(),C.oE,new E.e0(),C.kG,new E.e1(),C.OI,new E.e2(),C.Wt,new E.e3(),C.I9,new E.e4(),C.To,new E.e5(),C.mM,new E.e6(),C.aw,new E.e7(),C.XA,new E.e8(),C.i4,new E.e9(),C.mJ,new E.e10(),C.qt,new E.e11(),C.p1,new E.e12(),C.yJ,new E.e13(),C.la,new E.e14(),C.yL,new E.e15(),C.nr,new E.e16(),C.bJ,new E.e17(),C.ox,new E.e18(),C.Je,new E.e19(),C.kI,new E.e20(),C.vY,new E.e21(),C.Rs,new E.e22(),C.hJ,new E.e23(),C.Lw,new E.e24(),C.eR,new E.e25(),C.LS,new E.e26(),C.iE,new E.e27(),C.f4,new E.e28(),C.VK,new E.e29(),C.aH,new E.e30(),C.aK,new E.e31(),C.GP,new E.e32(),C.mw,new E.e33(),C.vs,new E.e34(),C.Gr,new E.e35(),C.TU,new E.e36(),C.Fe,new E.e37(),C.tP,new E.e38(),C.yh,new E.e39(),C.Zb,new E.e40(),C.u7,new E.e41(),C.p8,new E.e42(),C.qR,new E.e43(),C.ld,new E.e44(),C.ne,new E.e45(),C.B0,new E.e46(),C.r1,new E.e47(),C.mr,new E.e48(),C.Ek,new E.e49(),C.Pn,new E.e50(),C.YT,new E.e51(),C.h7,new E.e52(),C.R3,new E.e53(),C.cJ,new E.e54(),C.WQ,new E.e55(),C.fV,new E.e56(),C.jU,new E.e57(),C.OO,new E.e58(),C.Mc,new E.e59(),C.FP,new E.e60(),C.kF,new E.e61(),C.UD,new E.e62(),C.Aq,new E.e63(),C.DS,new E.e64(),C.C9,new E.e65(),C.VF,new E.e66(),C.uU,new E.e67(),C.YJ,new E.e68(),C.eF,new E.e69(),C.oI,new E.e70(),C.ST,new E.e71(),C.QH,new E.e72(),C.qX,new E.e73(),C.rE,new E.e74(),C.nf,new E.e75(),C.EI,new E.e76(),C.JB,new E.e77(),C.RY,new E.e78(),C.d4,new E.e79(),C.cF,new E.e80(),C.SI,new E.e81(),C.zS,new E.e82(),C.YA,new E.e83(),C.Ge,new E.e84(),C.A7,new E.e85(),C.He,new E.e86(),C.im,new E.e87(),C.Ss,new E.e88(),C.k6,new E.e89(),C.oj,new E.e90(),C.PJ,new E.e91(),C.Yb,new E.e92(),C.q2,new E.e93(),C.d2,new E.e94(),C.kN,new E.e95(),C.uO,new E.e96(),C.fn,new E.e97(),C.yB,new E.e98(),C.eJ,new E.e99(),C.iG,new E.e100(),C.Py,new E.e101(),C.pC,new E.e102(),C.uu,new E.e103(),C.qs,new E.e104(),C.XH,new E.e105(),C.XJ,new E.e106(),C.tJ,new E.e107(),C.F8,new E.e108(),C.fy,new E.e109(),C.C1,new E.e110(),C.Nr,new E.e111(),C.nL,new E.e112(),C.a0,new E.e113(),C.Yg,new E.e114(),C.bR,new E.e115(),C.ai,new E.e116(),C.ob,new E.e117(),C.MY,new E.e118(),C.Wg,new E.e119(),C.tD,new E.e120(),C.QS,new E.e121(),C.C7,new E.e122(),C.nZ,new E.e123(),C.Of,new E.e124(),C.Vl,new E.e125(),C.pY,new E.e126(),C.XL,new E.e127(),C.LA,new E.e128(),C.Iw,new E.e129(),C.tz,new E.e130(),C.AT,new E.e131(),C.Lk,new E.e132(),C.GS,new E.e133(),C.rB,new E.e134(),C.bz,new E.e135(),C.Jx,new E.e136(),C.b5,new E.e137(),C.z6,new E.e138(),C.SY,new E.e139(),C.Lc,new E.e140(),C.hf,new E.e141(),C.uk,new E.e142(),C.Zi,new E.e143(),C.TN,new E.e144(),C.GI,new E.e145(),C.Wn,new E.e146(),C.ur,new E.e147(),C.VN,new E.e148(),C.EV,new E.e149(),C.VI,new E.e150(),C.eh,new E.e151(),C.SA,new E.e152(),C.uG,new E.e153(),C.kV,new E.e154(),C.vp,new E.e155(),C.cc,new E.e156(),C.DY,new E.e157(),C.Lx,new E.e158(),C.M3,new E.e159(),C.wT,new E.e160(),C.JK,new E.e161(),C.SR,new E.e162(),C.t6,new E.e163(),C.rP,new E.e164(),C.qi,new E.e165(),C.pX,new E.e166(),C.kB,new E.e167(),C.LH,new E.e168(),C.a2,new E.e169(),C.VD,new E.e170(),C.NN,new E.e171(),C.UX,new E.e172(),C.YS,new E.e173(),C.pu,new E.e174(),C.uw,new E.e175(),C.BJ,new E.e176(),C.c6,new E.e177(),C.td,new E.e178(),C.Gn,new E.e179(),C.zO,new E.e180(),C.vg,new E.e181(),C.YV,new E.e182(),C.If,new E.e183(),C.Ys,new E.e184(),C.zm,new E.e185(),C.EP,new E.e186(),C.nX,new E.e187(),C.BV,new E.e188(),C.xP,new E.e189(),C.XM,new E.e190(),C.Ic,new E.e191(),C.yG,new E.e192(),C.uI,new E.e193(),C.O9,new E.e194(),C.ba,new E.e195(),C.tW,new E.e196(),C.CG,new E.e197(),C.Jf,new E.e198(),C.Wj,new E.e199(),C.vb,new E.e200(),C.UL,new E.e201(),C.AY,new E.e202(),C.QK,new E.e203(),C.AO,new E.e204(),C.Xd,new E.e205(),C.I7,new E.e206(),C.kY,new E.e207(),C.Wm,new E.e208(),C.vK,new E.e209(),C.Tc,new E.e210(),C.GR,new E.e211(),C.KX,new E.e212(),C.ja,new E.e213(),C.mn,new E.e214(),C.Dj,new E.e215(),C.ir,new E.e216(),C.dx,new E.e217(),C.ni,new E.e218(),C.X2,new E.e219(),C.F3,new E.e220(),C.UY,new E.e221(),C.Aa,new E.e222(),C.nY,new E.e223(),C.tg,new E.e224(),C.HD,new E.e225(),C.iU,new E.e226(),C.eN,new E.e227(),C.ue,new E.e228(),C.nh,new E.e229(),C.L2,new E.e230(),C.vm,new E.e231(),C.Gs,new E.e232(),C.bE,new E.e233(),C.YD,new E.e234(),C.PX,new E.e235(),C.N8,new E.e236(),C.EA,new E.e237(),C.oW,new E.e238(),C.KC,new E.e239(),C.tf,new E.e240(),C.da,new E.e241(),C.Jd,new E.e242(),C.Y4,new E.e243(),C.Si,new E.e244(),C.pH,new E.e245(),C.Ve,new E.e246(),C.jM,new E.e247(),C.rd,new E.e248(),C.W5,new E.e249(),C.uX,new E.e250(),C.nt,new E.e251(),C.IT,new E.e252(),C.li,new E.e253(),C.PM,new E.e254(),C.ks,new E.e255(),C.Om,new E.e256(),C.iC,new E.e257(),C.Nv,new E.e258(),C.Wo,new E.e259(),C.FZ,new E.e260(),C.TW,new E.e261(),C.xS,new E.e262(),C.ft,new E.e263(),C.QF,new E.e264(),C.mi,new E.e265(),C.zz,new E.e266(),C.eO,new E.e267(),C.hO,new E.e268(),C.ei,new E.e269(),C.HK,new E.e270(),C.je,new E.e271(),C.Ef,new E.e272(),C.QL,new E.e273(),C.RH,new E.e274(),C.SP,new E.e275(),C.Q1,new E.e276(),C.ID,new E.e277(),C.dA,new E.e278(),C.bc,new E.e279(),C.kw,new E.e280(),C.nE,new E.e281(),C.ep,new E.e282(),C.hB,new E.e283(),C.J2,new E.e284(),C.hx,new E.e285(),C.zU,new E.e286(),C.OU,new E.e287(),C.bn,new E.e288(),C.mh,new E.e289(),C.Fh,new E.e290(),C.yv,new E.e291(),C.LP,new E.e292(),C.jh,new E.e293(),C.zd,new E.e294(),C.Db,new E.e295(),C.aF,new E.e296(),C.l4,new E.e297(),C.fj,new E.e298(),C.xw,new E.e299(),C.zn,new E.e300(),C.RJ,new E.e301(),C.Sk,new E.e302(),C.KS,new E.e303(),C.YE,new E.e304(),C.Uy,new E.e305()],null,null)
-y=P.EF([C.aP,new E.e306(),C.cg,new E.e307(),C.Zg,new E.e308(),C.S4,new E.e309(),C.AV,new E.e310(),C.bk,new E.e311(),C.lH,new E.e312(),C.am,new E.e313(),C.oE,new E.e314(),C.kG,new E.e315(),C.Wt,new E.e316(),C.mM,new E.e317(),C.aw,new E.e318(),C.XA,new E.e319(),C.i4,new E.e320(),C.mJ,new E.e321(),C.yL,new E.e322(),C.nr,new E.e323(),C.bJ,new E.e324(),C.kI,new E.e325(),C.vY,new E.e326(),C.VK,new E.e327(),C.aH,new E.e328(),C.GP,new E.e329(),C.vs,new E.e330(),C.Gr,new E.e331(),C.Fe,new E.e332(),C.tP,new E.e333(),C.yh,new E.e334(),C.Zb,new E.e335(),C.p8,new E.e336(),C.ld,new E.e337(),C.ne,new E.e338(),C.B0,new E.e339(),C.mr,new E.e340(),C.YT,new E.e341(),C.cJ,new E.e342(),C.WQ,new E.e343(),C.jU,new E.e344(),C.OO,new E.e345(),C.Mc,new E.e346(),C.QH,new E.e347(),C.rE,new E.e348(),C.nf,new E.e349(),C.Ge,new E.e350(),C.A7,new E.e351(),C.He,new E.e352(),C.oj,new E.e353(),C.d2,new E.e354(),C.uO,new E.e355(),C.fn,new E.e356(),C.yB,new E.e357(),C.Py,new E.e358(),C.uu,new E.e359(),C.qs,new E.e360(),C.rB,new E.e361(),C.z6,new E.e362(),C.hf,new E.e363(),C.uk,new E.e364(),C.Zi,new E.e365(),C.TN,new E.e366(),C.ur,new E.e367(),C.EV,new E.e368(),C.VI,new E.e369(),C.eh,new E.e370(),C.SA,new E.e371(),C.uG,new E.e372(),C.kV,new E.e373(),C.vp,new E.e374(),C.SR,new E.e375(),C.t6,new E.e376(),C.kB,new E.e377(),C.UX,new E.e378(),C.YS,new E.e379(),C.c6,new E.e380(),C.td,new E.e381(),C.zO,new E.e382(),C.YV,new E.e383(),C.If,new E.e384(),C.Ys,new E.e385(),C.EP,new E.e386(),C.nX,new E.e387(),C.BV,new E.e388(),C.XM,new E.e389(),C.Ic,new E.e390(),C.O9,new E.e391(),C.tW,new E.e392(),C.Wj,new E.e393(),C.vb,new E.e394(),C.QK,new E.e395(),C.Xd,new E.e396(),C.kY,new E.e397(),C.vK,new E.e398(),C.Tc,new E.e399(),C.GR,new E.e400(),C.KX,new E.e401(),C.ja,new E.e402(),C.Dj,new E.e403(),C.X2,new E.e404(),C.UY,new E.e405(),C.Aa,new E.e406(),C.nY,new E.e407(),C.tg,new E.e408(),C.HD,new E.e409(),C.iU,new E.e410(),C.eN,new E.e411(),C.Gs,new E.e412(),C.bE,new E.e413(),C.YD,new E.e414(),C.PX,new E.e415(),C.tf,new E.e416(),C.Jd,new E.e417(),C.pH,new E.e418(),C.Ve,new E.e419(),C.jM,new E.e420(),C.rd,new E.e421(),C.uX,new E.e422(),C.nt,new E.e423(),C.IT,new E.e424(),C.PM,new E.e425(),C.ks,new E.e426(),C.Om,new E.e427(),C.iC,new E.e428(),C.Nv,new E.e429(),C.FZ,new E.e430(),C.TW,new E.e431(),C.ft,new E.e432(),C.mi,new E.e433(),C.zz,new E.e434(),C.dA,new E.e435(),C.kw,new E.e436(),C.nE,new E.e437(),C.hx,new E.e438(),C.zU,new E.e439(),C.OU,new E.e440(),C.zd,new E.e441(),C.RJ,new E.e442(),C.YE,new E.e443()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.XW,C.il,C.kH,C.Mt,C.Lg,C.qJ,C.Bi,C.il,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.uC,C.Mt,C.Wz,C.il,C.Ke,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.IZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.fU,C.Mt,C.pi,C.Mt,C.Fn,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.Mz,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.rC,C.Mt,C.Dl,C.Mt,C.Mz,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.R9,C.Mt,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.tQ,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.Mz,C.al,C.il],null,null)
-y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.aj,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.XW,P.Fl(null,null),C.kH,P.EF([C.nr,C.BO],null,null),C.Lg,P.EF([C.S4,C.aj,C.AV,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Bi,P.Fl(null,null),C.KO,P.EF([C.yh,C.Ul],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.jO,C.Aa,C.k5,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.aj,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.P9],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.EF([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.Fl(null,null),C.Ke,P.EF([C.fn,C.Kk],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.xV],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.IZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.hd,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.fU,P.EF([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.EF([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.EF([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.EF([C.uk,C.rY,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Cg],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.rY,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.oh,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.rY],null,null),C.rC,P.EF([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.Dl,P.EF([C.VK,C.lW],null,null),C.Mz,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.Bf,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.Df,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.It,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.bp],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.il,P.EF([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.iH,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.NS,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.iH,C.rE,C.B7],null,null),C.tQ,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.Wq,"asStringLiteral",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.Wt,"clazz",C.I9,"closeItem",C.To,"closing",C.mM,"closureCtxt",C.aw,"closureFunc",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.nr,"context",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.hJ,"dartMetrics",C.Lw,"deleteVm",C.eR,"deoptimizations",C.LS,"description",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.mw,"elements",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Yb,"id",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.XJ,"isAbstractType",C.tJ,"isBool",C.F8,"isChromeTarget",C.fy,"isClosure",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.C7,"isMirrorReference",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Iw,"isPlainInstance",C.tz,"isSentinel",C.AT,"isStatic",C.Lk,"isString",C.GS,"isWeakProperty",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.qi,"max",C.pX,"message",C.kB,"metric",C.LH,"metricChanged",C.a2,"min",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.uw,"nativeFields",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.EP,"page",C.nX,"parent",C.BV,"parentContext",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.Tc,"referent",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.mn,"refreshRateChange",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.vm,"sampleBufferSizeChange",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.da,"size",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.hB,"type",C.J2,"typeChecksEnabled",C.hx,"typeClass",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.zd,"value",C.Db,"valueAsString",C.aF,"valueAsStringIsTruncated",C.l4,"values",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Sk,"vmMetrics",C.KS,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.Wq,new E.wa(),C.ET,new E.Or(),C.BE,new E.YL(),C.WC,new E.wf(),C.hR,new E.Oa(),C.S4,new E.emv(),C.Ro,new E.Lbd(),C.hN,new E.QAa(),C.AV,new E.CvS(),C.bV,new E.edy(),C.C0,new E.waE(),C.eZ,new E.Ore(),C.bk,new E.YLa(),C.lH,new E.wfa(),C.am,new E.Oaa(),C.oE,new E.e0(),C.kG,new E.e1(),C.OI,new E.e2(),C.Wt,new E.e3(),C.I9,new E.e4(),C.To,new E.e5(),C.mM,new E.e6(),C.aw,new E.e7(),C.XA,new E.e8(),C.i4,new E.e9(),C.mJ,new E.e10(),C.qt,new E.e11(),C.p1,new E.e12(),C.yJ,new E.e13(),C.la,new E.e14(),C.yL,new E.e15(),C.nr,new E.e16(),C.bJ,new E.e17(),C.ox,new E.e18(),C.Je,new E.e19(),C.kI,new E.e20(),C.vY,new E.e21(),C.Rs,new E.e22(),C.hJ,new E.e23(),C.yC,new E.e24(),C.Lw,new E.e25(),C.eR,new E.e26(),C.LS,new E.e27(),C.iE,new E.e28(),C.f4,new E.e29(),C.VK,new E.e30(),C.aH,new E.e31(),C.aK,new E.e32(),C.GP,new E.e33(),C.mw,new E.e34(),C.vs,new E.e35(),C.Gr,new E.e36(),C.TU,new E.e37(),C.Fe,new E.e38(),C.tP,new E.e39(),C.yh,new E.e40(),C.Zb,new E.e41(),C.u7,new E.e42(),C.p8,new E.e43(),C.qR,new E.e44(),C.ld,new E.e45(),C.ne,new E.e46(),C.B0,new E.e47(),C.r1,new E.e48(),C.mr,new E.e49(),C.Ek,new E.e50(),C.Pn,new E.e51(),C.YT,new E.e52(),C.h7,new E.e53(),C.R3,new E.e54(),C.cJ,new E.e55(),C.WQ,new E.e56(),C.fV,new E.e57(),C.jU,new E.e58(),C.OO,new E.e59(),C.Mc,new E.e60(),C.FP,new E.e61(),C.kF,new E.e62(),C.UD,new E.e63(),C.Aq,new E.e64(),C.DS,new E.e65(),C.C9,new E.e66(),C.VF,new E.e67(),C.uU,new E.e68(),C.YJ,new E.e69(),C.eF,new E.e70(),C.oI,new E.e71(),C.ST,new E.e72(),C.QH,new E.e73(),C.qX,new E.e74(),C.rE,new E.e75(),C.nf,new E.e76(),C.EI,new E.e77(),C.JB,new E.e78(),C.RY,new E.e79(),C.d4,new E.e80(),C.cF,new E.e81(),C.ft,new E.e82(),C.dr,new E.e83(),C.SI,new E.e84(),C.zS,new E.e85(),C.YA,new E.e86(),C.Ge,new E.e87(),C.A7,new E.e88(),C.He,new E.e89(),C.im,new E.e90(),C.Ss,new E.e91(),C.k6,new E.e92(),C.oj,new E.e93(),C.PJ,new E.e94(),C.Yb,new E.e95(),C.q2,new E.e96(),C.d2,new E.e97(),C.kN,new E.e98(),C.uO,new E.e99(),C.fn,new E.e100(),C.yB,new E.e101(),C.eJ,new E.e102(),C.iG,new E.e103(),C.Py,new E.e104(),C.pC,new E.e105(),C.uu,new E.e106(),C.qs,new E.e107(),C.XH,new E.e108(),C.XJ,new E.e109(),C.tJ,new E.e110(),C.F8,new E.e111(),C.fy,new E.e112(),C.C1,new E.e113(),C.Nr,new E.e114(),C.nL,new E.e115(),C.a0,new E.e116(),C.Yg,new E.e117(),C.bR,new E.e118(),C.ai,new E.e119(),C.ob,new E.e120(),C.dR,new E.e121(),C.MY,new E.e122(),C.Wg,new E.e123(),C.tD,new E.e124(),C.QS,new E.e125(),C.C7,new E.e126(),C.nZ,new E.e127(),C.Of,new E.e128(),C.Vl,new E.e129(),C.pY,new E.e130(),C.XL,new E.e131(),C.LA,new E.e132(),C.Iw,new E.e133(),C.tz,new E.e134(),C.AT,new E.e135(),C.Lk,new E.e136(),C.GS,new E.e137(),C.rB,new E.e138(),C.bz,new E.e139(),C.Jx,new E.e140(),C.b5,new E.e141(),C.z6,new E.e142(),C.SY,new E.e143(),C.Lc,new E.e144(),C.hf,new E.e145(),C.uk,new E.e146(),C.Zi,new E.e147(),C.TN,new E.e148(),C.GI,new E.e149(),C.Wn,new E.e150(),C.ur,new E.e151(),C.VN,new E.e152(),C.EV,new E.e153(),C.VI,new E.e154(),C.eh,new E.e155(),C.SA,new E.e156(),C.uG,new E.e157(),C.kV,new E.e158(),C.vp,new E.e159(),C.cc,new E.e160(),C.DY,new E.e161(),C.Lx,new E.e162(),C.M3,new E.e163(),C.wT,new E.e164(),C.JK,new E.e165(),C.SR,new E.e166(),C.t6,new E.e167(),C.rP,new E.e168(),C.qi,new E.e169(),C.pX,new E.e170(),C.kB,new E.e171(),C.LH,new E.e172(),C.a2,new E.e173(),C.VD,new E.e174(),C.NN,new E.e175(),C.UX,new E.e176(),C.YS,new E.e177(),C.pu,new E.e178(),C.uw,new E.e179(),C.BJ,new E.e180(),C.c6,new E.e181(),C.td,new E.e182(),C.Gn,new E.e183(),C.zO,new E.e184(),C.vg,new E.e185(),C.Yp,new E.e186(),C.YV,new E.e187(),C.If,new E.e188(),C.Ys,new E.e189(),C.zm,new E.e190(),C.EP,new E.e191(),C.nX,new E.e192(),C.BV,new E.e193(),C.xP,new E.e194(),C.XM,new E.e195(),C.Ic,new E.e196(),C.yG,new E.e197(),C.uI,new E.e198(),C.O9,new E.e199(),C.ba,new E.e200(),C.tW,new E.e201(),C.CG,new E.e202(),C.Jf,new E.e203(),C.Wj,new E.e204(),C.vb,new E.e205(),C.UL,new E.e206(),C.AY,new E.e207(),C.QK,new E.e208(),C.AO,new E.e209(),C.Xd,new E.e210(),C.I7,new E.e211(),C.kY,new E.e212(),C.Wm,new E.e213(),C.vK,new E.e214(),C.Tc,new E.e215(),C.GR,new E.e216(),C.KX,new E.e217(),C.ja,new E.e218(),C.mn,new E.e219(),C.Dj,new E.e220(),C.ir,new E.e221(),C.dx,new E.e222(),C.ni,new E.e223(),C.X2,new E.e224(),C.F3,new E.e225(),C.UY,new E.e226(),C.Aa,new E.e227(),C.nY,new E.e228(),C.tg,new E.e229(),C.HD,new E.e230(),C.iU,new E.e231(),C.eN,new E.e232(),C.ue,new E.e233(),C.nh,new E.e234(),C.L2,new E.e235(),C.vm,new E.e236(),C.Gs,new E.e237(),C.bE,new E.e238(),C.YD,new E.e239(),C.PX,new E.e240(),C.N8,new E.e241(),C.EA,new E.e242(),C.oW,new E.e243(),C.KC,new E.e244(),C.tf,new E.e245(),C.da,new E.e246(),C.Jd,new E.e247(),C.Y4,new E.e248(),C.Si,new E.e249(),C.pH,new E.e250(),C.Ve,new E.e251(),C.jM,new E.e252(),C.rd,new E.e253(),C.W5,new E.e254(),C.uX,new E.e255(),C.nt,new E.e256(),C.IT,new E.e257(),C.li,new E.e258(),C.PM,new E.e259(),C.ks,new E.e260(),C.Om,new E.e261(),C.iC,new E.e262(),C.Nv,new E.e263(),C.Wo,new E.e264(),C.FZ,new E.e265(),C.TW,new E.e266(),C.xS,new E.e267(),C.pD,new E.e268(),C.QF,new E.e269(),C.mi,new E.e270(),C.zz,new E.e271(),C.eO,new E.e272(),C.hO,new E.e273(),C.ei,new E.e274(),C.HK,new E.e275(),C.je,new E.e276(),C.Ef,new E.e277(),C.QL,new E.e278(),C.RH,new E.e279(),C.SP,new E.e280(),C.Q1,new E.e281(),C.ID,new E.e282(),C.dA,new E.e283(),C.bc,new E.e284(),C.kw,new E.e285(),C.nE,new E.e286(),C.ep,new E.e287(),C.hB,new E.e288(),C.J2,new E.e289(),C.hx,new E.e290(),C.zU,new E.e291(),C.OU,new E.e292(),C.bn,new E.e293(),C.mh,new E.e294(),C.Fh,new E.e295(),C.yv,new E.e296(),C.LP,new E.e297(),C.jh,new E.e298(),C.zd,new E.e299(),C.Db,new E.e300(),C.aF,new E.e301(),C.l4,new E.e302(),C.fj,new E.e303(),C.xw,new E.e304(),C.zn,new E.e305(),C.RJ,new E.e306(),C.Sk,new E.e307(),C.KS,new E.e308(),C.MA,new E.e309(),C.YE,new E.e310(),C.Uy,new E.e311()],null,null)
+y=P.EF([C.aP,new E.e312(),C.cg,new E.e313(),C.Zg,new E.e314(),C.S4,new E.e315(),C.AV,new E.e316(),C.bk,new E.e317(),C.lH,new E.e318(),C.am,new E.e319(),C.oE,new E.e320(),C.kG,new E.e321(),C.Wt,new E.e322(),C.mM,new E.e323(),C.aw,new E.e324(),C.XA,new E.e325(),C.i4,new E.e326(),C.mJ,new E.e327(),C.yL,new E.e328(),C.nr,new E.e329(),C.bJ,new E.e330(),C.kI,new E.e331(),C.vY,new E.e332(),C.yC,new E.e333(),C.VK,new E.e334(),C.aH,new E.e335(),C.GP,new E.e336(),C.vs,new E.e337(),C.Gr,new E.e338(),C.Fe,new E.e339(),C.tP,new E.e340(),C.yh,new E.e341(),C.Zb,new E.e342(),C.p8,new E.e343(),C.ld,new E.e344(),C.ne,new E.e345(),C.B0,new E.e346(),C.mr,new E.e347(),C.YT,new E.e348(),C.cJ,new E.e349(),C.WQ,new E.e350(),C.jU,new E.e351(),C.OO,new E.e352(),C.Mc,new E.e353(),C.QH,new E.e354(),C.rE,new E.e355(),C.nf,new E.e356(),C.ft,new E.e357(),C.Ge,new E.e358(),C.A7,new E.e359(),C.He,new E.e360(),C.oj,new E.e361(),C.d2,new E.e362(),C.uO,new E.e363(),C.fn,new E.e364(),C.yB,new E.e365(),C.Py,new E.e366(),C.uu,new E.e367(),C.qs,new E.e368(),C.rB,new E.e369(),C.z6,new E.e370(),C.hf,new E.e371(),C.uk,new E.e372(),C.Zi,new E.e373(),C.TN,new E.e374(),C.ur,new E.e375(),C.EV,new E.e376(),C.VI,new E.e377(),C.eh,new E.e378(),C.SA,new E.e379(),C.uG,new E.e380(),C.kV,new E.e381(),C.vp,new E.e382(),C.SR,new E.e383(),C.t6,new E.e384(),C.kB,new E.e385(),C.UX,new E.e386(),C.YS,new E.e387(),C.c6,new E.e388(),C.td,new E.e389(),C.zO,new E.e390(),C.Yp,new E.e391(),C.YV,new E.e392(),C.If,new E.e393(),C.Ys,new E.e394(),C.EP,new E.e395(),C.nX,new E.e396(),C.BV,new E.e397(),C.XM,new E.e398(),C.Ic,new E.e399(),C.O9,new E.e400(),C.tW,new E.e401(),C.Wj,new E.e402(),C.vb,new E.e403(),C.QK,new E.e404(),C.Xd,new E.e405(),C.kY,new E.e406(),C.vK,new E.e407(),C.Tc,new E.e408(),C.GR,new E.e409(),C.KX,new E.e410(),C.ja,new E.e411(),C.Dj,new E.e412(),C.X2,new E.e413(),C.UY,new E.e414(),C.Aa,new E.e415(),C.nY,new E.e416(),C.tg,new E.e417(),C.HD,new E.e418(),C.iU,new E.e419(),C.eN,new E.e420(),C.Gs,new E.e421(),C.bE,new E.e422(),C.YD,new E.e423(),C.PX,new E.e424(),C.tf,new E.e425(),C.Jd,new E.e426(),C.pH,new E.e427(),C.Ve,new E.e428(),C.jM,new E.e429(),C.rd,new E.e430(),C.uX,new E.e431(),C.nt,new E.e432(),C.IT,new E.e433(),C.PM,new E.e434(),C.ks,new E.e435(),C.Om,new E.e436(),C.iC,new E.e437(),C.Nv,new E.e438(),C.FZ,new E.e439(),C.TW,new E.e440(),C.pD,new E.e441(),C.mi,new E.e442(),C.zz,new E.e443(),C.dA,new E.e444(),C.kw,new E.e445(),C.nE,new E.e446(),C.hx,new E.e447(),C.zU,new E.e448(),C.OU,new E.e449(),C.zd,new E.e450(),C.RJ,new E.e451(),C.YE,new E.e452()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.XW,C.il,C.kH,C.Mt,C.Lg,C.qJ,C.Bi,C.il,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.uC,C.Mt,C.Wz,C.il,C.Ke,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.IZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.fU,C.Mt,C.pi,C.Mt,C.Fn,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.Mz,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.rC,C.Mt,C.kq,C.Mt,C.Dl,C.Mt,C.Mz,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.R9,C.Mt,C.OZ,C.il,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.tQ,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.Mz,C.al,C.il],null,null)
+y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.aj,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.XW,P.Fl(null,null),C.kH,P.EF([C.nr,C.BO],null,null),C.Lg,P.EF([C.S4,C.aj,C.AV,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Bi,P.Fl(null,null),C.KO,P.EF([C.yh,C.tO],null,null),C.wk,P.EF([C.AV,C.k1,C.eh,C.jO,C.Aa,C.k5,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.aj,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.on],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.P9],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.EF([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.Fl(null,null),C.Ke,P.EF([C.fn,C.Kk],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.xV],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.IZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.hd,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.fU,P.EF([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.EF([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.EF([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.EF([C.uk,C.rY,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Cg],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.rY,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.oh,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.rY],null,null),C.rC,P.EF([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.kq,P.EF([C.td,C.Zk],null,null),C.Dl,P.EF([C.VK,C.lW],null,null),C.Mz,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.Bf,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.Df,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.It,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.bp],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.OZ,P.Fl(null,null),C.il,P.EF([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.iH,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.NS,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.iH,C.rE,C.B7],null,null),C.tQ,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.pD,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.tO,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.Wq,"asStringLiteral",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.Wt,"clazz",C.I9,"closeItem",C.To,"closing",C.mM,"closureCtxt",C.aw,"closureFunc",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.nr,"context",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.hJ,"dartMetrics",C.yC,"declaredType",C.Lw,"deleteVm",C.eR,"deoptimizations",C.LS,"description",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.mw,"elements",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.ft,"guardClass",C.dr,"guardNullable",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Yb,"id",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.XJ,"isAbstractType",C.tJ,"isBool",C.F8,"isChromeTarget",C.fy,"isClosure",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.dR,"isFinal",C.MY,"isInlinable",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.C7,"isMirrorReference",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Iw,"isPlainInstance",C.tz,"isSentinel",C.AT,"isStatic",C.Lk,"isString",C.GS,"isWeakProperty",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.qi,"max",C.pX,"message",C.kB,"metric",C.LH,"metricChanged",C.a2,"min",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.uw,"nativeFields",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Yp,"owner",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.EP,"page",C.nX,"parent",C.BV,"parentContext",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.Tc,"referent",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.mn,"refreshRateChange",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.vm,"sampleBufferSizeChange",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.da,"size",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.pD,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.hB,"type",C.J2,"typeChecksEnabled",C.hx,"typeClass",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.zd,"value",C.Db,"valueAsString",C.aF,"valueAsStringIsTruncated",C.l4,"values",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Sk,"vmMetrics",C.KS,"vmName",C.MA,"vmType",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
 $.j8=new O.fH(y)
 $.Yv=new O.bY(y)
 $.qe=new O.ut(y)
-$.M6=[new E.e444(),new E.e445(),new E.e446(),new E.e447(),new E.e448(),new E.e449(),new E.e450(),new E.e451(),new E.e452(),new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470(),new E.e471(),new E.e472(),new E.e473(),new E.e474(),new E.e475(),new E.e476(),new E.e477(),new E.e478(),new E.e479(),new E.e480(),new E.e481(),new E.e482(),new E.e483(),new E.e484(),new E.e485(),new E.e486(),new E.e487(),new E.e488(),new E.e489(),new E.e490(),new E.e491(),new E.e492(),new E.e493(),new E.e494(),new E.e495(),new E.e496(),new E.e497(),new E.e498(),new E.e499(),new E.e500(),new E.e501(),new E.e502(),new E.e503(),new E.e504(),new E.e505(),new E.e506(),new E.e507(),new E.e508(),new E.e509(),new E.e510(),new E.e511(),new E.e512(),new E.e513(),new E.e514(),new E.e515(),new E.e516(),new E.e517(),new E.e518(),new E.e519(),new E.e520(),new E.e521(),new E.e522(),new E.e523(),new E.e524(),new E.e525(),new E.e526(),new E.e527(),new E.e528(),new E.e529(),new E.e530(),new E.e531(),new E.e532(),new E.e533(),new E.e534()]
+$.M6=[new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470(),new E.e471(),new E.e472(),new E.e473(),new E.e474(),new E.e475(),new E.e476(),new E.e477(),new E.e478(),new E.e479(),new E.e480(),new E.e481(),new E.e482(),new E.e483(),new E.e484(),new E.e485(),new E.e486(),new E.e487(),new E.e488(),new E.e489(),new E.e490(),new E.e491(),new E.e492(),new E.e493(),new E.e494(),new E.e495(),new E.e496(),new E.e497(),new E.e498(),new E.e499(),new E.e500(),new E.e501(),new E.e502(),new E.e503(),new E.e504(),new E.e505(),new E.e506(),new E.e507(),new E.e508(),new E.e509(),new E.e510(),new E.e511(),new E.e512(),new E.e513(),new E.e514(),new E.e515(),new E.e516(),new E.e517(),new E.e518(),new E.e519(),new E.e520(),new E.e521(),new E.e522(),new E.e523(),new E.e524(),new E.e525(),new E.e526(),new E.e527(),new E.e528(),new E.e529(),new E.e530(),new E.e531(),new E.e532(),new E.e533(),new E.e534(),new E.e535(),new E.e536(),new E.e537(),new E.e538(),new E.e539(),new E.e540(),new E.e541(),new E.e542(),new E.e543(),new E.e544(),new E.e545()]
 $.UG=!0
-F.E2()},"$0","jk",0,0,17],
+F.E2()},"$0","V7A",0,0,17],
 em:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jp9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Lb:{
 "^":"TpZ:12;",
@@ -2667,11 +2676,11 @@
 $isEH:true},
 Cv:{
 "^":"TpZ:12;",
-$1:[function(a){return J.r0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 ed:{
 "^":"TpZ:12;",
-$1:[function(a){return J.D8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.H3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wa:{
 "^":"TpZ:12;",
@@ -2683,7 +2692,7 @@
 $isEH:true},
 YL:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqZ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wf:{
 "^":"TpZ:12;",
@@ -2691,7 +2700,7 @@
 $isEH:true},
 Oa:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gQ1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gYZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 emv:{
 "^":"TpZ:12;",
@@ -2699,11 +2708,11 @@
 $isEH:true},
 Lbd:{
 "^":"TpZ:12;",
-$1:[function(a){return J.aA(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.rS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 QAa:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gfj()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gET()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 CvS:{
 "^":"TpZ:12;",
@@ -2711,11 +2720,11 @@
 $isEH:true},
 edy:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gkV()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gbZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 waE:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Wp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.XB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Ore:{
 "^":"TpZ:12;",
@@ -2723,23 +2732,23 @@
 $isEH:true},
 YLa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.K0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.rp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wfa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.hn(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Oaa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e0:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ze(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e1:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yz(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e2:{
 "^":"TpZ:12;",
@@ -2751,11 +2760,11 @@
 $isEH:true},
 e4:{
 "^":"TpZ:12;",
-$1:[function(a){return J.RC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.us(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e5:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gaP()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gmy()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e6:{
 "^":"TpZ:12;",
@@ -2767,15 +2776,15 @@
 $isEH:true},
 e8:{
 "^":"TpZ:12;",
-$1:[function(a){return J.E3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e9:{
 "^":"TpZ:12;",
-$1:[function(a){return J.on(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.tX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e10:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e11:{
 "^":"TpZ:12;",
@@ -2787,7 +2796,7 @@
 $isEH:true},
 e13:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dw(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ad(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e14:{
 "^":"TpZ:12;",
@@ -2803,11 +2812,11 @@
 $isEH:true},
 e17:{
 "^":"TpZ:12;",
-$1:[function(a){return J.OT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.xk(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e18:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Okq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e19:{
 "^":"TpZ:12;",
@@ -2819,7 +2828,7 @@
 $isEH:true},
 e21:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e22:{
 "^":"TpZ:12;",
@@ -2831,2053 +2840,2097 @@
 $isEH:true},
 e24:{
 "^":"TpZ:12;",
-$1:[function(a){return J.TG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gOF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e25:{
 "^":"TpZ:12;",
-$1:[function(a){return a.guh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.TG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e26:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gGB()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gOs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e27:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gQZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e28:{
 "^":"TpZ:12;",
-$1:[function(a){return a.guH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e29:{
 "^":"TpZ:12;",
-$1:[function(a){return J.GF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.guH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e30:{
 "^":"TpZ:12;",
-$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.CNb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e31:{
 "^":"TpZ:12;",
-$1:[function(a){return J.H2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e32:{
 "^":"TpZ:12;",
-$1:[function(a){return J.y3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Nx(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e33:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hg(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.y3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e34:{
 "^":"TpZ:12;",
-$1:[function(a){return J.k0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.BB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e35:{
 "^":"TpZ:12;",
-$1:[function(a){return J.rw(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.k0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e36:{
 "^":"TpZ:12;",
-$1:[function(a){return J.wt(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e37:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gej()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.MV(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e38:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gw2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gej()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e39:{
 "^":"TpZ:12;",
-$1:[function(a){return J.w8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gw2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e40:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ht(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.w8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e41:{
 "^":"TpZ:12;",
-$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ht(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e42:{
 "^":"TpZ:12;",
-$1:[function(a){return J.a3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.nEe(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e43:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.qf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e44:{
 "^":"TpZ:12;",
-$1:[function(a){return J.um(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iiZ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e45:{
 "^":"TpZ:12;",
-$1:[function(a){return J.io(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.um(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e46:{
 "^":"TpZ:12;",
-$1:[function(a){return J.UE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.io(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e47:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.UE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e48:{
 "^":"TpZ:12;",
-$1:[function(a){return J.IL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ak(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e49:{
 "^":"TpZ:12;",
-$1:[function(a){return J.nb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.IL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e50:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gty()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ur(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e51:{
 "^":"TpZ:12;",
-$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.grm()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e52:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gMX()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ua(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e53:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gMX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e54:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gq2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e55:{
 "^":"TpZ:12;",
-$1:[function(a){return J.pm(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.E1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e56:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gtJ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Nb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e57:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gtJ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e58:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PK(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.vE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e59:{
 "^":"TpZ:12;",
-$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.tdY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e60:{
 "^":"TpZ:12;",
-$1:[function(a){return J.WX(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.AU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e61:{
 "^":"TpZ:12;",
-$1:[function(a){return J.IP(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.WX7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e62:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gZd()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.IP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e63:{
 "^":"TpZ:12;",
-$1:[function(a){return J.TM(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gZd()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e64:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xo(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.TM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e65:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gkA()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Oi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e66:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gGK()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gqE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e67:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gan()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gAX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e68:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gcQ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gan()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e69:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gS7()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gcQ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e70:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gmE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gS7()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e71:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gP3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e72:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bu(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e73:{
 "^":"TpZ:12;",
-$1:[function(a){return J.eU(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bu(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e74:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e75:{
 "^":"TpZ:12;",
-$1:[function(a){return J.m4(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e76:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gmu()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.m4(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e77:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gCO()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gmu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e78:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gCO()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e79:{
 "^":"TpZ:12;",
-$1:[function(a){return J.tw(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e80:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.i2U(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e81:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gX1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e82:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUa()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e83:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gMp()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gRl()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e84:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Er(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.ghR()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e85:{
 "^":"TpZ:12;",
-$1:[function(a){return J.OB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUa()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e86:{
 "^":"TpZ:12;",
-$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gMp()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e87:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Er(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e88:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gc1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e89:{
 "^":"TpZ:12;",
-$1:[function(a){return J.aW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e90:{
 "^":"TpZ:12;",
-$1:[function(a){return J.aB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e91:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gu0()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gc1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e92:{
 "^":"TpZ:12;",
-$1:[function(a){return J.eS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.aW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e93:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gaj()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.hW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e94:{
 "^":"TpZ:12;",
-$1:[function(a){return a.giq()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gu0()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e95:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gBm()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.eS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e96:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gaj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e97:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fh(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.giq()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e98:{
 "^":"TpZ:12;",
-$1:[function(a){return J.NDJ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gBm()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e99:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gNI()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e100:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gva()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e101:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gKt()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.US(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e102:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gp2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gtI()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e103:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ns(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gva()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e104:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gKt()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e105:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gVM()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gp2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e106:{
 "^":"TpZ:12;",
-$1:[function(a){return a.glO()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ns(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e107:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gFY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e108:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gVM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e109:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gBF()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.glO()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e110:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUB()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gFY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e111:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gRs()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ho(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e112:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ix(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gBF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e113:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gMA()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e114:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqy()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gRh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e115:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzx()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ls(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e116:{
 "^":"TpZ:12;",
-$1:[function(a){return J.FN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gMA()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e117:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gt3()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gqy()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e118:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gho()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gzx()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e119:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gWL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.FN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e120:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gt3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e121:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Z6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e122:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gJE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gxL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e123:{
 "^":"TpZ:12;",
-$1:[function(a){return J.pO(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSO()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e124:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gHh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e125:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gW1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e126:{
 "^":"TpZ:12;",
-$1:[function(a){return a.goF()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gOC()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e127:{
 "^":"TpZ:12;",
-$1:[function(a){return a.geh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.pO(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e128:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gHY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gHh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e129:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXM()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gW1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e130:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gl5()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.goF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e131:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gFo()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.geh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e132:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gu7()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gHY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e133:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gl2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gXM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e134:{
 "^":"TpZ:12;",
-$1:[function(a){return J.aT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gl5()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e135:{
 "^":"TpZ:12;",
-$1:[function(a){return J.KG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gFo()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e136:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gi2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gu7()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e137:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gEB()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gl2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e138:{
 "^":"TpZ:12;",
-$1:[function(a){return J.AW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.wg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e139:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e140:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gi2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e141:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Yq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gnp()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e142:{
 "^":"TpZ:12;",
-$1:[function(a){return J.MQ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.AW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e143:{
 "^":"TpZ:12;",
-$1:[function(a){return J.X7(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iYM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e144:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kj(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e145:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gJW()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ZC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e146:{
 "^":"TpZ:12;",
-$1:[function(a){return J.q8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.OH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e147:{
 "^":"TpZ:12;",
-$1:[function(a){return a.ghX()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.X7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e148:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvU()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e149:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gJW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e150:{
 "^":"TpZ:12;",
-$1:[function(a){return J.f2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.q8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e151:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gcI()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e152:{
 "^":"TpZ:12;",
-$1:[function(a){return J.de(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gpd()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e153:{
 "^":"TpZ:12;",
-$1:[function(a){return J.t0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ik(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e154:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.f2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e155:{
 "^":"TpZ:12;",
-$1:[function(a){return J.cO(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e156:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzM()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.de(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e157:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gn0()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.t0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e158:{
 "^":"TpZ:12;",
-$1:[function(a){return a.giP()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e159:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gfJ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.cO(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e160:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gIT()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gzM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e161:{
 "^":"TpZ:12;",
-$1:[function(a){return J.c7(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gn0()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e162:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.giP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e163:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ol(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gbB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e164:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Y7(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gIT()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e165:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PR(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.HS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e166:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e167:{
 "^":"TpZ:12;",
-$1:[function(a){return J.qx(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e168:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dj(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e169:{
 "^":"TpZ:12;",
-$1:[function(a){return J.GL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e170:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e171:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.qx(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e172:{
 "^":"TpZ:12;",
-$1:[function(a){return J.X6(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e173:{
 "^":"TpZ:12;",
-$1:[function(a){return J.DA(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LY4(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e174:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e175:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gbA()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e176:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Zv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e177:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvK()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.DA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e178:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e179:{
 "^":"TpZ:12;",
-$1:[function(a){return J.t8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gDm()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e180:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gL1()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e181:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gxQ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gvK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e182:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gEl()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.mk(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e183:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gxH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.t8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e184:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gL1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e185:{
 "^":"TpZ:12;",
-$1:[function(a){return J.mF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gxQ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e186:{
 "^":"TpZ:12;",
-$1:[function(a){return J.MT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gXP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e187:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gP2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e188:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gxH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e189:{
 "^":"TpZ:12;",
-$1:[function(a){return J.eb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.qN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e190:{
 "^":"TpZ:12;",
-$1:[function(a){return J.AF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.mF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e191:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fi(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.MT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e192:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e193:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gU6()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gqH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e194:{
 "^":"TpZ:12;",
-$1:[function(a){return J.cj(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.eb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e195:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Tm(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.AF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e196:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Yd(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e197:{
 "^":"TpZ:12;",
-$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e198:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gj9()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gU6()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e199:{
 "^":"TpZ:12;",
-$1:[function(a){return J.JX(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.cj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e200:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.os(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e201:{
 "^":"TpZ:12;",
-$1:[function(a){return J.CN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e202:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.xlH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e203:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ul(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gj9()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e204:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUx()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.JX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e205:{
 "^":"TpZ:12;",
-$1:[function(a){return J.id(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Zl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e206:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gm8()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Q0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e207:{
 "^":"TpZ:12;",
-$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.u5(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e208:{
 "^":"TpZ:12;",
-$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ul(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e209:{
 "^":"TpZ:12;",
-$1:[function(a){return a.ghL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gUx()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e210:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gCM()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ks(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e211:{
 "^":"TpZ:12;",
-$1:[function(a){return J.At(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gm8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e212:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dZ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e213:{
 "^":"TpZ:12;",
-$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.xi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e214:{
 "^":"TpZ:12;",
-$1:[function(a){return J.up(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.ghL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e215:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gCM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e216:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gua()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.At(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e217:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gNS()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ph(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e218:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzK()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Xp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e219:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.up(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e220:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LM(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.n8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e221:{
 "^":"TpZ:12;",
-$1:[function(a){return J.uW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gua()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e222:{
 "^":"TpZ:12;",
-$1:[function(a){return J.W2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gNS()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e223:{
 "^":"TpZ:12;",
-$1:[function(a){return J.UT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gzK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e224:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kd(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e225:{
 "^":"TpZ:12;",
-$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e226:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ma(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e227:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gVc()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.W2H(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e228:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gpF()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.nl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e229:{
 "^":"TpZ:12;",
-$1:[function(a){return J.TY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.I1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e230:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gGL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e231:{
 "^":"TpZ:12;",
-$1:[function(a){return J.X9(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e232:{
 "^":"TpZ:12;",
-$1:[function(a){return J.nv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gVc()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e233:{
 "^":"TpZ:12;",
-$1:[function(a){return J.UP(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.geH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e234:{
 "^":"TpZ:12;",
-$1:[function(a){return J.UA(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.x3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e235:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gLd()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e236:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e237:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXR()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.nv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e238:{
 "^":"TpZ:12;",
-$1:[function(a){return J.uN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Fi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e239:{
 "^":"TpZ:12;",
-$1:[function(a){return J.le(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zD(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e240:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bh(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fx(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e241:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Y5(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e242:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ue(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gXR()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e243:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.P5(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e244:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dK(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e245:{
 "^":"TpZ:12;",
-$1:[function(a){return J.U8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.wS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e246:{
 "^":"TpZ:12;",
-$1:[function(a){return J.oN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e247:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gip()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e248:{
 "^":"TpZ:12;",
-$1:[function(a){return J.M2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e249:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gp8()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.be(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e250:{
 "^":"TpZ:12;",
-$1:[function(a){return J.F9(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Cr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e251:{
 "^":"TpZ:12;",
-$1:[function(a){return J.HB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.oN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e252:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fM(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gV8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e253:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ay(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e254:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gp8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e255:{
 "^":"TpZ:12;",
-$1:[function(a){return J.lA(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.F9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e256:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.HB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e257:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e258:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gDo()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e259:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gLT()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e260:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gAY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ff(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e261:{
 "^":"TpZ:12;",
-$1:[function(a){return J.j1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e262:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e263:{
 "^":"TpZ:12;",
-$1:[function(a){return J.l2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gDo()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e264:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gm2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gup()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e265:{
 "^":"TpZ:12;",
-$1:[function(a){return J.dY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gAY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e266:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Xa(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e267:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Xr(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e268:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzg()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.l2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e269:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gZn()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gm2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e270:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvs()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e271:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gVh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e272:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gZX()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Dc(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e273:{
 "^":"TpZ:12;",
-$1:[function(a){return J.PS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e274:{
 "^":"TpZ:12;",
-$1:[function(a){return J.As(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gZn()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e275:{
 "^":"TpZ:12;",
-$1:[function(a){return J.YG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gmj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e276:{
 "^":"TpZ:12;",
-$1:[function(a){return J.SG(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gVh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e277:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gZX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e278:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gVF()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ug(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e279:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gkw()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.d5(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e280:{
 "^":"TpZ:12;",
-$1:[function(a){return J.K2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.SS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e281:{
 "^":"TpZ:12;",
-$1:[function(a){return J.eK(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.SG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e282:{
 "^":"TpZ:12;",
-$1:[function(a){return J.uy(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e283:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gVF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e284:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gdW()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gkw()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e285:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gCY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e286:{
 "^":"TpZ:12;",
-$1:[function(a){return J.un(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e287:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gjW()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.uy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e288:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e289:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gI2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gdW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e290:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gQR()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e291:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSu()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Gt(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e292:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSU()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gjW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e293:{
 "^":"TpZ:12;",
-$1:[function(a){return a.ghW()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e294:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gI2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e295:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gPE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e296:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSS()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e297:{
 "^":"TpZ:12;",
-$1:[function(a){return J.hI(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e298:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gYY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gFc()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e299:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gZ3()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e300:{
 "^":"TpZ:12;",
-$1:[function(a){return J.NV(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gPE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e301:{
 "^":"TpZ:12;",
-$1:[function(a){return J.wp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gSS()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e302:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSn()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.hI(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e303:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gTE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gYY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e304:{
 "^":"TpZ:12;",
-$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gZ3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e305:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gaU()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e306:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return J.wp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e307:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gSn()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e308:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gzz()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e309:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gdr()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e310:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Fv(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e311:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,63,66,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gSY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e312:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e313:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e314:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e315:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e316:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sUP(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Fv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e317:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.su5(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e318:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.swz(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.m8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e319:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e320:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e321:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Kw(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e322:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sUP(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e323:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Hf(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.su5(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e324:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.swz(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e325:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e326:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e327:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Nh(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e328:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e329:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Xu(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Hf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e330:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e331:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e332:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.U8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e333:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sOF(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e334:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e335:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e336:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Xu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e337:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e338:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.AE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e339:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e340:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e341:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e342:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e343:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e344:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.fR(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e345:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.MI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e346:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e347:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e348:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e349:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e350:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e351:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.fR(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e352:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.UU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e353:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e354:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e355:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e356:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e357:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sSE(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e358:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e359:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e360:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e361:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e362:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Bj(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e363:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e364:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e365:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e366:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e367:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e368:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e369:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e370:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Bj(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e371:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e372:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e373:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e374:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e375:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.scI(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e376:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e377:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.rA(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e378:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.o3(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e379:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e380:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e381:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e382:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e383:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e384:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e385:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.rA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e386:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.b0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.oJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e387:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e388:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sqH(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e389:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e390:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e391:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sXP(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e392:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sP2(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e393:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e394:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e395:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.b0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e396:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e397:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sqH(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e398:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e399:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sCM(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e400:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e401:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.tv(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e402:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e403:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e404:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e405:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.jy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e406:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e407:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Eo(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e408:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sCM(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e409:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e410:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.tv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e411:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Co(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e412:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e413:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e414:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e415:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e416:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.G7(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Eo(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e417:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.pq(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e418:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e419:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e420:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sip(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e421:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e422:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e423:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Hn(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Rx(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e424:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e425:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.G7(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e426:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.lF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e427:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.jq(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e428:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e429:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sV8(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e430:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e431:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e432:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e433:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e434:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e435:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e436:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.yO(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.jq(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e437:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.cS(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e438:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sCY(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e439:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e440:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.ix(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e441:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Fc(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e442:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.NH(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e443:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e444:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e445:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("observatory-element",C.Mz)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.yO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e446:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e447:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){a.sQR(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e448:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e449:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e450:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.Fc(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e451:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.NH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e452:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"TpZ:81;",
+$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e453:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e454:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("observatory-element",C.Mz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e455:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e456:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e457:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("object-ref",C.OZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e458:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e459:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e460:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e461:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e462:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e463:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e464:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("error-ref",C.Bi)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e465:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e466:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e467:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e468:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e469:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e470:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e471:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e472:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e473:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e474:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("error-ref",C.Bi)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e475:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e476:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e477:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e478:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e479:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e480:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e481:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e482:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e483:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e484:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e485:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e486:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e487:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e488:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e489:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e490:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e491:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-list-view",C.IZ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e492:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e493:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e494:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e495:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e496:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e497:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e498:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e499:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e500:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e501:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-list-view",C.IZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e502:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e503:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e504:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e505:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e506:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e507:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e508:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e509:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e510:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("object-common",C.rC)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e511:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("context-ref",C.XW)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e512:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("instance-view",C.Ke)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e513:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e514:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e515:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("metrics-page",C.Fn)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e516:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("metric-details",C.fU)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e517:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("metrics-graph",C.pi)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e518:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("context-view",C.kH)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e519:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e520:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("object-common",C.rC)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e521:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("context-ref",C.XW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e522:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("instance-view",C.Ke)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e523:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("stack-trace",C.tQ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e524:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e525:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("metrics-page",C.Fn)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e526:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("metric-details",C.fU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e527:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("metrics-graph",C.pi)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e528:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("object-view",C.kq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e529:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("context-view",C.kH)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e530:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e531:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e532:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e533:{
 "^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e534:{
 "^":"TpZ:76;",
+$0:[function(){return A.Ad("stack-trace",C.tQ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e535:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e536:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e537:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e538:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e539:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e540:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e541:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e542:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e543:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e544:{
+"^":"TpZ:76;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e545:{
+"^":"TpZ:76;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
 $isEH:true}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"Vfx;BW,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gjD:function(a){return a.BW},
-sjD:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
+"^":"Vfx;BW,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+grs:function(a){return a.BW},
+srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
 pA:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,19,102],
 static:{KU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -4885,58 +4938,58 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.C8.LX(a)
-C.C8.XI(a)
+C.QD.LX(a)
+C.QD.XI(a)
 return a}}},
 Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{rt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.i3.LX(a)
-C.i3.XI(a)
+C.YZz.LX(a)
+C.YZz.XI(a)
 return a}}}}],["","",,O,{
 "^":"",
-CZ:{
-"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
+TY:{
+"^":"Y2;od>,Ru>,eT,yt,qu,oH,PU,aZ,Lk,Vg,ij",
 Pz:function(a){var z,y,x,w,v,u,t
-z=this.ks
+z=this.qu
 if(z.length>0)return
-for(y=this.Ru.gLT(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.Ff
+for(y=this.Ru.gup(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.lo
 if(v.geh()===!0)continue
 u=[]
 u.$builtinTypeInfo=[G.Y2]
-t=new O.CZ(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
+t=new O.TY(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 this.Ru.gLT().XG.length>0}},
+aY:function(){},
+Nh:function(){return this.Ru.gup().xN.length>0}},
 eo:{
-"^":"tuj;CA,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"tuj;CA,Hm=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.CA},
 sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
 Es:function(a){var z
@@ -4945,46 +4998,46 @@
 a.Hm=new G.ih(z,null,null)
 z=a.CA
 if(z!=null)this.hP(a,z.gDZ())},
-vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
+vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","grV",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
-u=new O.CZ(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
+u=new O.TY(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
 u.k7(null)
 z=u
-w=J.Mx(z)
+w=J.dd(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=new O.TY(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
 s.k7(t)
 w.push(s)
-a.Hm.G7(z)}catch(q){w=H.Ru(q)
+a.Hm.rT(z)}catch(q){w=H.Ru(q)
 y=w
 x=new H.oP(q,null)
-N.QM("").r0("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
+N.QM("").OW("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
 Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
-ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+ZZ:[function(a,b){return C.Jp[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
 wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.IO(z)
+v=J.JC(z)
 if(typeof v!=="number")return v.W()
-w.lo(v-1)}catch(u){w=H.Ru(u)
+w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+N.QM("").OW("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
 static:{l0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5003,27 +5056,27 @@
 $isEH:true}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"Vct;Wf,ef,QI,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Vct;Wf,ef,QI,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRu:function(a){return a.Wf},
 sRu:function(a,b){a.Wf=this.ct(a,C.XA,a.Wf,b)},
 gWt:function(a){return a.ef},
 sWt:function(a,b){a.ef=this.ct(a,C.yB,a.ef,b)},
 gCF:function(a){return a.QI},
 sCF:function(a,b){a.QI=this.ct(a,C.tg,a.QI,b)},
-vV:[function(a,b){return a.Wf.cv("eval?expr="+P.jW(C.Fa,b,C.xM,!1))},"$1","gZ2",2,0,109,110],
-Be:[function(a,b){return a.Wf.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,111,112],
-zs:[function(a,b){return a.Wf.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,111,113],
+vV:[function(a,b){return a.Wf.cv("eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+Be:[function(a,b){return a.Wf.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gPe",2,0,111,112],
+Cq:[function(a,b){return a.Wf.cv("retained").ml(new Z.Rc(a))},"$1","ghN",2,0,111,113],
 pA:[function(a,b){a.ef=this.ct(a,C.yB,a.ef,null)
 a.QI=this.ct(a,C.tg,a.QI,null)
 J.LE(a.Wf).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
-static:{TH:function(a){var z,y,x,w
+Da:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
+static:{zB:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5039,29 +5092,29 @@
 Ob:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.ef=J.NB(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
+z.ef=J.Q5(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-SS:{
+Rc:{
 "^":"TpZ:115;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(a.gPE(),null,null)
-z.QI=J.NB(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
+z.QI=J.Q5(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true}}],["","",,O,{
 "^":"",
 VY:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtT:function(a){return a.tY},
 Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
+this.ct(a,C.i4,0,1)},"$1","gBj",2,0,12,59],
 static:{E3U:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5073,14 +5126,14 @@
 return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"D13;Xx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"D13;Xx,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.fS())},
+J.SK(z).ml(new F.Jr())},
 pA:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,19,102],
 lE:function(a,b){var z,y,x
 z=J.Vs(b).dA.getAttribute("data-jump-target")
@@ -5095,13 +5148,13 @@
 QT:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
 J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,116,2,106,107],
-static:{fm:function(a){var z,y,x,w
+static:{FeK:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5114,17 +5167,17 @@
 D13:{
 "^":"uL+Pi;",
 $isd3:true},
-fS:{
+Jr:{
 "^":"TpZ:117;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,85,"call"],
+$1:[function(a){a.QW()},"$1",null,2,0,null,85,"call"],
 $isEH:true}}],["","",,T,{
 "^":"",
 uV:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new T.zG(a)).wM(c)
-else{J.Z6(z,null)
+if(b===!0)J.LE(z).ml(new T.WW(a)).wM(c)
+else{z.sZ3(null)
 c.$0()}},"$2","gus",4,0,118,119,120],
 static:{CvM:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -5132,8 +5185,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5143,7 +5196,7 @@
 C.vS.LX(a)
 C.vS.XI(a)
 return a}}},
-zG:{
+WW:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
@@ -5153,17 +5206,17 @@
 $isEH:true}}],["","",,U,{
 "^":"",
 NY:{
-"^":"WZq;AE,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"WZq;AE,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 geo:function(a){return a.AE},
 seo:function(a,b){a.AE=this.ct(a,C.nr,a.AE,b)},
 pA:[function(a,b){J.LE(a.AE).wM(b)},"$1","gvC",2,0,122,120],
-static:{q5n:function(a){var z,y,x,w
+static:{ui:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5178,9 +5231,9 @@
 $isd3:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;tH,uo,nx,oM,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-goE:function(a){return a.tH},
-soE:function(a,b){a.tH=this.ct(a,C.mr,a.tH,b)},
+"^":"SaM;GV,uo,nx,oM,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+goE:function(a){return a.GV},
+soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
 gO9:function(a){return a.uo},
 sO9:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
 gFR:function(a){return a.nx},
@@ -5190,26 +5243,26 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 tn:[function(a,b){var z=a.oM
-a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,19,59],
-Db:[function(a){var z=a.tH
-a.tH=this.ct(a,C.mr,z,z!==!0)
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,19,59],
+WM:[function(a){var z=a.GV
+a.GV=this.ct(a,C.mr,z,z!==!0)
 a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","goJ",0,0,17],
 AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
-this.AV(a,a.tH!==!0,this.goJ(a))}else{z=a.tH
-a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,49,50,85],
+this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,49,50,85],
 static:{U9:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.tH=!1
+a.GV=!1
 a.uo=!1
 a.nx=null
 a.oM=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5223,7 +5276,7 @@
 "^":"xc+Pi;",
 $isd3:true}}],["","",,H,{
 "^":"",
-DU:function(){return new P.lj("No element")},
+Wp: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)
@@ -5233,8 +5286,7 @@
 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()
+EHn:function(a,b,c){var z,y
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
@@ -5351,9 +5403,9 @@
 for(;y<z;++y){b.$1(this.Zv(0,y))
 if(z!==this.gB(this))throw H.b(P.a4(this))}},
 gl0:function(a){return J.xC(this.gB(this),0)},
-gqG:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
+gtH:function(a){if(J.xC(this.gB(this),0))throw H.b(H.Wp())
 return this.Zv(0,0)},
-grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
+grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.Wp())
 return this.Zv(0,J.bI(this.gB(this),1))},
 tg:function(a,b){var z,y
 z=this.gB(this)
@@ -5379,14 +5431,16 @@
 for(;v<z;++v){w.IN+=b
 u=this.Zv(0,v)
 w.IN+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}else{w=P.p9("")
+if(z!==this.gB(this))throw H.b(P.a4(this))}y=w.IN
+return y.charCodeAt(0)==0?y:y}else{w=P.p9("")
 if(typeof z!=="number")return H.s(z)
 v=0
 for(;v<z;++v){u=this.Zv(0,v)
 w.IN+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}},
+if(z!==this.gB(this))throw H.b(P.a4(this))}y=w.IN
+return y.charCodeAt(0)==0?y:y}},
 ad:function(a,b){return P.mW.prototype.ad.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5409,8 +5463,8 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y,x
-z=P.Ls(null,null,null,H.W8(this,"aL",0))
+Oe:function(a){var z,y,x
+z=P.fM(null,null,null,H.W8(this,"aL",0))
 y=0
 while(!0){x=this.gB(this)
 if(typeof x!=="number")return H.s(x)
@@ -5418,44 +5472,44 @@
 z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
-"^":"aL;Hb,ay,Hx",
+"^":"aL;Hb,bS,Hx",
 gUD:function(){var z,y
 z=J.q8(this.Hb)
 y=this.Hx
 if(y==null||J.xZ(y,z))return z
 return y},
-gdM:function(){var z,y
+gAs:function(){var z,y
 z=J.q8(this.Hb)
-y=this.ay
+y=this.bS
 if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
 z=J.q8(this.Hb)
-y=this.ay
+y=this.bS
 if(J.J5(y,z))return 0
 x=this.Hx
 if(x==null||J.J5(x,z))return J.bI(z,y)
 return J.bI(x,y)},
-Zv:function(a,b){var z=J.WB(this.gdM(),b)
+Zv:function(a,b){var z=J.WB(this.gAs(),b)
 if(J.u6(b,0)||J.J5(z,this.gUD()))throw H.b(P.TE(b,0,this.gB(this)))
 return J.i9(this.Hb,z)},
 eR:function(a,b){var z,y
 if(J.u6(b,0))throw H.b(P.N(b))
-z=J.WB(this.ay,b)
+z=J.WB(this.bS,b)
 y=this.Hx
 if(y!=null&&J.J5(z,y)){y=new H.MB()
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y}return H.c1(this.Hb,z,y,H.u3(this,0))},
-rh:function(a,b){var z,y,x
+qZ:function(a,b){var z,y,x
 if(b<0)throw H.b(P.N(b))
 z=this.Hx
-y=this.ay
+y=this.bS
 if(z==null)return H.c1(this.Hb,y,J.WB(y,b),H.u3(this,0))
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
 return H.c1(this.Hb,y,x,H.u3(this,0))}},
 Hd:function(a,b,c,d){var z,y,x
-z=this.ay
+z=this.bS
 y=J.Wx(z)
 if(y.C(z,0))throw H.b(P.N(z))
 x=this.Hx
@@ -5465,17 +5519,17 @@
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
-"^":"a;Hb,bd,QX,Ff",
-gl:function(){return this.Ff},
+"^":"a;Hb,SW,QX,lo",
+gl:function(){return this.lo},
 G:function(){var z,y,x,w
 z=this.Hb
 y=J.U6(z)
 x=y.gB(z)
-if(!J.xC(this.bd,x))throw H.b(P.a4(z))
+if(!J.xC(this.SW,x))throw H.b(P.a4(z))
 w=this.QX
 if(typeof x!=="number")return H.s(x)
-if(w>=x){this.Ff=null
-return!1}this.Ff=y.Zv(z,w);++this.QX
+if(w>=x){this.lo=null
+return!1}this.lo=y.Zv(z,w);++this.QX
 return!0}},
 i1:{
 "^":"mW;Hb,Oh",
@@ -5485,8 +5539,8 @@
 return z},
 gB:function(a){return J.q8(this.Hb)},
 gl0:function(a){return J.FN(this.Hb)},
-gqG:function(a){return this.Mi(J.bT(this.Hb))},
-grZ:function(a){return this.Mi(J.MQ(this.Hb))},
+gtH:function(a){return this.Mi(J.Es(this.Hb))},
+grZ:function(a){return this.Mi(J.OH(this.Hb))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
@@ -5495,13 +5549,13 @@
 "^":"i1;Hb,Oh",
 $isyN:true},
 MH:{
-"^":"Anv;Ff,CL,Oh",
+"^":"Anv;lo,CL,Oh",
 Mi:function(a){return this.Oh.$1(a)},
 G:function(){var z=this.CL
-if(z.G()){this.Ff=this.Mi(z.gl())
-return!0}this.Ff=null
+if(z.G()){this.lo=this.Mi(z.gl())
+return!0}this.lo=null
 return!1},
-gl:function(){return this.Ff},
+gl:function(){return this.lo},
 $asAnv:function(a,b){return[b]}},
 A8:{
 "^":"aL;ON,Oh",
@@ -5514,47 +5568,47 @@
 $isyN:true},
 U5:{
 "^":"mW;Hb,Oh",
-gA:function(a){var z=new H.vG(J.mY(this.Hb),this.Oh)
+gA:function(a){var z=new H.Mo(J.mY(this.Hb),this.Oh)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-vG:{
+Mo:{
 "^":"Anv;CL,Oh",
 Mi:function(a){return this.Oh.$1(a)},
 G:function(){for(var z=this.CL;z.G();)if(this.Mi(z.gl())===!0)return!0
 return!1},
 gl:function(){return this.CL.gl()}},
-oA:{
+Fm:{
 "^":"mW;Hb,Oh",
-gA:function(a){var z=new H.yY(J.mY(this.Hb),this.Oh,C.MS,null)
+gA:function(a){var z=new H.P8(J.mY(this.Hb),this.Oh,C.MS,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]}},
-yY:{
-"^":"a;CL,Oh,Br,Ff",
+P8:{
+"^":"a;CL,Oh,Qc,lo",
 Mi:function(a){return this.Oh.$1(a)},
-gl:function(){return this.Ff},
+gl:function(){return this.lo},
 G:function(){var z,y
-z=this.Br
+z=this.Qc
 if(z==null)return!1
-for(y=this.CL;!z.G();){this.Ff=null
-if(y.G()){this.Br=null
+for(y=this.CL;!z.G();){this.lo=null
+if(y.G()){this.Qc=null
 z=J.mY(this.Mi(y.gl()))
-this.Br=z}else return!1}this.Ff=this.Br.gl()
+this.Qc=z}else return!1}this.lo=this.Qc.gl()
 return!0}},
 AM:{
 "^":"mW;Hb,u3",
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
-return H.ke(this.Hb,this.u3+b,H.u3(this,0))},
+return H.p6(this.Hb,this.u3+b,H.u3(this,0))},
 gA:function(a){var z=this.Hb
-z=new H.b2(z.gA(z),this.u3)
+z=new H.Lh(z.gA(z),this.u3)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 jb:function(a,b,c){if(this.u3<0)throw H.b(P.KP(this.u3))},
-static:{ke:function(a,b,c){var z
+static:{p6:function(a,b,c){var z
 if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
 z.jb(a,b,c)
-return z}return H.GJ(a,b,c)},GJ:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
+return z}return H.Xn(a,b,c)},Xn:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
 z.jb(a,b,c)
 return z}}},
 wB:{
@@ -5565,7 +5619,7 @@
 if(J.J5(y,0))return y
 return 0},
 $isyN:true},
-b2:{
+Lh:{
 "^":"Anv;CL,u3",
 G:function(){var z,y
 for(z=this.CL,y=0;y<this.u3;++y)z.G()
@@ -5578,13 +5632,13 @@
 aN:function(a,b){},
 gl0:function(a){return!0},
 gB:function(a){return 0},
-gqG:function(a){throw H.b(H.DU())},
-grZ:function(a){throw H.b(H.DU())},
+gtH:function(a){throw H.b(H.Wp())},
+grZ:function(a){throw H.b(H.Wp())},
 tg:function(a,b){return!1},
 Vr:function(a,b){return!1},
 zV:function(a,b){return""},
 ad:function(a,b){return this},
-ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
+ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
 return this},
 tt:function(a,b){var z
@@ -5593,19 +5647,19 @@
 z.fixed$length=init
 z=H.VM(z,[H.u3(this,0)])}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){return P.Ls(null,null,null,H.u3(this,0))},
+Oe:function(a){return P.fM(null,null,null,H.u3(this,0))},
 $isyN:true},
 FuS:{
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
-wb:{
+TNQ:{
 "^":"a;",
 static:{bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.Ff)},Ck:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.Ff)===!0)return!0
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.lo)},Ck:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
 return!1},n3:function(a,b,c){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.Ff)
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.lo)
 return b},DQ:function(a,b){var z,y,x,w,v
 z=[]
 y=a.length
@@ -5616,14 +5670,14 @@
 if(y!==x)throw H.b(P.a4(a))}x=z.length
 if(x===y)return
 C.Nm.sB(a,x)
-for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},FU:function(a,b,c){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
-if(b.$1(y)===!0)return y}throw H.b(H.DU())},ig:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},xF:function(a,b,c){var z=J.Wx(b)
+for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},Sz:function(a,b,c){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
+if(b.$1(y)===!0)return y}throw H.b(H.Wp())},ig:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},K0:function(a,b,c){var z=J.Wx(b)
 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)
+H.K0(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))
@@ -5652,20 +5706,20 @@
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+aP:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 uk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 oq:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-JJ:{
+ReL:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
 Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+aP:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
@@ -5682,7 +5736,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+JJ;",
+"^":"ark+ReL;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5729,10 +5783,10 @@
 z=H.KT(z,[z,z]).Zg(a)
 if(z)return b.O8(a)
 else return b.cR(a)},
-DJ:function(a,b){var z=P.Dt(b)
-P.cH(C.ny,new P.w4(a,z))
+nd:function(a,b){var z=P.Dt(b)
+P.cH(C.ny,new P.Sv(a,z))
 return z},
-Ne:function(a,b){var z,y,x,w,v
+hz:function(a,b){var z,y,x,w,v
 z={}
 z.a=null
 z.b=null
@@ -5740,7 +5794,7 @@
 z.d=null
 z.e=null
 y=new P.j7(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.Ff.Rx(new P.Tw(z,b,z.c++),y)
+for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
 y=z.c
 if(y===0)return P.Ab(C.xD,null)
 w=Array(y)
@@ -5779,31 +5833,31 @@
 $.X3.hk(y,x)}},
 QEz:[function(a){},"$1","yy",2,0,19,20],
 Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,21,22,23,24],
-dL:[function(){},"$0","v3",0,0,17],
+ax:[function(){},"$0","No",0,0,17],
 FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
 c.$2(z,y)}},
 NX:function(a,b,c,d){var z=a.Gv()
-if(!!J.x(z).$isb8)z.wM(new P.dR(b,c,d))
+if(!!J.x(z).$isb8)z.wM(new P.ap(b,c,d))
 else b.ZL(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
 Bb:function(a,b,c){var z=a.Gv()
-if(!!J.x(z).$isb8)z.wM(new P.QX(b,c))
+if(!!J.x(z).$isb8)z.wM(new P.Ry(b,c))
 else b.In(c)},
 cH:function(a,b){var z
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 SZ:function(a,b){var z
-if(J.xC($.X3,C.NU))return $.X3.Ud(a,b)
+if(J.xC($.X3,C.NU))return $.X3.lB(a,b)
 z=$.X3
-return z.Ud(a,z.rO(b,!0))},
+return z.lB(a,z.rO(b,!0))},
 YF:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
 dp:function(a,b){var z=a.gVs()
-return H.zw(z<0?0:z,b)},
+return H.jW(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
@@ -5837,8 +5891,8 @@
 z=P.Us(c)
 try{y=d.$2(e,f)
 return y}finally{$.X3=z}},"$6","xd",12,0,33,26,27,28,30,8,9],
-nI:[function(a,b,c,d){return d},"$4","W7",8,0,34,26,27,28,30],
-cQt:[function(a,b,c,d){return d},"$4","H9",8,0,35,26,27,28,30],
+MU:[function(a,b,c,d){return d},"$4","u3Q",8,0,34,26,27,28,30],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,35,26,27,28,30],
 bD:[function(a,b,c,d){return d},"$4","Dk",8,0,36,26,27,28,30],
 ZK:[function(a,b,c,d){var z,y
 if(C.NU!==c)d=c.ce(d)
@@ -5849,18 +5903,18 @@
 $.k8.aw=y
 $.k8=y}},"$4","yA",8,0,37,26,27,28,30],
 h8X:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","zci",10,0,38,26,27,28,39,40],
-HwS:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","RN",10,0,41,26,27,28,39,40],
-JjS:[function(a,b,c,d){H.Af(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
+Gi:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","Uwa",10,0,41,26,27,28,39,40],
+JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
 CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
-E1:[function(a,b,c,d,e){var z,y
+qc:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-if(d==null)d=C.zb
+if(d==null)d=C.Qq
 else if(!J.x(d).$isyQ)throw H.b(P.u("ZoneSpecifications must be instantiated with the provided constructor."))
 if(e==null)z=!!J.x(c).$ism0?c.gSe():P.YM(null,null,null,null,null)
 else{z=P.YM(null,null,null,null,null)
-z.FV(0,e)}y=new P.l7(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
-y.bC(c,d,z)
-return y},"$5","OjX",10,0,45,26,27,28,46,47],
+z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.Ij(c,d,z)
+return y},"$5","xN",10,0,45,26,27,28,46,47],
 th:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
@@ -5895,10 +5949,10 @@
 static:{Uz:function(a,b){return new P.O6(a,P.HR(a,b))},HR:function(a,b){if(b!=null)return b
 if(!!J.x(a).$isXS)return a.gI4()
 return}}},
-Ik:{
+rk:{
 "^":"u2;BT"},
-LR:{
-"^":"Bx;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,fk",
+JIw:{
+"^":"Bx;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,LT",
 gBT:function(){return this.BT},
 uO:function(a){var z=this.ru
 if(typeof z!=="number")return z.i()
@@ -5906,7 +5960,7 @@
 fc:function(){var z=this.ru
 if(typeof z!=="number")return z.w()
 this.ru=z^1},
-gh0:function(){var z=this.ru
+ga3:function(){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
 Pa:function(){var z=this.ru
@@ -5917,10 +5971,10 @@
 return(z&4)!==0},
 jy:[function(){},"$0","gb9",0,0,17],
 ie:[function(){},"$0","gxl",0,0,17],
-static:{"^":"E2b,HCK,VCd"}},
+static:{"^":"E2b,HCK,id"}},
 WVu:{
 "^":"a;iE@,SJ@",
-gvq:function(a){var z=new P.Ik(this)
+gvq:function(a){var z=new P.rk(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gUF:function(){return!1},
@@ -5937,13 +5991,13 @@
 a.sSJ(a)
 a.siE(a)},
 MI:function(a,b,c,d){var z,y,x
-if((this.YM&4)!==0){if(c==null)c=P.v3()
+if((this.YM&4)!==0){if(c==null)c=P.No()
 z=new P.EM($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.q1()
 return z}z=$.X3
 y=d?1:0
-x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
+x=new P.JIw(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
 x.Cy(a,b,c,d,H.u3(this,0))
 x.SJ=x
@@ -5954,14 +6008,14 @@
 y.siE(x)
 this.SJ=x
 x.ru=this.YM&1
-if(this.iE===x)P.ot(this.Ld)
+if(this.iE===x)P.ot(this.bA)
 return x},
 rR:function(a){if(a.giE()===a)return
-if(a.gh0())a.Pa()
+if(a.ga3())a.Pa()
 else{this.pW(a)
 if((this.YM&2)===0&&this.iE===this)this.hg()}return},
-Pm:function(a){},
-Bu:function(a){},
+EB:function(a){},
+Mt:function(a){},
 Pq:function(){if((this.YM&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.YM>=4)throw H.b(this.Pq())
@@ -5972,14 +6026,14 @@
 if(z>=4)throw H.b(this.Pq())
 this.YM=z|4
 y=this.WH()
-this.PS()
+this.Dd()
 return y},
 Rg:function(a,b){this.MW(b)},
 MR:function(a,b){this.y7(a,b)},
-AN:function(){var z=this.Hz
+EC:function(){var z=this.Hz
 this.Hz=null
 this.YM&=4294967287
-C.jN.dS(z)},
+C.bP.tZ(z)},
 HI:function(a){var z,y,x,w
 z=this.YM
 if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
@@ -6003,7 +6057,7 @@
 hg:function(){if((this.YM&4)!==0&&this.Kj.YM===0)this.Kj.Xf(null)
 P.ot(this.Ro)}},
 zW:{
-"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;bA,Ro,YM,iE,SJ,Hz,Kj",
 MW:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.YM|=2
@@ -6012,39 +6066,39 @@
 if(this.iE===this)this.hg()
 return}this.HI(new P.tK(this,a))},
 y7:function(a,b){if(this.iE===this)return
-this.HI(new P.OR(this,a,b))},
-PS:function(){if(this.iE!==this)this.HI(new P.Bg(this))
+this.HI(new P.QG(this,a,b))},
+Dd:function(){if(this.iE!==this)this.HI(new P.Bg(this))
 else this.Kj.Xf(null)}},
 tK:{
 "^":"TpZ;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
 $signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-OR:{
+QG:{
 "^":"TpZ;a,b,c",
 $1:function(a){a.MR(this.b,this.c)},
 $isEH:true,
 $signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"TpZ;a",
-$1:function(a){a.AN()},
+$1:function(a){a.EC()},
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"GJ",args:[[P.LR,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"Mc",args:[[P.JIw,a]]}},this.a,"zW")}},
 DL:{
-"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;bA,Ro,YM,iE,SJ,Hz,Kj",
 MW:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
+for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
 y.$builtinTypeInfo=[null]
 z.C2(y)}},
 y7:function(a,b){var z
 for(z=this.iE;z!==this;z=z.giE())z.C2(new P.Dn(a,b,null))},
-PS:function(){var z=this.iE
+Dd:function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.C2(C.ZB)
 else this.Kj.Xf(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
-w4:{
+Sv:{
 "^":"TpZ:76;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.In(this.a.$0())}catch(x){w=H.Ru(x)
@@ -6076,17 +6130,17 @@
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-A0:{
+A5:{
 "^":"a;",
-$isA0:true},
+$isA5:true},
 Pf0:{
 "^":"a;",
-$isA0:true},
+$isA5:true},
 Zf:{
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.YM!==0)throw H.b(P.w("Future already completed"))
-z.Xf(b)},function(a){return this.j3(a,null)},"dS","$1","$0","gv6",0,2,128,22,20],
+z.Xf(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,128,22,20],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
@@ -6161,13 +6215,13 @@
 Nk:function(a,b){if(this.YM!==0)H.vh(P.w("Future already completed"))
 this.YM=1
 this.t9.wr(new P.ZL(this,a,b))},
-X8:function(a,b,c){this.Nk(a,b)},
 J9:function(a,b){this.Xf(a)},
+X8:function(a,b,c){this.Nk(a,b)},
 $isGc:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,oN1,NKU",Dt:function(a){return H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[b])
 z.J9(a,b)
-return z},pz:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
+return z},t5:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
 return z},k3:function(a,b){b.sKl(!0)
 a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){b.sKl(!0)
@@ -6325,11 +6379,11 @@
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
-wS:{
+cb:{
 "^":"a;",
-ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"wS",0)])},
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},133],
-lM:[function(a,b){return H.VM(new P.AE(b,this),[H.W8(this,"wS",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"xv",ret:P.wS,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},133],
+ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"cb",0)])},
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.cb,args:[{func:"Pw",args:[a]}]}},this.$receiver,"cb")},133],
+yx:[function(a,b){return H.VM(new P.Bgk(b,this),[H.W8(this,"cb",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"T6w",ret:P.cb,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},133],
 zV:function(a,b){var z,y,x
 z={}
 y=P.Dt(P.qU)
@@ -6342,7 +6396,7 @@
 z={}
 y=P.Dt(P.SQ)
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gFa())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.tG(y),y.gFa())
 return y},
 aN:function(a,b){var z,y
 z={}
@@ -6354,13 +6408,13 @@
 z={}
 y=P.Dt(P.SQ)
 z.a=null
-z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gFa())
+z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gFa())
 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.hh(z,y),y.gFa())
+this.KR(new P.B5(z),!0,new P.PI(z,y),y.gFa())
 return y},
 gl0:function(a){var z,y
 z={}
@@ -6369,32 +6423,32 @@
 z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gFa())
 return y},
 br:function(a){var z,y
-z=H.VM([],[H.W8(this,"wS",0)])
-y=P.Dt([P.WO,H.W8(this,"wS",0)])
-this.KR(new P.lv(this,z),!0,new P.VVy(z,y),y.gFa())
+z=H.VM([],[H.W8(this,"cb",0)])
+y=P.Dt([P.WO,H.W8(this,"cb",0)])
+this.KR(new P.lv(this,z),!0,new P.Ul(z,y),y.gFa())
 return y},
-zH:function(a){var z,y
-z=P.Ls(null,null,null,H.W8(this,"wS",0))
-y=P.Dt([P.Ol,H.W8(this,"wS",0)])
+Oe:function(a){var z,y
+z=P.fM(null,null,null,H.W8(this,"cb",0))
+y=P.Dt([P.z5,H.W8(this,"cb",0)])
 this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gFa())
 return y},
 eR:function(a,b){var z=H.VM(new P.pt(b,this),[null])
-z.mh(this,b,null)
+z.qI(this,b,null)
 return z},
-gqG:function(a){var z,y
+gtH:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"wS",0))
+y=P.Dt(H.W8(this,"cb",0))
 z.a=null
 z.a=this.KR(new P.lU(z,this,y),!0,new P.xp(y),y.gFa())
 return y},
 grZ:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"wS",0))
+y=P.Dt(H.W8(this,"cb",0))
 z.a=null
 z.b=!1
 this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gFa())
 return y},
-$iswS:true},
+$iscb:true},
 dW3:{
 "^":"TpZ;a,b,c,d,e",
 $1:[function(a){var z,y,x,w,v
@@ -6406,24 +6460,25 @@
 y=new H.oP(w,null)
 P.NX(x.a,this.d,z,y)}},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 QCh:{
 "^":"TpZ:12;f",
 $1:[function(a){this.f.yk(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Lp0:{
 "^":"TpZ:76;UI,bK",
-$0:[function(){this.UI.In(this.bK.IN)},"$0",null,0,0,null,"call"],
+$0:[function(){var z=this.bK.IN
+this.UI.In(z.charCodeAt(0)==0?z:z)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Sd:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.LB(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
+P.FE(new P.bi(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-LB:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+bi:{
 "^":"TpZ:76;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
@@ -6431,20 +6486,20 @@
 "^":"TpZ:135;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-DO:{
+tG:{
 "^":"TpZ:76;bK",
 $0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"TpZ;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,134,"call"],
+$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-Rl:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+at:{
 "^":"TpZ:76;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
-at:{
+mj:{
 "^":"TpZ:12;",
 $1:function(a){},
 $isEH:true},
@@ -6452,14 +6507,14 @@
 "^":"TpZ:76;UI",
 $0:[function(){this.UI.In(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ee:{
+Ia:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
 P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 WN:{
 "^":"TpZ:76;e,f",
 $0:function(){return this.e.$1(this.f)},
@@ -6468,15 +6523,15 @@
 "^":"TpZ:135;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-Ia:{
+BSd:{
 "^":"TpZ:76;bK",
 $0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
-PI:{
+B5:{
 "^":"TpZ:12;a",
 $1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-hh:{
+PI:{
 "^":"TpZ:76;a,b",
 $0:[function(){this.b.In(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -6492,8 +6547,8 @@
 "^":"TpZ;a,b",
 $1:[function(a){this.b.push(a)},"$1",null,2,0,null,124,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
-VVy:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+Ul:{
 "^":"TpZ:76;c,d",
 $0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -6501,7 +6556,7 @@
 "^":"TpZ;a,b",
 $1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,124,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
 yZ:{
 "^":"TpZ:76;c,d",
 $0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
@@ -6510,11 +6565,11 @@
 "^":"TpZ;a,b,c",
 $1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 xp:{
 "^":"TpZ:76;d",
 $0:[function(){var z,y,x,w
-try{x=H.DU()
+try{x=H.Wp()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
@@ -6526,13 +6581,13 @@
 z.b=!0
 z.a=a},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 eI:{
 "^":"TpZ:76;a,c",
 $0:[function(){var z,y,x,w
 x=this.a
 if(x.b){this.c.In(x.a)
-return}try{x=H.DU()
+return}try{x=H.Wp()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
@@ -6542,7 +6597,7 @@
 "^":"a;",
 $isyX:true},
 u2:{
-"^":"ezY;",
+"^":"aN;",
 k0:function(a,b,c,d){return this.BT.MI(a,b,c,d)},
 giO:function(a){return(H.eQ(this.BT)^892482866)>>>0},
 n:function(a,b){if(b==null)return!1
@@ -6553,30 +6608,30 @@
 Bx:{
 "^":"KA;BT<",
 cZ:function(){return this.gBT().rR(this)},
-jy:[function(){this.gBT().Pm(this)},"$0","gb9",0,0,17],
-ie:[function(){this.gBT().Bu(this)},"$0","gxl",0,0,17]},
+jy:[function(){this.gBT().EB(this)},"$0","gb9",0,0,17],
+ie:[function(){this.gBT().Mt(this)},"$0","gxl",0,0,17]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;dB,Tv<,EU,t9<,YM,Qe,fk",
+"^":"a;dB,Tv<,EU,t9<,YM,Qe,LT",
 fm:function(a,b){if(b==null)b=P.bx()
 this.Tv=P.VH(b,this.t9)},
 Fv:[function(a,b){var z=this.YM
 if((z&8)!==0)return
 this.YM=(z+128|4)>>>0
 if(b!=null)b.wM(this.gDQ(this))
-if(z<128&&this.fk!=null)this.fk.IO()
-if((z&4)===0&&(this.YM&32)===0)this.Ge(this.gb9())},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
+if(z<128&&this.LT!=null)this.LT.b7()
+if((z&4)===0&&(this.YM&32)===0)this.uz(this.gb9())},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
 QE:[function(a){var z=this.YM
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.YM=z
-if(z<128){if((z&64)!==0){z=this.fk
+if(z<128){if((z&64)!==0){z=this.LT
 z=!z.gl0(z)}else z=!1
-if(z)this.fk.t2(this)
+if(z)this.LT.t2(this)
 else{z=(this.YM&4294967291)>>>0
 this.YM=z
-if((z&32)===0)this.Ge(this.gxl())}}}},"$0","gDQ",0,0,17],
+if((z&32)===0)this.uz(this.gxl())}}}},"$0","gDQ",0,0,17],
 Gv:function(){var z=(this.YM&4294967279)>>>0
 this.YM=z
 if((z&8)!==0)return this.Qe
@@ -6585,39 +6640,39 @@
 gUF:function(){return this.YM>=128},
 WN:function(){var z=(this.YM|8)>>>0
 this.YM=z
-if((z&64)!==0)this.fk.IO()
-if((this.YM&32)===0)this.fk=null
+if((z&64)!==0)this.LT.b7()
+if((this.YM&32)===0)this.LT=null
 this.Qe=this.cZ()},
 Rg:function(a,b){var z=this.YM
 if((z&8)!==0)return
 if(z<32)this.MW(b)
-else this.C2(H.VM(new P.fZ(b,null),[null]))},
+else this.C2(H.VM(new P.LV(b,null),[null]))},
 MR:function(a,b){var z=this.YM
 if((z&8)!==0)return
 if(z<32)this.y7(a,b)
 else this.C2(new P.Dn(a,b,null))},
-AN:function(){var z=this.YM
+EC:function(){var z=this.YM
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.YM=z
-if(z<32)this.PS()
+if(z<32)this.Dd()
 else this.C2(C.ZB)},
 jy:[function(){},"$0","gb9",0,0,17],
 ie:[function(){},"$0","gxl",0,0,17],
 cZ:function(){return},
 C2:function(a){var z,y
-z=this.fk
+z=this.LT
 if(z==null){z=new P.Qk(null,null,0)
-this.fk=z}z.h(0,a)
+this.LT=z}z.h(0,a)
 y=this.YM
 if((y&64)===0){y=(y|64)>>>0
 this.YM=y
-if(y<128)this.fk.t2(this)}},
+if(y<128)this.LT.t2(this)}},
 MW:function(a){var z=this.YM
 this.YM=(z|32)>>>0
 this.t9.m1(this.dB,a)
 this.YM=(this.YM&4294967263)>>>0
-this.Iy((z&4)!==0)},
+this.QV((z&4)!==0)},
 y7:function(a,b){var z,y
 z=this.YM
 y=new P.x1(this,a,b)
@@ -6626,42 +6681,42 @@
 z=this.Qe
 if(!!J.x(z).$isb8)z.wM(y)
 else y.$0()}else{y.$0()
-this.Iy((z&4)!==0)}},
-PS:function(){var z,y
-z=new P.qB(this)
+this.QV((z&4)!==0)}},
+Dd:function(){var z,y
+z=new P.yP(this)
 this.WN()
 this.YM=(this.YM|16)>>>0
 y=this.Qe
 if(!!J.x(y).$isb8)y.wM(z)
 else z.$0()},
-Ge:function(a){var z=this.YM
+uz:function(a){var z=this.YM
 this.YM=(z|32)>>>0
 a.$0()
 this.YM=(this.YM&4294967263)>>>0
-this.Iy((z&4)!==0)},
-Iy:function(a){var z,y
-if((this.YM&64)!==0){z=this.fk
+this.QV((z&4)!==0)},
+QV:function(a){var z,y
+if((this.YM&64)!==0){z=this.LT
 z=z.gl0(z)}else z=!1
 if(z){z=(this.YM&4294967231)>>>0
 this.YM=z
-if((z&4)!==0)if(z<128){z=this.fk
+if((z&4)!==0)if(z<128){z=this.LT
 z=z==null||z.gl0(z)}else z=!1
 else z=!1
 if(z)this.YM=(this.YM&4294967291)>>>0}for(;!0;a=y){z=this.YM
-if((z&8)!==0){this.fk=null
+if((z&8)!==0){this.LT=null
 return}y=(z&4)!==0
 if(a===y)break
 this.YM=(z^32)>>>0
 if(y)this.jy()
 else this.ie()
 this.YM=(this.YM&4294967263)>>>0}z=this.YM
-if((z&64)!==0&&z<128)this.fk.t2(this)},
+if((z&64)!==0&&z<128)this.LT.t2(this)},
 Cy:function(a,b,c,d,e){var z=this.t9
 this.dB=z.cR(a)
 this.fm(0,b)
-this.EU=z.Al(c==null?P.v3():c)},
+this.EU=z.Al(c==null?P.No():c)},
 $isyX:true,
-static:{"^":"Xx,kMJ,Q9e,Ir9,nav,lkp,JAK,N3S,bsZ",MG:function(a,b,c,d,e){var z,y
+static:{"^":"Xx,kMJ,Q9e,Ir9,nav,Dr,JAK,N3S,bsZ",T6:function(a,b,c,d,e){var z,y
 z=$.X3
 y=d?1:0
 y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
@@ -6684,7 +6739,7 @@
 else w.m1(u,v)
 z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-qB:{
+yP:{
 "^":"TpZ:17;a",
 $0:[function(){var z,y
 z=this.a
@@ -6694,15 +6749,15 @@
 z.t9.ww(z.EU)
 z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-ezY:{
-"^":"wS;",
+aN:{
+"^":"cb;",
 KR:function(a,b,c,d){return this.k0(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-k0:function(a,b,c,d){return P.MG(a,b,c,d,H.u3(this,0))}},
+k0:function(a,b,c,d){return P.T6(a,b,c,d,H.u3(this,0))}},
 fIm:{
 "^":"a;aw@"},
-fZ:{
+LV:{
 "^":"fIm;P>,aw",
 dP:function(a){a.MW(this.P)}},
 Dn:{
@@ -6710,7 +6765,7 @@
 dP:function(a){a.y7(this.kc,this.I4)}},
 yRf:{
 "^":"a;",
-dP:function(a){a.PS()},
+dP:function(a){a.Dd()},
 gaw:function(){return},
 saw:function(a){throw H.b(P.w("No events after a done."))}},
 B3P:{
@@ -6718,17 +6773,17 @@
 t2:function(a){var z=this.YM
 if(z===1)return
 if(z>=1){this.YM=1
-return}P.rb(new P.CR(this,a))
+return}P.rb(new P.lg(this,a))
 this.YM=1},
-IO:function(){if(this.YM===1)this.YM=3}},
-CR:{
+b7:function(){if(this.YM===1)this.YM=3}},
+lg:{
 "^":"TpZ:76;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.YM
 z.YM=0
 if(y===3)return
-z.vG(this.b)},"$0",null,0,0,null,"call"],
+z.Ge(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Qk:{
 "^":"B3P;zR,N6,YM",
@@ -6737,7 +6792,7 @@
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
 this.N6=b}},
-vG:function(a){var z,y
+Ge:function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
@@ -6750,25 +6805,24 @@
 "^":"a;t9<,YM,EU",
 gUF:function(){return this.YM>=4},
 q1:function(){if((this.YM&2)!==0)return
-this.t9.wr(this.gKS())
+this.t9.wr(this.gpx())
 this.YM=(this.YM|2)>>>0},
 fm:function(a,b){},
 Fv:[function(a,b){this.YM+=4
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
 QE:[function(a){var z=this.YM
 if(z>=4){z-=4
 this.YM=z
 if(z<4&&(z&1)===0)this.q1()}},"$0","gDQ",0,0,17],
 Gv:function(){return},
-PS:[function(){var z=(this.YM&4294967293)>>>0
+Dd:[function(){var z=(this.YM&4294967293)>>>0
 this.YM=z
 if(z>=4)return
 this.YM=(z|1)>>>0
-z=this.EU
-if(z!=null)this.t9.ww(z)},"$0","gKS",0,0,17],
+this.t9.ww(this.EU)},"$0","gpx",0,0,17],
 $isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
-dR:{
+ap:{
 "^":"TpZ:76;a,b,c",
 $0:[function(){return this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -6776,12 +6830,12 @@
 "^":"TpZ:138;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
-QX:{
+Ry:{
 "^":"TpZ:76;a,b",
 $0:[function(){return this.a.In(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
-"^":"wS;",
+"^":"cb;",
 KR:function(a,b,c,d){var z,y,x,w
 b=!0===b
 z=H.W8(this,"og",0)
@@ -6795,29 +6849,29 @@
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 FC:function(a,b){b.Rg(0,a)},
-$aswS:function(a,b){return[b]}},
+$ascb:function(a,b){return[b]}},
 fB:{
-"^":"KA;m7,lI,dB,Tv,EU,t9,YM,Qe,fk",
+"^":"KA;HQ,lI,dB,Tv,EU,t9,YM,Qe,LT",
 Rg:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
 MR:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.MR.call(this,a,b)},
 jy:[function(){var z=this.lI
 if(z==null)return
-z.WJ(0)},"$0","gb9",0,0,17],
+z.zd(0)},"$0","gb9",0,0,17],
 ie:[function(){var z=this.lI
 if(z==null)return
 z.QE(0)},"$0","gxl",0,0,17],
 cZ:function(){var z=this.lI
 if(z!=null){this.lI=null
 z.Gv()}return},
-Iu:[function(a){this.m7.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},124],
-SW:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,139,23,24],
-oZ:[function(){this.AN()},"$0","gos",0,0,17],
+Iu:[function(a){this.HQ.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},124],
+wK:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,139,23,24],
+oZ:[function(){this.EC()},"$0","gos",0,0,17],
 JC:function(a,b,c,d,e,f,g){var z,y
 z=this.gwU()
 y=this.gPr()
-this.lI=this.m7.Sb.zC(z,this.gos(),y)},
+this.lI=this.HQ.Sb.zC(z,this.gos(),y)},
 $asKA:function(a,b){return[b]},
 $asyX:function(a,b){return[b]}},
 fk:{
@@ -6831,7 +6885,7 @@
 b.MR(y,x)
 return}if(z===!0)J.wx(b,a)},
 $asog:function(a){return[a,a]},
-$aswS:null},
+$ascb:null},
 c9:{
 "^":"og;xj,Sb",
 Eh:function(a){return this.xj.$1(a)},
@@ -6842,11 +6896,11 @@
 x=new H.oP(w,null)
 b.MR(y,x)
 return}J.wx(b,z)}},
-AE:{
+Bgk:{
 "^":"og;yj,Sb",
-bZ:function(a){return this.yj.$1(a)},
+hq:function(a){return this.yj.$1(a)},
 FC:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.bZ(a));w.G();){z=w.gl()
+try{for(w=J.mY(this.hq(a));w.G();){z=w.gl()
 J.wx(b,z)}}catch(v){w=H.Ru(v)
 y=w
 x=new H.oP(v,null)
@@ -6856,28 +6910,28 @@
 FC:function(a,b){var z=this.Km
 if(z>0){this.Km=z-1
 return}b.Rg(0,a)},
-mh:function(a,b,c){if(b<0)throw H.b(P.u(b))},
+qI:function(a,b,c){if(b<0)throw H.b(P.u(b))},
 $asog:function(a){return[a,a]},
-$aswS:null},
+$ascb:null},
 kWp:{
 "^":"a;"},
-Uf:{
+Ls:{
 "^":"a;M5,ig>"},
 n7:{
 "^":"a;"},
 yQ:{
-"^":"a;lR,cP,U1,jH,Ka,Xp,fbF,rb,Zqn,ib,JS,nw",
+"^":"a;lR,cP,Jl,jH,Ka,Xp,o2,yS,Zqn,ib,JS,nw",
 hk:function(a,b){return this.lR.$2(a,b)},
 Gr:function(a){return this.cP.$1(a)},
-FI:function(a,b){return this.U1.$2(a,b)},
+FI:function(a,b){return this.Jl.$2(a,b)},
 mg:function(a,b,c){return this.jH.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
 cR:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fbF.$1(a)},
-wr:function(a){return this.rb.$1(a)},
-RK:function(a,b){return this.rb.$2(a,b)},
+O8:function(a){return this.o2.$1(a)},
+wr:function(a){return this.yS.$1(a)},
+RK:function(a,b){return this.yS.$2(a,b)},
 uN:function(a,b){return this.Zqn.$2(a,b)},
-Ud:function(a,b){return this.ib.$2(a,b)},
+lB:function(a,b){return this.ib.$2(a,b)},
 Ch:function(a,b){return this.JS.$1(b)},
 iT:function(a){return this.nw.$1$specification(a)},
 $isyQ:true},
@@ -6895,8 +6949,8 @@
 "^":"a;",
 fC:function(a){return this.gF7()===a.gF7()},
 $ism0:true},
-l7:{
-"^":"m0;JY<,vr<,HG<,Tr<,kX<,c5<,Of<,x6<,Jy<,kP<,uI<,pB<,ye,eT>,Se<",
+FQ:{
+"^":"m0;JY<,W7<,HG<,O5<,kX<,c5<,Of<,x6<,Jy<,kP<,Gt<,pB<,ye,eT>,Se<",
 gyL:function(){var z=this.ye
 if(z!=null)return z
 z=new P.Id(this)
@@ -6926,12 +6980,12 @@
 else return new P.Yn(this,z)},
 ce:function(a){return this.xi(a,!0)},
 rO:function(a,b){var z=this.cR(a)
-if(b)return new P.eP(this,z)
-else return new P.aQ(this,z)},
+if(b)return new P.CN(this,z)
+else return new P.eP(this,z)},
 mS:function(a){return this.rO(a,!0)},
 PT:function(a,b){var z=this.O8(a)
 if(b)return new P.N9(this,z)
-else return new P.ap(this,z)},
+else return new P.aR(this,z)},
 t:function(a,b){var z,y,x,w
 z=this.Se
 y=z.t(0,b)
@@ -6946,13 +7000,13 @@
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
 c6:function(a,b){var z,y,x
-z=this.uI
+z=this.Gt
 y=z.M5
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
 iT:function(a){return this.c6(a,null)},
 Gr:function(a){var z,y,x
-z=this.vr
+z=this.W7
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,a)},
@@ -6967,7 +7021,7 @@
 x=P.Cw(y)
 return z.ig.$6(y,x,this,a,b,c)},
 Al:function(a){var z,y,x
-z=this.Tr
+z=this.O5
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,a)},
@@ -6991,7 +7045,7 @@
 y=z.M5
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
-Ud:function(a,b){var z,y,x
+lB:function(a,b){var z,y,x
 z=this.Jy
 y=z.M5
 x=P.Cw(y)
@@ -7001,20 +7055,20 @@
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,b)},
-bC:function(a,b,c){var z
-this.vr=this.eT.gvr()
+Ij:function(a,b,c){var z
+this.W7=this.eT.gW7()
 this.JY=this.eT.gJY()
 this.HG=this.eT.gHG()
 z=b.Ka
-this.Tr=z!=null?new P.Uf(this,z):this.eT.gTr()
+this.O5=z!=null?new P.Ls(this,z):this.eT.gO5()
 z=b.Xp
-this.kX=z!=null?new P.Uf(this,z):this.eT.gkX()
+this.kX=z!=null?new P.Ls(this,z):this.eT.gkX()
 this.c5=this.eT.gc5()
 this.Of=this.eT.gOf()
 this.x6=this.eT.gx6()
 this.Jy=this.eT.gJy()
 this.kP=this.eT.gkP()
-this.uI=this.eT.guI()
+this.Gt=this.eT.gGt()
 this.pB=this.eT.gpB()}},
 OJ:{
 "^":"TpZ:76;a,b",
@@ -7024,11 +7078,11 @@
 "^":"TpZ:76;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-eP:{
+CN:{
 "^":"TpZ:12;a,b",
 $1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
-aQ:{
+eP:{
 "^":"TpZ:12;c,d",
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
@@ -7036,7 +7090,7 @@
 "^":"TpZ:81;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
-ap:{
+aR:{
 "^":"TpZ:81;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
@@ -7046,20 +7100,20 @@
 $isEH:true},
 R81:{
 "^":"m0;",
-gvr:function(){return C.lk},
+gW7:function(){return C.lk},
 gJY:function(){return C.Yl},
 gHG:function(){return C.Gu},
-gTr:function(){return C.pj},
-gkX:function(){return C.F6},
+gO5:function(){return C.pj},
+gkX:function(){return C.pm},
 gc5:function(){return C.Xk},
 gOf:function(){return C.Zc},
 gx6:function(){return C.Sq},
-gJy:function(){return C.NA},
+gJy:function(){return C.rj},
 gkP:function(){return C.uo},
-guI:function(){return C.mc},
+gGt:function(){return C.mc},
 gpB:function(){return C.Rt},
 geT:function(a){return},
-gSe:function(){return $.OL()},
+gSe:function(){return $.wb()},
 gyL:function(){var z=$.Cb
 if(z!=null)return z
 z=new P.Id(this)
@@ -7093,11 +7147,11 @@
 rO:function(a,b){if(b)return new P.pQ(this,a)
 else return new P.Ky(this,a)},
 mS:function(a){return this.rO(a,!0)},
-PT:function(a,b){if(b)return new P.Ze(this,a)
-else return new P.dM(this,a)},
+PT:function(a,b){if(b)return new P.SJ(this,a)
+else return new P.Ze(this,a)},
 t:function(a,b){return},
 hk:function(a,b){return P.CK(null,null,this,a,b)},
-c6:function(a,b){return P.E1(null,null,this,a,b)},
+c6:function(a,b){return P.qc(null,null,this,a,b)},
 iT:function(a){return this.c6(a,null)},
 Gr:function(a){if($.X3===C.NU)return a.$0()
 return P.Ki(null,null,this,a)},
@@ -7110,8 +7164,8 @@
 O8:function(a){return a},
 wr:function(a){P.ZK(null,null,this,a)},
 uN:function(a,b){return P.YF(a,b)},
-Ud:function(a,b){return P.dp(a,b)},
-Ch:function(a,b){H.Af(b)},
+lB:function(a,b){return P.dp(a,b)},
+Ch:function(a,b){H.qw(b)},
 static:{"^":"ln,Cb"}},
 hj:{
 "^":"TpZ:76;a,b",
@@ -7129,25 +7183,25 @@
 "^":"TpZ:12;c,d",
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
-Ze:{
+SJ:{
 "^":"TpZ:81;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
-dM:{
+Ze:{
 "^":"TpZ:81;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true}}],["","",,P,{
 "^":"",
 EF:function(a,b,c){return H.dJ(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-TQ:[function(a,b){return J.xC(a,b)},"$2","fc",4,0,48,49,50],
+Ou4:[function(a,b){return J.xC(a,b)},"$2","bUo",4,0,48,49,50],
 T9:[function(a){return J.v1(a)},"$1","py",2,0,51,49],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
 return z}b=P.py()
 return P.uP(a,b,c,d,e)},
-Rd:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
+l1:function(a,b,c,d){return H.VM(new P.Rr(0,null,null,null,null),[d])},
 B4:function(a,b,c){var z,y
 if(P.nH(a)){if(b==="("&&c===")")return"(...)"
 return b+"..."+c}z=[]
@@ -7157,7 +7211,8 @@
 y.pop()}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
-return y.IN},
+y=y.IN
+return y.charCodeAt(0)==0?y:y},
 WE:function(a,b,c){var z,y
 if(P.nH(a))return b+"..."+c
 z=P.p9(b)
@@ -7165,7 +7220,8 @@
 y.push(a)
 try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
 y.pop()}z.KF(c)
-return z.gIN()},
+y=z.gIN()
+return y.charCodeAt(0)==0?y:y},
 nH:function(a){var z,y
 for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
 return!1},
@@ -7202,9 +7258,13 @@
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
 b.push(v)},
-L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
-Ls:function(a,b,c,d){return H.VM(new P.D0(0,null,null,null,null,null,0),[d])},
-Vi:function(a,b,c){var z,y,x,w,v
+L5:function(a,b,c,d,e){var z=new P.YB(0,null,null,null,null,null,0)
+z.$builtinTypeInfo=[d,e]
+return z},
+fM:function(a,b,c,d){var z=new P.D0(0,null,null,null,null,null,0)
+z.$builtinTypeInfo=[d]
+return z},
+fd:function(a,b,c){var z,y,x,w,v
 z=[]
 y=J.U6(a)
 x=y.gB(a)
@@ -7222,7 +7282,8 @@
 J.Me(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.Ex()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gIN()},
+z.pop()}z=y.gIN()
+return z.charCodeAt(0)==0?z:z},
 bA:{
 "^":"a;X5,Mb,cG,Cs,MV",
 gB:function(a){return this.X5},
@@ -7237,7 +7298,7 @@
 KY:function(a){var z=this.Cs
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
-FV:function(a,b){J.Me(b,new P.ef(this))},
+FV:function(a,b){J.Me(b,new P.DJ(this))},
 t:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)y=null
@@ -7268,6 +7329,11 @@
 if(w>=0)x[w+1]=b
 else{x.push(a,b);++this.X5
 this.MV=null}}},
+to:function(a,b,c){var z
+if(this.NZ(0,b))return this.t(0,b)
+z=c.$0()
+this.u(0,b,z)
+return z},
 Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
 else return this.qg(b)},
@@ -7333,7 +7399,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
-ef:{
+DJ:{
 "^":"TpZ;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
@@ -7557,12 +7623,12 @@
 return!1}else{this.fD=z.gv8(z)
 this.Qx=this.Qx.gtL()
 return!0}}}},
-jg:{
+Rr:{
 "^":"u3T;X5,Mb,cG,Cs,vw",
-iL:function(){var z=new P.jg(0,null,null,null,null)
+iL:function(){var z=new P.Rr(0,null,null,null,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=new P.cN(this,this.ij(),0,null)
+gA:function(a){var z=new P.cN(this,this.Ed(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return this.X5},
@@ -7579,8 +7645,8 @@
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-return this.GP(a)},
-GP:function(a){var z,y,x
+return this.Ix(a)},
+Ix:function(a){var z,y,x
 z=this.Cs
 if(z==null)return
 y=z[this.rk(a)]
@@ -7601,7 +7667,7 @@
 x=y}return this.bQ(x,b)}else return this.B7(0,b)},
 B7:function(a,b){var z,y,x
 z=this.Cs
-if(z==null){z=P.yT()
+if(z==null){z=P.Ym()
 this.Cs=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[b]
@@ -7628,7 +7694,7 @@
 this.cG=null
 this.Mb=null
 this.X5=0}},
-ij:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+Ed:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.vw
 if(z!=null)return z
 y=Array(this.X5)
@@ -7660,11 +7726,11 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
-$isOl:true,
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{yT:function(){var z=Object.create(null)
+static:{Ym:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
@@ -7704,21 +7770,21 @@
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-else return this.GP(a)},
-GP:function(a){var z,y,x
+else return this.Ix(a)},
+Ix:function(a){var z,y,x
 z=this.Cs
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
-return J.Nq(J.UQ(y,x))},
+return J.JU(J.UQ(y,x))},
 aN:function(a,b){var z,y
 z=this.HH
 y=this.HU
 for(;z!=null;){b.$1(z.gGc(z))
 if(y!==this.HU)throw H.b(P.a4(this))
 z=z.gtL()}},
-gqG:function(a){var z=this.HH
+gtH:function(a){var z=this.HH
 if(z==null)throw H.b(P.w("No elements"))
 return z.gGc(z)},
 grZ:function(a){var z=this.Nz
@@ -7802,9 +7868,9 @@
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
+for(y=0;y<z;++y)if(J.xC(J.JU(a[y]),b))return y
 return-1},
-$isOl:true,
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -7824,7 +7890,7 @@
 return!1}else{this.fD=z.gGc(z)
 this.Qx=this.Qx.gtL()
 return!0}}}},
-Yp:{
+Ui:{
 "^":"w2Y;G4",
 gB:function(a){return this.G4.length},
 t:function(a,b){var z=this.G4
@@ -7832,14 +7898,14 @@
 return z[b]}},
 u3T:{
 "^":"Vj5;",
-zH:function(a){var z=this.iL()
+Oe:function(a){var z=this.iL()
 z.FV(0,this)
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
+ez:[function(a,b){return H.K1(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
 ad:function(a,b){return H.VM(new H.U5(this,b),[H.W8(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
+yx:[function(a,b){return H.VM(new H.Fm(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -7853,13 +7919,14 @@
 y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.IN+=x}}return y.IN},
+y.IN+=x}}x=y.IN
+return x.charCodeAt(0)==0?x:x},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
 tt:function(a,b){return P.F(this,b,H.W8(this,"mW",0))},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.W8(this,"mW",0))
+Oe:function(a){var z=P.fM(null,null,null,H.W8(this,"mW",0))
 z.FV(0,this)
 return z},
 gB:function(a){var z,y
@@ -7868,13 +7935,13 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:function(a,b){return H.ke(this,b,H.W8(this,"mW",0))},
-gqG:function(a){var z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
+eR:function(a,b){return H.p6(this,b,H.W8(this,"mW",0))},
+gtH:function(a){var z=this.gA(this)
+if(!z.G())throw H.b(H.Wp())
 return z.gl()},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
+if(!z.G())throw H.b(H.Wp())
 do y=z.gl()
 while(z.G())
 return y},
@@ -7888,8 +7955,8 @@
 $isQV:true,
 $asQV:null},
 ark:{
-"^":"eD;"},
-eD:{
+"^":"E9h;"},
+E9h:{
 "^":"a+lD;",
 $isWO:true,
 $asWO:null,
@@ -7906,7 +7973,7 @@
 if(z!==this.gB(a))throw H.b(P.a4(a))}},
 gl0:function(a){return this.gB(a)===0},
 gor:function(a){return!this.gl0(a)},
-gqG:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
+gtH:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,0)},
 grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,this.gB(a)-1)},
@@ -7918,14 +7985,15 @@
 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
+zV:function(a,b){var z,y
 if(this.gB(a)===0)return""
 z=P.p9("")
 z.We(a,b)
-return z.IN},
+y=z.IN
+return y.charCodeAt(0)==0?y:y},
 ad:function(a,b){return H.VM(new H.U5(a,b),[H.W8(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
+yx:[function(a,b){return H.VM(new H.Fm(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.W8(a,"lD",0)])
@@ -7935,15 +8003,15 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y
-z=P.Ls(null,null,null,H.W8(a,"lD",0))
+Oe:function(a){var z,y
+z=P.fM(null,null,null,H.W8(a,"lD",0))
 for(y=0;y<this.gB(a);++y)z.h(0,this.t(a,y))
 return z},
 h:function(a,b){var z=this.gB(a)
 this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.Ff
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.lo
 x=this.gB(a)
 this.sB(a,x+1)
 this.u(a,x,y)}},
@@ -7951,7 +8019,7 @@
 for(z=0;z<this.gB(a);++z)if(J.xC(this.t(a,z),b)){this.YW(a,z,this.gB(a)-1,a,z+1)
 this.sB(a,this.gB(a)-1)
 return!0}return!1},
-uk:function(a,b){P.Vi(a,b,!1)},
+uk:function(a,b){P.fd(a,b,!1)},
 V1:function(a){this.sB(a,0)},
 GT:function(a,b){if(b==null)b=P.n4()
 H.ZE(a,0,this.gB(a)-1,b)},
@@ -7999,7 +8067,7 @@
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
+aP: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)
@@ -8039,11 +8107,11 @@
 gB:function(a){return J.q8(this.gvc(this))},
 gl0:function(a){return J.FN(this.gvc(this))},
 gor:function(a){return J.pO(this.gvc(this))},
-gUQ:function(a){return H.VM(new P.wU(this),[H.W8(this,"Yk",1)])},
+gUQ:function(a){return H.VM(new P.NV(this),[H.W8(this,"Yk",1)])},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isT8:true,
 $asT8:null},
-wU:{
+NV:{
 "^":"mW;ZD",
 gB:function(a){var z=this.ZD
 return J.q8(z.gvc(z))},
@@ -8051,10 +8119,10 @@
 return J.FN(z.gvc(z))},
 gor:function(a){var z=this.ZD
 return J.pO(z.gvc(z))},
-gqG:function(a){var z=this.ZD
-return z.t(0,J.bT(z.gvc(z)))},
+gtH:function(a){var z=this.ZD
+return z.t(0,J.Es(z.gvc(z)))},
 grZ:function(a){var z=this.ZD
-return z.t(0,J.MQ(z.gvc(z)))},
+return z.t(0,J.OH(z.gvc(z)))},
 gA:function(a){var z=this.ZD
 z=new P.Uq(J.mY(z.gvc(z)),z,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -8108,9 +8176,9 @@
 z.KF(": ")
 z.KF(b)},"$2",null,4,0,null,141,66,"call"],
 $isEH:true},
-nd:{
+Fw:{
 "^":"mW;E3,QN,Bq,Z1",
-gA:function(a){var z=new P.fO(this,this.Bq,this.Z1,this.QN,null)
+gA:function(a){var z=new P.KG(this,this.Bq,this.Z1,this.QN,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
@@ -8121,16 +8189,16 @@
 if(z!==this.Z1)H.vh(P.a4(this))}},
 gl0:function(a){return this.QN===this.Bq},
 gB:function(a){return(this.Bq-this.QN&this.E3.length-1)>>>0},
-gqG:function(a){var z,y
+gtH:function(a){var z,y
 z=this.QN
-if(z===this.Bq)throw H.b(H.DU())
+if(z===this.Bq)throw H.b(H.Wp())
 y=this.E3
 if(z>=y.length)return H.e(y,z)
 return y[z]},
 grZ:function(a){var z,y,x
 z=this.QN
 y=this.Bq
-if(z===y)throw H.b(H.DU())
+if(z===y)throw H.b(H.Wp())
 z=this.E3
 x=z.length
 y=(y-1&x-1)>>>0
@@ -8150,7 +8218,7 @@
 x=y+z
 w=this.E3
 v=w.length
-if(x>=v){u=P.ra(x)
+if(x>=v){u=P.uay(x)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
@@ -8192,7 +8260,7 @@
 bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 AR:function(){var z,y,x,w
 z=this.QN
-if(z===this.Bq)throw H.b(H.DU());++this.Z1
+if(z===this.Bq)throw H.b(H.Wp());++this.Z1
 y=this.E3
 x=y.length
 if(z>=x)return H.e(y,z)
@@ -8263,12 +8331,14 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"TNe",ra:function(a){var z
+static:{"^":"TNe",NZ2:function(a,b){var z=H.VM(new P.Fw(null,0,0,0),[b])
+z.Eo(a,b)
+return z},uay:function(a){var z
 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}}}},
-fO:{
+KG:{
 "^":"a;dk,pP,Z1,Dc,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
@@ -8290,7 +8360,7 @@
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.Ff)},
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.lo)},
 uk:function(a,b){var z,y,x
 z=[]
 for(y=this.gA(this);y.G();){x=y.gl()
@@ -8304,12 +8374,12 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"UyD",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
 bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
+yx:[function(a,b){return H.VM(new H.Fm(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 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
@@ -8320,21 +8390,22 @@
 y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.IN+=x}}return y.IN},
+y.IN+=x}}x=y.IN
+return x.charCodeAt(0)==0?x:x},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
-eR:function(a,b){return H.ke(this,b,H.u3(this,0))},
-gqG:function(a){var z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
+eR:function(a,b){return H.p6(this,b,H.u3(this,0))},
+gtH:function(a){var z=this.gA(this)
+if(!z.G())throw H.b(H.Wp())
 return z.gl()},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
+if(!z.G())throw H.b(H.Wp())
 do y=z.gl()
 while(z.G())
 return y},
-$isOl:true,
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -8346,7 +8417,7 @@
 jp:{
 "^":"oz;P*,nl,Bb,T8",
 $asoz:function(a,b){return[a]}},
-vX1:{
+Xt:{
 "^":"a;",
 oB:function(a){var z,y,x,w,v,u,t,s
 z=this.VR
@@ -8406,7 +8477,7 @@
 a.Bb=y.Bb
 y.Bb=null}this.VR=a}},
 Ba:{
-"^":"vX1;V2s,z4,VR,fu,hm,Z1,wq",
+"^":"Xt;V2s,z4,VR,fu,hm,Z1,wq",
 L4:function(a,b){return this.V2s.$2(a,b)},
 Bc:function(a){return this.z4.$1(a)},
 R2:function(a,b){return this.L4(a,b)},
@@ -8424,13 +8495,13 @@
 z=this.oB(b)
 if(J.xC(z,0)){this.VR.P=c
 return}this.Oa(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
-FV:function(a,b){H.bQ(b,new P.QG(this))},
+FV:function(a,b){H.bQ(b,new P.pn(this))},
 gl0:function(a){return this.VR==null},
 gor:function(a){return this.VR!=null},
 aN:function(a,b){var z,y,x
 z=H.u3(this,0)
 y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.Z1,this.wq,null),[z])
-y.Dd(this,[P.oz,z])
+y.ls(this,[P.oz,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
 b.$2(z.gnl(x),z.gP(x))}},
@@ -8444,7 +8515,7 @@
 return z},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isBa:true,
-$asvX1:function(a,b){return[a]},
+$asXt:function(a,b){return[a]},
 $asT8:null,
 $isT8:true,
 static:{GV:function(a,b,c,d){var z,y
@@ -8456,7 +8527,7 @@
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
-QG:{
+pn:{
 "^":"TpZ;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
@@ -8470,7 +8541,7 @@
 for(z=this.x5;a!=null;){z.push(a)
 a=a.Bb}},
 G:function(){var z,y,x
-z=this.OC
+z=this.xp
 if(this.Z1!==z.Z1)throw H.b(P.a4(z))
 y=this.x5
 if(y.length===0){this.Ju=null
@@ -8483,16 +8554,16 @@
 this.Ju=z
 this.Zq(z.T8)
 return!0},
-Dd:function(a,b){this.Zq(a.VR)}},
+ls:function(a,b){this.Zq(a.VR)}},
 nF:{
-"^":"mW;OC",
-gB:function(a){return this.OC.hm},
-gl0:function(a){return this.OC.hm===0},
+"^":"mW;xp",
+gB:function(a){return this.xp.hm},
+gl0:function(a){return this.xp.hm===0},
 gA:function(a){var z,y
-z=this.OC
+z=this.xp
 y=new P.DN(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Dd(z,H.u3(this,0))
+y.ls(z,H.u3(this,0))
 return y},
 $isyN:true},
 JO:{
@@ -8503,20 +8574,20 @@
 z=this.ZD
 y=new P.ZM(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Dd(z,H.u3(this,1))
+y.ls(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
+"^":"S6B;xp,x5,Z1,wq,Ju",
 Gf:function(a){return a.nl}},
 ZM:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
+"^":"S6B;xp,x5,Z1,wq,Ju",
 Gf:function(a){return a.P},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
+"^":"S6B;xp,x5,Z1,wq,Ju",
 Gf:function(a){return a},
 $asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
 "^":"",
@@ -8533,7 +8604,7 @@
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
+throw H.b(P.rr(String(y),null,null))}if(b==null)return P.KH(z)
 else return P.VQ(z,b)},
 tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
@@ -8571,16 +8642,16 @@
 gvc:function(a){var z
 if(this.LK==null){z=this.Mq
 return z.gvc(z)}z=this.oD()
-return H.c1(z,0,null,H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0))},
+return H.c1(z,0,null,H.u3(H.VM(new H.TNQ(),[H.u3(z,0)]),0))},
 gUQ:function(a){var z
 if(this.LK==null){z=this.Mq
-return z.gUQ(z)}return H.K1(this.oD(),new P.A5(this),null,null)},
+return z.gUQ(z)}return H.K1(this.oD(),new P.Ni(this),null,null)},
 u:function(a,b,c){var z,y
 if(this.LK==null)this.Mq.u(0,b,c)
 else if(this.NZ(0,b)){z=this.LK
 z[b]=c
 y=this.PF
-if(y==null?z!=null:y!==z)y[b]=null}else this.tZ().u(0,b,c)},
+if(y==null?z!=null:y!==z)y[b]=null}else this.XK().u(0,b,c)},
 FV:function(a,b){H.bQ(b,new P.E5(this))},
 NZ:function(a,b){if(this.LK==null)return this.Mq.NZ(0,b)
 if(typeof b!=="string")return!1
@@ -8591,11 +8662,11 @@
 this.u(0,b,z)
 return z},
 Rz:function(a,b){if(this.LK!=null&&!this.NZ(0,b))return
-return this.tZ().Rz(0,b)},
+return this.XK().Rz(0,b)},
 V1:function(a){var z
 if(this.LK==null)this.Mq.V1(0)
 else{z=this.Mq
-if(z!=null)J.Z8(z)
+if(z!=null)J.U2(z)
 this.LK=null
 this.PF=null
 this.Mq=P.Fl(null,null)}},
@@ -8611,7 +8682,7 @@
 oD:function(){var z=this.Mq
 if(z==null){z=Object.keys(this.PF)
 this.Mq=z}return z},
-tZ:function(){var z,y,x,w,v
+XK:function(){var z,y,x,w,v
 if(this.LK==null)return this.Mq
 z=P.Fl(null,null)
 y=this.oD()
@@ -8630,7 +8701,7 @@
 $asFo:function(){return[null,null]},
 $isT8:true,
 $asT8:function(){return[null,null]}},
-A5:{
+Ni:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
@@ -8638,41 +8709,41 @@
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
-Uk:{
+Ukr:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Uk;",
-$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Ukr;",
+$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
 Ud:{
 "^":"XS;Ct,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
 else return"Converting object did not return an encodable object."},"$0","gCR",0,0,73],
-static:{NM:function(a,b){return new P.Ud(a,b)}}},
+static:{Gy:function(a,b){return new P.Ud(a,b)}}},
 K8:{
 "^":"Ud;Ct,FN",
 bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gCR",0,0,73],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Uk;Fs<,Ha",
-cW:function(a,b){return P.jc(a,this.gP1().Fs)},
-iQ:function(a){return this.cW(a,null)},
-N7:function(a,b){var z=this.gZE()
+"^":"Ukr;J2<,xq",
+cW:function(a,b){return P.jc(a,this.gJh().J2)},
+kV:function(a){return this.cW(a,null)},
+Co:function(a,b){var z=this.gZE()
 return P.Vg(a,z.Wl,z.UM)},
-KP:function(a){return this.N7(a,null)},
-gZE:function(){return C.cb},
-gP1:function(){return C.A3},
-$asUk:function(){return[P.a,P.qU]}},
+KP:function(a){return this.Co(a,null)},
+gZE:function(){return C.Sr},
+gJh:function(){return C.A3},
+$asUkr:function(){return[P.a,P.qU]}},
 ojF:{
 "^":"wIe;UM,Wl",
 $aswIe:function(){return[P.a,P.qU]}},
-c5:{
-"^":"wIe;Fs<",
+Mx:{
+"^":"wIe;J2<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;Ha,qR,SK",
-HT:function(a){return this.Ha.$1(a)},
+"^":"a;xq,qR,SK",
+HT:function(a){return this.xq.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
@@ -8726,15 +8797,15 @@
 rl:function(a){var z,y,x,w
 if(!this.Jc(a)){this.WD(a)
 try{z=this.HT(a)
-if(!this.Jc(z)){x=P.NM(a,null)
+if(!this.Jc(z)){x=P.Gy(a,null)
 throw H.b(x)}x=this.SK
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.NM(a,y))}}},
+throw H.b(P.Gy(a,y))}}},
 Jc:function(a){var z,y,x,w
 z={}
-if(typeof a==="number"){if(!C.CD.gzr(a))return!1
+if(typeof a==="number"){if(!C.CD.gx8(a))return!1
 this.qR.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.qR.KF("true")
 return!0}else if(a===!1){this.qR.KF("false")
@@ -8762,11 +8833,12 @@
 E5:function(a){var z=this.SK
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,No,HVe,Wk,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"Gsm,hyY,IE,Jyf,fc,HVe,Wk,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z,y
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).rl(a)
-return z.IN}}},
+y=z.IN
+return y.charCodeAt(0)==0?y:y}}},
 tF:{
 "^":"TpZ:82;a,b",
 $2:[function(a,b){var z,y,x
@@ -8780,21 +8852,19 @@
 z.rl(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
 u5F:{
-"^":"Ziv;QA",
+"^":"Ziv;ns",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
+gZE:function(){return new P.E3()}},
+E3:{
 "^":"wIe;",
-Sw:function(a){var z,y,x
+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])
+if(typeof y!=="number"||Math.floor(y)!==y)H.vh(P.u("Invalid length "+H.d(y)))
+y=new Uint8Array(y)
 x=new P.Rw(0,0,y)
 if(x.Gx(a,0,z.gB(a))!==z.gB(a))x.O6(z.j(a,J.bI(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.o9)},
+return C.Jm.aM(y,0,x.o9)},
 $aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
 Rw:{
 "^":"a;UfS,o9,Zj",
@@ -8866,18 +8936,19 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;QA",
-Sw:function(a){var z,y
+"^":"wIe;ns",
+WJ:function(a){var z,y,x
 z=P.p9("")
-y=new P.Dd(this.QA,z,!0,0,0,0)
+y=new P.Dd(this.ns,z,!0,0,0,0)
 y.ME(a,0,J.q8(a))
 y.fZ()
-return z.IN},
+x=z.IN
+return x.charCodeAt(0)==0?x:x},
 $aswIe:function(){return[[P.WO,P.KN],P.qU]}},
 Dd:{
-"^":"a;QA,C4,YN,Dp,rw,pt",
+"^":"a;ns,C4,YN,Dp,rw,pt",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.rw>0){if(this.QA!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence",null,null))
+fZ:function(){if(this.rw>0){if(!this.ns)throw H.b(P.rr("Unfinished UTF-8 octet sequence",null,null))
 this.C4.KF(H.mx(65533))
 this.Dp=0
 this.rw=0
@@ -8891,10 +8962,10 @@
 this.pt=0
 w=new P.wh(c)
 v=new P.yn(this,a,b,c)
-$loop$0:for(u=this.C4,t=this.QA!==!0,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
+$loop$0:for(u=this.C4,t=!this.ns,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+if(p.i(q,192)!==128){if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.YN=!1
 p=H.mx(65533)
 u.IN+=p
@@ -8902,10 +8973,10 @@
 break $multibyte$2}else{z=(z<<6|p.i(q,63))>>>0;--y;++r}}while(y>0)
 p=x-1
 if(p<0||p>=4)return H.e(C.Gb,p)
-if(z<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
+if(z<=C.Gb[p]){if(t)throw H.b(P.rr("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
 z=65533
 y=0
-x=0}if(z>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
+x=0}if(z>1114111){if(t)throw H.b(P.rr("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
 z=65533}if(!this.YN||z!==65279){p=H.mx(z)
 u.IN+=p}this.YN=!1}}for(;r<c;r=n){o=w.$2(a,r)
 if(J.xZ(o,0)){this.YN=!1
@@ -8916,7 +8987,7 @@
 r=n}n=r+1
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.C(q,0)){if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
+if(p.C(q,0)){if(t)throw H.b(P.rr("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
 p=H.mx(65533)
 u.IN+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
 y=1
@@ -8927,7 +8998,7 @@
 continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){z=p.i(q,7)
 y=3
 x=3
-continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+continue $loop$0}if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.YN=!1
 p=H.mx(65533)
 u.IN+=p
@@ -8950,8 +9021,8 @@
 z=a===0&&b===J.q8(this.c)
 y=this.b
 x=this.c
-if(z)y.C4.KF(P.HM(x))
-else y.C4.KF(P.HM(J.Fd(x,a,b)))},
+if(z)y.C4.KF(P.nB(x))
+else y.C4.KF(P.nB(J.Fd(x,a,b)))},
 $isEH:true}}],["","",,P,{
 "^":"",
 Te:function(a){return},
@@ -8960,7 +9031,7 @@
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
 z.IN="\""
-for(y=a.length,x=0,w="\"";x<y;++x){v=C.xB.j(a,x)
+for(y=a.length,x=0,w="\"";x<y;++x){v=C.yo.j(a,x)
 if(v<=31)if(v===10)w=z.IN+="\\n"
 else if(v===13)w=z.IN+="\\r"
 else if(v===9)w=z.IN+="\\t"
@@ -8973,7 +9044,7 @@
 else{w=H.mx(v)
 w=z.IN+=w}}y=w+"\""
 z.IN=y
-return y}return"Instance of '"+H.lh(a)+"'"},
+return y.charCodeAt(0)==0?y:y}return"Instance of '"+H.lh(a)+"'"},
 eG:function(a){return new P.HG(a)},
 kC:[function(a,b){return a==null?b==null:a===b},"$2","XK",4,0,54],
 xvm:[function(a){return H.CU(a)},"$1","mbf",2,0,55],
@@ -8986,9 +9057,9 @@
 FL:function(a){var z,y
 z=H.d(a)
 y=$.oK
-if(y==null)H.Af(z)
+if(y==null)H.qw(z)
 else y.$1(z)},
-HM:function(a){return H.eT(a.constructor!==Array?P.F(a,!0,null):a)},
+nB:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a.gOB(a),b)},
@@ -9026,14 +9097,14 @@
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
 else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,73],
 h:function(a,b){return P.Wu(J.WB(this.rq,b.gVs()),this.aL)},
-gGt:function(){return H.KL(this)},
-gS6:function(){return H.ch(this)},
-gBM:function(){return H.Sw(this)},
+gX3:function(){return H.KL(this)},
+gcO:function(){return H.ch(this)},
+gIv:function(){return H.Sw(this)},
 EK:function(){H.o2(this)},
 RM:function(a,b){if(J.xZ(J.yH(a),8640000000000000))throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,Vp,Eu,p2W,oXf,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,ek0,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
+static:{"^":"bS,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,bmS,o4I,T3F,ek0,yfk,lme",Gl:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.Vq("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.ci()
 x=z.pX
 if(1>=x.length)return H.e(x,1)
@@ -9049,7 +9120,7 @@
 if(6>=x.length)return H.e(x,6)
 r=y.$1(x[6])
 if(7>=x.length)return H.e(x,7)
-q=J.Dv(J.vX(new P.Rq().$1(x[7]),1000))
+q=J.NQ(J.vX(new P.Rq().$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
 o=x.length
@@ -9066,8 +9137,8 @@
 if(typeof l!=="number")return H.s(l)
 s=J.bI(s,n*l)}k=!0}else k=!1
 j=H.fu(w,v,u,t,s,r,q,k)
-if(j==null)throw H.b(P.cD("Time out of range",a,null))
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
+if(j==null)throw H.b(P.rr("Time out of range",a,null))
+return P.Wu(p?j+1:j,k)}else throw H.b(P.rr("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -9089,9 +9160,9 @@
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
-Vf:{
-"^":"lf;",
-$isVf:true},
+CP:{
+"^":"FK;",
+$isCP:true},
 "+double":0,
 a6:{
 "^":"a;m5<",
@@ -9123,7 +9194,7 @@
 Vy:function(a){return P.ii(0,0,Math.abs(this.m5),0,0,0)},
 J:function(a){return P.ii(0,0,-this.m5,0,0,0)},
 $isa6:true,
-static:{"^":"Bp7,zi,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,Wr,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
 "^":"TpZ:14;",
 $1:function(a){if(a>=100000)return H.d(a)
@@ -9169,7 +9240,7 @@
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
 v.IN+=typeof u==="string"?u:H.d(u)}this.ae.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.IN+"]"},"$0","gCR",0,0,73],
+return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+H.d(z.a)+"]"},"$0","gCR",0,0,73],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
@@ -9252,8 +9323,8 @@
 m=""
 l=""}k=z.Nj(w,n,o)
 if(typeof n!=="number")return H.s(n)
-return y+m+k+l+"\n"+C.xB.U(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,73],
-static:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
+return y+m+k+l+"\n"+C.yo.U(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,73],
+static:{rr:function(a,b,c){return new P.oe(a,b,c)}}},
 eV:{
 "^":"a;",
 bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,73],
@@ -9261,13 +9332,13 @@
 qo:{
 "^":"a;oc>",
 bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gCR",0,0,73],
-t:function(a,b){var z=H.vA(b,"expando$values")
-return z==null?null:H.vA(z,this.V2())},
-u:function(a,b,c){var z=H.vA(b,"expando$values")
+t:function(a,b){var z=H.of(b,"expando$values")
+return z==null?null:H.of(z,this.V2())},
+u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
 H.wV(b,"expando$values",z)}H.wV(z,this.V2(),c)},
 V2:function(){var z,y
-z=H.vA(this,"expando$key")
+z=H.of(this,"expando$key")
 if(z==null){y=$.Km
 $.Km=y+1
 z="expando$key$"+y
@@ -9277,7 +9348,7 @@
 "^":"a;",
 $isEH:true},
 KN:{
-"^":"lf;",
+"^":"FK;",
 $isKN:true},
 "+int":0,
 QV:{
@@ -9302,9 +9373,9 @@
 "^":"a;",
 bu:[function(a){return"null"},"$0","gCR",0,0,73]},
 "+Null":0,
-lf:{
+FK:{
 "^":"a;",
-$islf:true},
+$isFK:true},
 "+num":0,
 a:{
 "^":";",
@@ -9317,15 +9388,15 @@
 Od:{
 "^":"a;",
 $isOd:true},
-Ol:{
+z5:{
 "^":"mW;",
-$isOl:true,
+$isz5:true,
 $isyN:true},
 BpP:{
 "^":"a;"},
 VV:{
 "^":"a;n2,Mw",
-D5:function(a){var z,y
+wE:function(a){var z,y
 z=this.n2==null
 if(!z&&this.Mw==null)return
 y=$.hG
@@ -9347,17 +9418,17 @@
 "^":"a;",
 $isqU:true},
 "+String":0,
-ysG:{
-"^":"a;Y4,R0,So,ft",
+Kg:{
+"^":"a;Y4,R7,So,ft",
 gl:function(){return this.ft},
 G:function(){var z,y,x,w,v,u
 z=this.So
-this.R0=z
+this.R7=z
 y=this.Y4
 x=J.U6(y)
 if(z===x.gB(y)){this.ft=null
-return!1}w=x.j(y,this.R0)
-v=this.R0+1
+return!1}w=x.j(y,this.R7)
+v=this.R7+1
 if((w&64512)===55296&&v<x.gB(y)){u=x.j(y,v)
 if((u&64512)===56320){this.So=v+1
 this.ft=65536+((w&1023)<<10>>>0)+(u&1023)
@@ -9379,7 +9450,8 @@
 y=z.gl()
 this.IN+=typeof y==="string"?y:H.d(y)}}},
 V1:function(a){this.IN=""},
-bu:[function(a){return this.IN},"$0","gCR",0,0,73],
+bu:[function(a){var z=this.IN
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73],
 PD:function(a){if(typeof a==="string")this.IN=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
@@ -9392,23 +9464,27 @@
 "^":"a;",
 $isLz:true},
 q5:{
-"^":"a;Kk,QB,Ee,Fi,ku,xu,ys,o6,nO",
-gJf:function(a){var z=this.Kk
+"^":"a;Kk,Ni,Ee,Fi,ku,xu,ys,o6,nO",
+gJf:function(a){var z,y
+z=this.Kk
 if(z==null)return""
-if(J.Qe(z).nC(z,"["))return C.xB.Nj(z,1,z.length-1)
+y=J.Qe(z)
+if(y.nC(z,"["))return y.Nj(z,1,J.bI(y.gB(z),1))
 return z},
-gtp:function(a){var z=this.QB
-if(z==null)return P.Co(this.Fi)
+gtp:function(a){var z=this.Ni
+if(z==null)return P.SN(this.Fi)
 return z},
 gIi:function(a){return this.Ee},
-pi:function(a,b){if(a==="")return"/"+b
-return C.xB.Nj(a,0,C.xB.cn(a,"/")+1)+b},
-jI:function(a){if(a.length>0&&C.xB.j(a,0)===58)return!0
-return C.xB.OY(a,"/.")!==-1},
-jn:function(a){var z,y,x,w,v
+Bs:function(a,b){var z=J.x(a)
+if(z.n(a,""))return"/"+H.d(b)
+return z.Nj(a,0,z.cn(a,"/")+1)+H.d(b)},
+jI:function(a){var z=J.U6(a)
+if(J.xZ(z.gB(a),0)&&z.j(a,0)===58)return!0
+return z.OY(a,"/.")!==-1},
+mE:function(a){var z,y,x,w,v
 if(!this.jI(a))return a
 z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.Ff
+for(y=J.BQ(a,"/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.lo
 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
@@ -9424,38 +9500,38 @@
 if(""!==y){z.KF(y)
 z.KF(":")}x=this.Kk
 w=x==null
-if(!w||C.xB.nC(this.Ee,"//")||y==="file"){z.KF("//")
+if(!w||J.co(this.Ee,"//")||y==="file"){z.KF("//")
 y=this.ku
-if(C.xB.gor(y)){z.KF(y)
+if(J.pO(y)){z.KF(y)
 z.KF("@")}if(!w)z.KF(x)
-y=this.QB
+y=this.Ni
 if(y!=null){z.KF(":")
 z.KF(y)}}z.KF(this.Ee)
 y=this.xu
 if(y!=null){z.KF("?")
 z.KF(y)}y=this.ys
 if(y!=null){z.KF("#")
-z.KF(y)}return z.IN},"$0","gCR",0,0,73],
+z.KF(y)}y=z.IN
+return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isq5)return!1
-if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(this.ku===b.ku){y=this.gJf(this)
-x=z.gJf(b)
-if(y==null?x==null:y===x){y=this.gtp(this)
+if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(J.xC(this.ku,b.ku))if(J.xC(this.gJf(this),z.gJf(b))){y=this.gtp(this)
 z=z.gtp(b)
-if(y==null?z==null:y===z)if(this.Ee===b.Ee){z=this.xu
+if(y==null?z==null:y===z)if(J.xC(this.Ee,b.Ee)){z=this.xu
 y=z==null
 x=b.xu
 w=x==null
 if(!y===!w){if(y)z=""
-if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.ys
+if(J.xC(z,w?"":x)){z=this.ys
 y=z==null
 x=b.ys
 w=x==null
 if(!y===!w){if(y)z=""
-z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
-else z=!1}else z=!1}else z=!1
+z=J.xC(z,w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
+else z=!1}else z=!1
+else z=!1
 else z=!1
 else z=!1
 return z},
@@ -9468,7 +9544,7 @@
 v=this.ys
 return z.$2(this.Fi,z.$2(this.ku,z.$2(y,z.$2(x,z.$2(this.Ee,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,zk,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",Co:function(a){if(a==="http")return 80
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,xF,SpW,GPf,JA7,iTk,Uo0,wo,SQU,rvM,fbQ",SN:function(a){if(a==="http")return 80
 if(a==="https")return 443
 return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z={}
@@ -9489,7 +9565,7 @@
 x=0
 break}if(u===47){x=v===0?2:1
 y=0
-break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
+break}if(u===58){if(v===0)P.Xz(a,0,"Invalid empty scheme")
 z.a=P.iy(a,v);++v
 if(v===w){z.f=-1
 x=0}else{if(v>=w)H.vh(P.N(v))
@@ -9502,7 +9578,7 @@
 if(x===2){t=v+1
 z.e=t
 if(t===w){z.f=-1
-x=0}else{u=C.xB.j(a,t)
+x=0}else{u=C.yo.j(a,t)
 z.f=u
 if(u===47){++z.e
 new P.BH(z,a,-1).$0()
@@ -9514,73 +9590,69 @@
 if(u===63||u===35)break
 z.f=-1}s=z.a
 r=z.c
-q=P.qd(a,y,z.e,null,r!=null,s==="file")
+q=P.re(a,y,z.e,null,r!=null,s==="file")
 s=z.f
-if(s===63){p=C.xB.XU(a,"#",z.e+1)
+if(s===63){p=C.yo.XU(a,"#",z.e+1)
 s=z.e+1
 if(p<0){o=P.AN(a,s,w,null)
 n=null}else{o=P.AN(a,s,p,null)
-n=P.jr(a,p+1,w)}}else{n=s===35?P.jr(a,z.e+1,w):null
+n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
 o=null}w=z.a
 s=z.b
-return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.Co(b))return
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},Xz:function(a,b,c){throw H.b(P.rr(c,a,b))},Ec:function(a,b){if(a!=null&&a===P.SN(b))return
 return a},L7:function(a,b,c,d){var z,y
 if(a==null)return
 if(b===c)return""
-if(C.xB.j(a,b)===91){z=c-1
-if(C.xB.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
+if(C.yo.j(a,b)===91){z=c-1
+if(C.yo.j(a,z)!==93)P.Xz(a,b,"Missing end `]` to match `[` in host")
 P.eg(a,b+1,z)
-return C.xB.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
+return C.yo.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
 if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a,b,c)
-return"["+a+"]"}}return P.cq(a,b,c)},cq:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
-for(z=b,y=z,x=null,w=!0;z<c;){a.toString
-if(z<0)H.vh(P.N(z))
-v=a.length
-if(z>=v)H.vh(P.N(z))
-u=a.charCodeAt(z)
-if(u===37){t=P.Yi(a,z,!0)
-v=t==null
-if(v&&w){z+=3
-continue}if(x==null){x=new P.Rn("")
-x.IN=""}s=C.xB.Nj(a,y,z)
-if(!w)s=s.toLowerCase()
-x.toString
-x.IN=x.IN+s
-if(v){t=C.xB.Nj(a,z,z+3)
-r=3}else if(t==="%"){t="%25"
-r=1}else r=3
-x.IN+=t
-z+=r
-y=z
-w=!0}else{if(u<127){q=u>>>4
-if(q>=8)return H.e(C.aa,q)
-q=(C.aa[q]&C.jn.iK(1,u&15))!==0}else q=!1
-if(q){if(w&&65<=u&&90>=u){if(x==null){x=new P.Rn("")
-x.IN=""}if(y<z){v=C.xB.Nj(a,y,z)
-x.toString
-x.IN=x.IN+v
-y=z}w=!1}++z}else{if(u<=93){q=u>>>4
-if(q>=8)return H.e(C.rz,q)
-q=(C.rz[q]&C.jn.iK(1,u&15))!==0}else q=!1
-if(q)P.iV(a,z,"Invalid character")
-else{if((u&64512)===55296&&z+1<c){q=z+1
-if(q<0)H.vh(P.N(q))
-if(q>=v)H.vh(P.N(q))
-p=a.charCodeAt(q)
+return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+for(z=a.length,y=b,x=y,w=null,v=!0;y<c;){if(y<0)H.vh(P.N(y))
+if(y>=z)H.vh(P.N(y))
+u=a.charCodeAt(y)
+if(u===37){t=P.Yi(a,y,!0)
+s=t==null
+if(s&&v){y+=3
+continue}if(w==null){w=new P.Rn("")
+w.IN=""}r=C.yo.Nj(a,x,y)
+if(!v)r=r.toLowerCase()
+w.IN=w.IN+r
+if(s){t=C.yo.Nj(a,y,y+3)
+q=3}else if(t==="%"){t="%25"
+q=1}else q=3
+w.IN+=t
+y+=q
+x=y
+v=!0}else{if(u<127){s=u>>>4
+if(s>=8)return H.e(C.aa,s)
+s=(C.aa[s]&C.jn.iK(1,u&15))!==0}else s=!1
+if(s){if(v&&65<=u&&90>=u){if(w==null){w=new P.Rn("")
+w.IN=""}if(x<y){s=C.yo.Nj(a,x,y)
+w.IN=w.IN+s
+x=y}v=!1}++y}else{if(u<=93){s=u>>>4
+if(s>=8)return H.e(C.rz,s)
+s=(C.rz[s]&C.jn.iK(1,u&15))!==0}else s=!1
+if(s)P.Xz(a,y,"Invalid character")
+else{if((u&64512)===55296&&y+1<c){s=y+1
+if(s<0)H.vh(P.N(s))
+if(s>=z)H.vh(P.N(s))
+p=a.charCodeAt(s)
 if((p&64512)===56320){u=(65536|(u&1023)<<10|p&1023)>>>0
-r=2}else r=1}else r=1
-if(x==null){x=new P.Rn("")
-x.IN=""}s=C.xB.Nj(a,y,z)
-if(!w)s=s.toLowerCase()
-x.toString
-x.IN=x.IN+s
-v=P.mC(u)
-x.IN+=v
-z+=r
-y=z}}}}if(x==null)return J.Nj(a,b,c)
-if(y<c){s=J.Nj(a,y,c)
-x.KF(!w?s.toLowerCase():s)}return x.bu(0)},iy:function(a,b){var z,y,x,w,v,u,t,s
+q=2}else q=1}else q=1
+if(w==null){w=new P.Rn("")
+w.IN=""}r=C.yo.Nj(a,x,y)
+if(!v)r=r.toLowerCase()
+w.IN=w.IN+r
+s=P.xo(u)
+w.IN+=s
+y+=q
+x=y}}}}if(w==null)return C.yo.Nj(a,b,c)
+if(x<c){r=C.yo.Nj(a,x,c)
+w.KF(!v?r.toLowerCase():r)}z=w.IN
+return z.charCodeAt(0)==0?z:z},iy:function(a,b){var z,y,x,w,v,u,t,s
 if(b===0)return""
 a.toString
 z=a.length
@@ -9589,21 +9661,22 @@
 x=y>=97
 if(!(x&&y<=122))w=y>=65&&y<=90
 else w=!0
-if(!w)P.iV(a,0,"Scheme not starting with alphabetic character")
+if(!w)P.Xz(a,0,"Scheme not starting with alphabetic character")
 for(w=97<=y,v=122>=y,u=0;u<b;++u){if(u>=z)H.vh(P.N(u))
 t=a.charCodeAt(u)
 if(t<128){s=t>>>4
-if(s>=8)return H.e(C.qq,s)
-s=(C.qq[s]&C.jn.iK(1,t&15))!==0}else s=!1
-if(!s)P.iV(a,u,"Illegal scheme character")
+if(s>=8)return H.e(C.mKy,s)
+s=(C.mKy[s]&C.jn.iK(1,t&15))!==0}else s=!1
+if(!s)P.Xz(a,u,"Illegal scheme character")
 if(w&&v)x=!1}a=J.Nj(a,0,b)
 return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
-return P.Xc(a,b,c,C.jx)},qd:function(a,b,c,d,e,f){var z,y
+return P.Xc(a,b,c,C.jx)},re:function(a,b,c,d,e,f){var z,y
 z=a==null
 if(z&&!0)return f?"/":""
 z=!z
-if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.UU()).zV(0,"/")
-if(C.xB.gl0(y)){if(f)return"/"}else if((f||e)&&C.xB.j(y,0)!==47)return"/"+y
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.bP.ez(d,new P.Kd()).zV(0,"/")
+z=J.U6(y)
+if(z.gl0(y)===!0){if(f)return"/"}else if((f||e)&&z.j(y,0)!==47)return"/"+H.d(y)
 return y},AN:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
@@ -9612,8 +9685,9 @@
 if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.jN.aN(d,new P.Sz(z,x))
-return x.IN},jr:function(a,b,c){if(a==null)return
+C.bP.aN(d,new P.Ue(z,x))
+z=x.IN
+return z.charCodeAt(0)==0?z:z},o6:function(a,b,c){if(a==null)return
 return P.Xc(a,b,c,C.o5)},qr:function(a){if(57>=a)return 48<=a
 a|=32
 return 97<=a&&102>=a},RD:function(a){if(57>=a)return a-48
@@ -9622,7 +9696,6 @@
 y=a.length
 if(z>=y)return"%"
 x=b+1
-a.toString
 if(x<0)H.vh(P.N(x))
 if(x>=y)H.vh(P.N(x))
 w=a.charCodeAt(x)
@@ -9634,8 +9707,8 @@
 if(z>=8)return H.e(C.B2,z)
 z=(C.B2[z]&C.jn.iK(1,u&15))!==0}else z=!1
 if(z)return H.mx(c&&65<=u&&90>=u?(u|32)>>>0:u)
-if(w>=97||v>=97)return J.Nj(a,b,b+3).toUpperCase()
-return},mC:function(a){var z,y,x,w,v,u,t,s
+if(w>=97||v>=97)return C.yo.Nj(a,b,b+3).toUpperCase()
+return},xo:function(a){var z,y,x,w,v,u,t,s
 if(a<128){z=Array(3)
 z.fixed$length=init
 z[0]=37
@@ -9661,46 +9734,44 @@
 t="0123456789ABCDEF".charCodeAt(u&15)
 if(s>=y)return H.e(z,s)
 z[s]=t
-v+=3}}return H.eT(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-for(z=b,y=z,x=null;z<c;){a.toString
-if(z<0)H.vh(P.N(z))
-w=a.length
-if(z>=w)H.vh(P.N(z))
-v=a.charCodeAt(z)
+v+=3}}return H.LY(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+for(z=a.length,y=b,x=y,w=null;y<c;){if(y<0)H.vh(P.N(y))
+if(y>=z)H.vh(P.N(y))
+v=a.charCodeAt(y)
 if(v<127){u=v>>>4
 if(u>=8)return H.e(d,u)
 u=(d[u]&C.jn.iK(1,v&15))!==0}else u=!1
-if(u)++z
-else{if(v===37){t=P.Yi(a,z,!1)
-if(t==null){z+=3
+if(u)++y
+else{if(v===37){t=P.Yi(a,y,!1)
+if(t==null){y+=3
 continue}if("%"===t){t="%25"
 s=1}else s=3}else{if(v<=93){u=v>>>4
 if(u>=8)return H.e(C.rz,u)
 u=(C.rz[u]&C.jn.iK(1,v&15))!==0}else u=!1
-if(u){P.iV(a,z,"Invalid character")
+if(u){P.Xz(a,y,"Invalid character")
 t=null
-s=null}else{if((v&64512)===55296){u=z+1
+s=null}else{if((v&64512)===55296){u=y+1
 if(u<c){if(u<0)H.vh(P.N(u))
-if(u>=w)H.vh(P.N(u))
+if(u>=z)H.vh(P.N(u))
 r=a.charCodeAt(u)
 if((r&64512)===56320){v=(65536|(v&1023)<<10|r&1023)>>>0
 s=2}else s=1}else s=1}else s=1
-t=P.mC(v)}}if(x==null){x=new P.Rn("")
-x.IN=""}w=C.xB.Nj(a,y,z)
-x.toString
-x.IN=x.IN+w
-x.IN+=typeof t==="string"?t:H.d(t)
+t=P.xo(v)}}if(w==null){w=new P.Rn("")
+w.IN=""}u=C.yo.Nj(a,x,y)
+w.IN=w.IN+u
+w.IN+=typeof t==="string"?t:H.d(t)
 if(typeof s!=="number")return H.s(s)
-z+=s
-y=z}}if(x==null)return J.Nj(a,b,c)
-if(y<c)x.KF(J.Nj(a,y,c))
-return x.bu(0)},Ms:function(a,b){return H.n3(J.BQ(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
+y+=s
+x=y}}if(w==null)return C.yo.Nj(a,b,c)
+if(x<c)w.KF(C.yo.Nj(a,x,c))
+z=w.IN
+return z.charCodeAt(0)==0?z:z},WX:function(a,b){return H.n3(J.BQ(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
 z=new P.JV()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
 return H.VM(new H.A8(y,new P.to(z)),[null,null]).br(0)},eg:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 if(c==null)c=J.q8(a)
-z=new P.x8(a)
+z=new P.kZ(a)
 y=new P.ZN(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
@@ -9711,34 +9782,32 @@
 if(typeof s!=="number")return H.s(s)
 if(!(u<s))break
 s=a
-s.toString
 if(u<0)H.vh(P.N(u))
 r=J.q8(s)
 if(typeof r!=="number")return H.s(r)
 if(u>=r)H.vh(P.N(u))
 if(s.charCodeAt(u)===58){if(u===b){++u
 s=a
-s.toString
 if(u<0)H.vh(P.N(u))
 if(u>=J.q8(s))H.vh(P.N(u))
 if(s.charCodeAt(u)!==58)z.$2("invalid start colon.",u)
 w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",u)
-J.bi(x,-1)
-t=!0}else J.bi(x,y.$2(w,u))
+J.dH(x,-1)
+t=!0}else J.dH(x,y.$2(w,u))
 w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
 q=J.xC(w,c)
-p=J.xC(J.MQ(x),-1)
+p=J.xC(J.OH(x),-1)
 if(q&&!p)z.$2("expected a part after last `:`",c)
-if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
+if(!q)try{J.dH(x,y.$2(w,c))}catch(o){H.Ru(o)
 try{v=P.Dy(J.Nj(a,w,c))
-s=J.Eh(J.UQ(v,0),8)
+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.Eh(J.UQ(v,2),8)
+J.dH(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)
+J.dH(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.$2("invalid end of IPv6 address.",w)}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 n=Array(16)
 n.$builtinTypeInfo=[P.KN]
@@ -9762,20 +9831,20 @@
 s=s.i(l,255)
 if(r>=16)return H.e(n,r)
 n[r]=s
-m+=2}++u}return n},jW:function(a,b,c,d){var z,y,x,w,v,u,t
+m+=2}++u}return n},Mp:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
-x=c.gZE().Sw(b)
-for(w=0;w<x.length;++w){v=x[w]
-u=J.Wx(v)
-if(u.C(v,128)){t=u.m(v,4)
+x=c.gZE().WJ(b)
+for(w=x.length,v=0;v<w;++v){u=x[v]
+if(u<128){t=u>>>4
 if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.iK(1,u.i(v,15)))!==0}else t=!1
-if(t){u=H.mx(v)
-y.IN+=u}else if(d&&u.n(v,32)){u=H.mx(43)
-y.IN+=u}else{u=H.mx(37)
-y.IN+=u
-z.$2(v,y)}}return y.IN},tN:function(a,b){var z,y,x,w
+t=(a[t]&C.jn.iK(1,u&15))!==0}else t=!1
+if(t){t=H.mx(u)
+y.IN+=t}else if(d&&u===32){t=H.mx(43)
+y.IN+=t}else{t=H.mx(37)
+y.IN+=t
+z.$2(u,y)}}z=y.IN
+return z.charCodeAt(0)==0?z:z},tN:function(a,b){var z,y,x,w
 for(z=J.Qe(a),y=0,x=0;x<2;++x){w=z.j(a,b+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
@@ -9802,8 +9871,8 @@
 if(x+3>w)throw H.b(P.u("Truncated URI"))
 u.push(P.tN(a,x+1))
 x+=2}else if(c&&v===43)u.push(32)
-else u.push(v);++x}}t=b.QA
-return new P.GY(t).Sw(u)}}},
+else u.push(v);++x}}t=b.ns
+return new P.GY(t).WJ(u)}}},
 hP2:{
 "^":"TpZ:147;",
 $1:function(a){a.C(0,128)
@@ -9825,7 +9894,7 @@
 if(r===47||r===63||r===35)break
 if(r===64){t=z.e
 u=-1}else if(r===58)u=z.e
-else if(r===91){q=C.xB.XU(x,"]",z.e+1)
+else if(r===91){q=C.yo.XU(x,"]",z.e+1)
 if(q===-1){z.e=w
 z.f=v
 u=-1
@@ -9836,45 +9905,47 @@
 y=t+1}if(u>=0){o=u+1
 if(o<z.e)for(n=0;o<z.e;++o){if(o>=w)H.vh(P.N(o))
 m=x.charCodeAt(o)
-if(48>m||57<m)P.iV(x,o,"Invalid port number")
+if(48>m||57<m)P.Xz(x,o,"Invalid port number")
 n=n*10+(m-48)}else n=null
-z.d=P.JF(n,z.a)
+z.d=P.Ec(n,z.a)
 p=u}z.c=P.L7(x,y,p,!0)
 s=z.e
-if(s<w)z.f=C.xB.j(x,s)},
+if(s<w)z.f=C.yo.j(x,s)},
 $isEH:true},
-UU:{
+Kd:{
 "^":"TpZ:12;",
-$1:function(a){return P.jW(C.yk,a,C.xM,!1)},
+$1:function(a){return P.Mp(C.jr,a,C.xM,!1)},
 $isEH:true},
-Sz:{
+Ue:{
 "^":"TpZ:81;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
 z=this.b
-z.KF(P.jW(C.B2,a,C.xM,!0))
+z.KF(P.Mp(C.B2,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.B2,b,C.xM,!0))},
+z.KF(P.Mp(C.B2,b,C.xM,!0))},
 $isEH:true},
 XZ:{
 "^":"TpZ:148;",
-$2:function(a,b){return b*31+J.v1(a)&1073741823},
+$2:function(a,b){var z=J.v1(a)
+if(typeof z!=="number")return H.s(z)
+return b*31+z&1073741823},
 $isEH:true},
 qz:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
 y=z.OY(b,"=")
-if(y===-1){if(!z.n(b,""))J.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
+if(y===-1){if(!z.n(b,""))J.qQ(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
 z=this.a
-J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
+J.qQ(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
 $isEH:true},
 JV:{
 "^":"TpZ:44;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
+$1:function(a){throw H.b(P.rr("Illegal IPv4 address, "+a,null,null))},
 $isEH:true},
 to:{
 "^":"TpZ:12;a",
@@ -9884,16 +9955,16 @@
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
 return z},"$1",null,2,0,null,149,"call"],
 $isEH:true},
-x8:{
+kZ:{
 "^":"TpZ:150;a",
-$2:function(a,b){throw H.b(P.cD("Illegal IPv6 address, "+a,this.a,b))},
+$2:function(a,b){throw H.b(P.rr("Illegal IPv6 address, "+a,this.a,b))},
 $1:function(a){return this.$2(a,null)},
 $isEH:true},
 ZN:{
 "^":"TpZ:100;b,c",
 $2:function(a,b){var z,y
 if(b-a>4)this.c.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
-z=H.BU(J.Nj(this.b,a,b),16,null)
+z=H.BU(C.yo.Nj(this.b,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.c.$2("each part must be in the range of `0x0..0xFFFF`",a)
 return z},
@@ -9901,8 +9972,8 @@
 rI:{
 "^":"TpZ:81;",
 $2:function(a,b){var z=J.Wx(a)
-b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
+b.KF(H.mx(C.yo.j("0123456789ABCDEF",z.m(a,4))))
+b.KF(H.mx(C.yo.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["","",,W,{
 "^":"",
 Q8:function(a,b,c,d){var z,y,x
@@ -9912,25 +9983,25 @@
 if(typeof y!=="string"){y=d
 y=typeof y==="number"}else y=!0}else y=!0
 else y=!0
-if(y)try{d=P.pf(d)
+if(y)try{d=P.jl(d)
 J.z7Y(z,a,b,c,d)}catch(x){H.Ru(x)
 J.z7Y(z,a,b,c,null)}else J.z7Y(z,a,b,c,null)
 return z},
 r3:function(a,b){return document.createElement(a)},
-qw:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+Kz:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
 lt:function(a,b,c,d,e,f,g,h){var z,y,x
-z=W.fJ
+z=W.O7
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
 C.W3.i3(x,"GET",a,!0)
-z=H.VM(new W.RO(x,C.LF.fA,!1),[null])
+z=H.VM(new W.vG(x,"load",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new W.bU(y,x)),z.el),[H.u3(z,0)]).DN()
-z=H.VM(new W.RO(x,C.JN.fA,!1),[null])
+z=H.VM(new W.vG(x,"error",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(y.gYJ()),z.el),[H.u3(z,0)]).DN()
 x.send()
 return y.MM},
-Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Iq(a),2))},
-P0:function(a,b){var z,y
+Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(a),2))},
+D7:function(a,b){var z,y
 z=typeof a!=="string"
 if((!z||a==null)&&!0)return new WebSocket(a)
 y=H.RB(b,"$isWO",[P.qU],"$asWO")
@@ -9939,39 +10010,39 @@
 z=!z||a==null
 if(z)return new WebSocket(a,b)
 throw H.b(P.u("Incorrect number or type of arguments"))},
-VC:function(a,b){a=536870911&a+b
+Zm: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
+xj:function(a){var z
 if(a==null)return
 if("postMessage" in a){z=W.P1(a)
-if(!!J.x(z).$isPZ)return z
+if(!!J.x(z).$isFU)return z
 return}else return a},
-Pd:function(a){if(!!J.x(a).$isYN)return a
+Pd:function(a){if(!!J.x(a).$isSy)return a
 return P.o7(a,!0)},
-v8:function(a,b){return new W.uY(a,b)},
+Rl:function(a,b){return new W.uY(a,b)},
 z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
-Hx:[function(a){return J.o6(a)},"$1","oo",2,0,12,56],
-Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
-Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Dc(d)
+Hx:[function(a){return J.qq(a)},"$1","HM",2,0,12,56],
+Hw:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","NB",8,0,57,56,58,59,60],
+wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
-x=J.KE(d,"created")
+x=J.YC(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.aN(W.r3("article",null))
+J.MZ(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
 if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Rl(x,y),1))}
 t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.oo(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
+t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.NB(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
 Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
@@ -9979,44 +10050,43 @@
 if(!v)q.extends=e
 b.registerElement(c,q)},
 Yt:function(a){if(J.xC($.X3,C.NU))return a
-if(a==null)return
 return $.X3.rO(a,!0)},
-Iq:function(a){if(J.xC($.X3,C.NU))return a
+K2:function(a){if(J.xC($.X3,C.NU))return a
 return $.X3.PT(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|uV|WZq|NY|SaM|JI|Tk|pva|ZP|cda|nJ|KAf|Eg|i7|waa|Gk|V10|J3|V11|MJ|T53|DK|V12|BS|V13|Vb|V14|Ly|V15|Im|pR|V16|EZ|V17|L4|Mb|V18|mO|DE|V19|U1|V20|H8|WS|qh|V21|oF|V22|Q6|uE|V23|Zn|V24|n5|V25|Ma|wN|V26|ds|V27|qM|ZzR|av|V28|uz|V29|kK|oa|V30|St|V31|IW|V32|Qh|V33|Oz|V34|Z4|V35|qk|V36|vj|LU|V37|CX|V38|qn|V39|I2|V40|FB|V41|md|V42|Bm|V43|Ya|V44|Ww|ye|V45|G1|V46|fl|V47|UK|V48|wM|V49|NK|V50|Zx|V51|qV|V52|F1|V53|ov|V54|vr|oEY|kn|V55|fI|V56|zM|V57|Rk|V58|Ti|V59|Um|V60|VZ|V61|WG|V62|f7|ImK|CY|V63|nm|V64|Vu|V65|Pa|V66|D2|I5|V67|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|uV|WZq|NY|SaM|JI|Tk|pva|ZP|cda|nJ|KAf|Eg|i7|waa|Gk|V10|J3|V11|MJ|T53|DK|V12|BS|V13|Vb|V14|Ly|V15|Im|pR|V16|EZ|V17|L4|Mb|V18|mO|DE|V19|U1|V20|H8|WS|qh|V21|oF|V22|Q6|uE|V23|Zn|V24|n5|V25|Ma|wN|V26|ds|V27|qM|ZzR|av|V28|uz|V29|kK|oa|V30|St|V31|IW|V32|Qh|V33|Oz|V34|Z4|V35|qk|V36|vj|LU|V37|CX|V38|qn|V39|I2|V40|FB|V41|md|V42|Bm|V43|Ya|V44|Ww|ye|V45|G1|V46|fl|V47|UK|V48|wM|V49|NK|V50|Zx|V51|qV|V52|NT|V53|F1|V54|ov|V55|vr|oEY|kn|V56|fI|V57|zM|V58|Rk|V59|Ti|V60|Um|V61|VZ|V62|WG|V63|f7|Ce|ImK|CY|V64|nm|V65|Vu|V66|Pa|V67|D2|I5|V68|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.QI]},
+$asWO:function(){return[W.M5K]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[W.QI]},
+$asQV:function(){return[W.M5K]},
 "%":"EntryArray"},
 Ps:{
-"^":"Bo;N:target%,t5:type=,mH:href%,aB:protocol=",
+"^":"Bo;N:target%,t5:type=,LU:href%,A8:protocol=",
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAnchorElement"},
-fY:{
-"^":"Bo;N:target%,mH:href%,aB:protocol=",
+fYK:{
+"^":"Bo;N:target%,LU:href%,A8:protocol=",
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAreaElement"},
 rZg:{
-"^":"Bo;mH:href%,N:target%",
+"^":"Bo;LU:href%,N:target%",
 "%":"HTMLBaseElement"},
 O4:{
-"^":"Gv;yT:size=,t5:type=",
+"^":"Gv;ky:size=,t5:type=",
 $isO4:true,
 "%":";Blob"},
 QPB:{
 "^":"Bo;",
-$isPZ:true,
+$isFU:true,
 "%":"HTMLBodyElement"},
-Ox:{
+IFv:{
 "^":"Bo;oc:name%,t5:type=,P:value%",
 "%":"HTMLButtonElement"},
-Ny9:{
+Nu:{
 "^":"Bo;fg:height%,R:width}",
 gVE:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
@@ -10025,7 +10095,7 @@
 "%":";CanvasRenderingContext"},
 Gcw:{
 "^":"Y5K;",
-A8:function(a,b,c,d,e,f,g,h){var z
+kN:function(a,b,c,d,e,f,g,h){var z
 if(g!=null)z=!0
 else z=!1
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
@@ -10036,18 +10106,17 @@
 "%":"Comment;CharacterData"},
 BI:{
 "^":"ea;tT:code=",
-$isBI:true,
 "%":"CloseEvent"},
-di:{
+y4f:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-DG4:{
+Rb:{
 "^":"ea;NJ:_dartDetail}",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
 GM:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$isDG4:true,
+$isRb:true,
 "%":"CustomEvent"},
 vHT:{
 "^":"Bo;bG:options=",
@@ -10060,66 +10129,66 @@
 "^":"Bo;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDialogElement"},
-YN:{
+Sy:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
-d2:function(a,b,c){return a.importNode(b,c)},
-XT:function(a,b){return a.querySelector(b)},
-VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isYN:true,
+ek:function(a,b,c){return a.importNode(b,c)},
+Wk:function(a,b){return a.querySelector(b)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+$isSy:true,
 "%":"XMLDocument;Document"},
 hsw:{
 "^":"KV;",
-gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
+gqu:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.P0(a,new W.OB(a)),[null])
 return a._docChildren},
-VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-XT:function(a,b){return a.querySelector(b)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Wk:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
 cmJ:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
-BK:{
+Nh:{
 "^":"Gv;G1:message=",
 goc:function(a){var z=a.name
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
-$isBK:true,
+$isNh:true,
 "%":"DOMException"},
 h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,ke:nextElementSibling=",
+"^":"KV;ka:title},xr:className%,jO:id=,q5:tagName=,ke:nextElementSibling=",
 gQg:function(a){return new W.E9(a)},
-gks:function(a){return new W.VG(a,a.children)},
-VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+gqu:function(a){return new W.VG(a,a.children)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
 gD7:function(a){return P.T7(C.CD.yu(C.CD.RE(a.offsetLeft)),C.CD.yu(C.CD.RE(a.offsetTop)),C.CD.yu(C.CD.RE(a.offsetWidth)),C.CD.yu(C.CD.RE(a.offsetHeight)),null)},
 Es:function(a){},
-Lx:function(a){},
-wN:function(a,b,c,d){},
+dQ:function(a){},
+aC:function(a,b,c,d){},
 gqn:function(a){return a.localName},
 gKD:function(a){return a.namespaceURI},
 bu:[function(a){return a.localName},"$0","gCR",0,0,73],
-xZ:function(a,b){if(!!a.matches)return a.matches(b)
+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.wK(z,b))return!0
+jn:function(a,b){var z=a
+do{if(J.YN(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
-TL:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
+er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-XT:function(a,b){return a.querySelector(b)},
-gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
-gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
+Wk:function(a,b){return a.querySelector(b)},
+gVY:function(a){return H.VM(new W.eu(a,"mousedown",!1),[null])},
+gf0:function(a){return H.VM(new W.eu(a,"mousemove",!1),[null])},
 LX:function(a){},
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 "%":";Element"},
 fC:{
 "^":"Bo;fg:height%,oc:name%,t5:type=,R:width}",
@@ -10129,17 +10198,17 @@
 "%":"ErrorEvent"},
 ea:{
 "^":"Gv;dl:_selector},Ii:path=,Ea:timeStamp=,t5:type=",
-gF0:function(a){return W.qc(a.currentTarget)},
-gN:function(a){return W.qc(a.target)},
-e6:function(a){return a.preventDefault()},
+gXQ:function(a){return W.xj(a.currentTarget)},
+gN:function(a){return W.xj(a.target)},
+TI:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
-PZ:{
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
+FU:{
 "^":"Gv;",
 On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-Ph:function(a,b){return a.dispatchEvent(b)},
+jR:function(a,b){return a.dispatchEvent(b)},
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isPZ:true,
+$isFU:true,
 "%":";EventTarget"},
 Ao:{
 "^":"Bo;P9:elements=,oc:name%,t5:type=",
@@ -10148,22 +10217,22 @@
 "^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
-QU:{
+AaI:{
 "^":"cmJ;tT:code=",
 "%":"FileError"},
 H05:{
-"^":"PZ;kc:error=",
+"^":"FU;kc:error=",
 gyG:function(a){var z=a.result
-if(!!J.x(z).$isaI)return H.z4(z,0,null)
+if(!!J.x(z).$isaI)return H.GG(z,0,null)
 return z},
 "%":"FileReader"},
-jH:{
+YuD:{
 "^":"Bo;B:length=,oc:name%,N:target%",
 "%":"HTMLFormElement"},
-u9:{
+iGN:{
 "^":"Bo;ih:color%",
 "%":"HTMLHRElement"},
-us:{
+UT:{
 "^":"Gv;B:length=",
 "%":"History"},
 xnd:{
@@ -10174,7 +10243,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -10189,20 +10258,20 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 Vbi:{
-"^":"YN;",
+"^":"Sy;",
 gQr:function(a){return a.head},
-smk:function(a,b){a.title=b},
+ska:function(a,b){a.title=b},
 "%":"HTMLDocument"},
-fJ:{
+O7:{
 "^":"waV;il:responseText=,pf:status=",
 gn9:function(a){return W.Pd(a.response)},
 Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 i3:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
-$isfJ:true,
+$isO7:true,
 "%":"XMLHttpRequest"},
 waV:{
-"^":"PZ;",
+"^":"FU;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
 "^":"Bo;fg:height%,oc:name%,R:width}",
@@ -10215,54 +10284,54 @@
 "^":"Bo;fg:height%,EE:isMap=,R:width}",
 j3:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
-Mi:{
-"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,yT:size=,t5:type=,P:value%,R:width}",
+Sc:{
+"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,ky:size=,t5:type=,P:value%,R:width}",
 RR:function(a,b){return a.accept.$1(b)},
-$isMi:true,
+$isSc:true,
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 $isKV:true,
 "%":"HTMLInputElement"},
 AD:{
-"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+"^":"w6O;w4:altKey=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
 "%":"KeyboardEvent"},
 In:{
 "^":"Bo;oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wPF:{
+pL:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 Ogt:{
-"^":"Bo;mH:href%,t5:type=",
+"^":"Bo;LU:href%,t5:type=",
 "%":"HTMLLinkElement"},
 u8r:{
-"^":"Gv;mH:href=,aB:protocol=",
+"^":"Gv;LU:href=,A8:protocol=",
 VD:function(a){return a.reload()},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"Location"},
-jJ:{
+M6O:{
 "^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
 ftg:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-WJ:[function(a){return a.pause()},"$0","gX0",0,0,17],
+zd:[function(a){return a.pause()},"$0","gX0",0,0,17],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"dZ5<"}},
 mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Wyx:{
+Y7:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
-aBv:{
+wq:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
 fJn:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 D80:{
-"^":"PZ;jO:id=,ph:label=",
+"^":"FU;jO:id=,ph:label=",
 "%":"MediaStream"},
 VhH:{
 "^":"ea;vq:stream=",
@@ -10270,8 +10339,7 @@
 cxu:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-gFF:function(a){return W.qc(a.source)},
-$iscxu:true,
+gFF:function(a){return W.xj(a.source)},
 "%":"MessageEvent"},
 EeC:{
 "^":"Bo;rz:content=,oc:name%",
@@ -10279,33 +10347,28 @@
 QbE:{
 "^":"Bo;A5:max=,Bp:min=,P:value%",
 "%":"HTMLMeterElement"},
-PGY:{
-"^":"ea;",
-$isPGY:true,
-"%":"MIDIConnectionEvent"},
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bnE:{
 "^":"Imr;",
-EZ:function(a,b,c){return a.send(b,c)},
+LV:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 Imr:{
-"^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
-giG:function(a){return H.VM(new W.RO(a,C.iw.fA,!1),[null])},
+"^":"FU;jO:id=,oc:name=,t5:type=,Ye:version=",
+giG:function(a){return H.VM(new W.vG(a,"disconnect",!1),[null])},
 "%":"MIDIInput;MIDIPort"},
-AjY:{
-"^":"w6O;YK:altKey=,EV:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+v3:{
+"^":"w6O;w4:altKey=,Ay:button=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
 gD7:function(a){var z,y
 if(!!a.offsetX)return H.VM(new P.hL(a.offsetX,a.offsetY),[null])
-else{if(!J.x(W.qc(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
-z=W.qc(a.target)
-y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.nN(J.tG(z)))
+else{if(!J.x(W.xj(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
+z=W.xj(a.target)
+y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.mB(z)))
 return H.VM(new P.hL(J.XHl(y.x),J.XHl(y.y)),[null])}},
-$isAjY:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-x76:{
+H9:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
 jh:function(a,b,c,d,e,f,g,h,i){var z,y
@@ -10329,16 +10392,16 @@
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"PZ;NL:firstChild=,uD:nextSibling=,J8:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
-gUN:function(a){return new W.wi(a)},
+"^":"FU;NL:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
+gdH:function(a){return new W.OB(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
-Tk:function(a,b){var z,y
+YP:function(a,b){var z,y
 try{z=a.parentNode
-J.LW(z,b,a)}catch(y){H.Ru(y)}return a},
+J.jk(z,b,a)}catch(y){H.Ru(y)}return a},
 aD:function(a,b,c){var z,y,x
 z=J.x(b)
-if(!!z.$iswi){z=b.uR
+if(!!z.$isOB){z=b.uR
 if(z===a)throw H.b(P.u(b))
 for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
 D4:function(a){var z
@@ -10347,8 +10410,8 @@
 return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gCR",0,0,73],
 mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-FO:function(a,b,c){return a.insertBefore(b,c)},
-AS:function(a,b,c){return a.replaceChild(b,c)},
+mK:function(a,b,c){return a.insertBefore(b,c)},
+OP:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
 BH3:{
@@ -10359,7 +10422,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -10382,11 +10445,11 @@
 l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-lq:{
+Qlt:{
 "^":"Bo;vH:index=,ph:label%,P:value%",
-$islq:true,
+$isQlt:true,
 "%":"HTMLOptionElement"},
-Xp:{
+wL2:{
 "^":"Bo;oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 HDy:{
@@ -10394,7 +10457,6 @@
 "%":"HTMLParamElement"},
 niR:{
 "^":"ea;",
-$isniR:true,
 "%":"PopStateEvent"},
 S8:{
 "^":"Gv;tT:code=,G1:message=",
@@ -10407,7 +10469,6 @@
 "%":"HTMLProgressElement"},
 ew7:{
 "^":"ea;ox:loaded=",
-$isew7:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 bXi:{
 "^":"ew7;O3:url=",
@@ -10415,12 +10476,12 @@
 j24:{
 "^":"Bo;t5:type=",
 "%":"HTMLScriptElement"},
-bs:{
-"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},yT:size=,t5:type=,P:value%",
+zk:{
+"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},ky:size=,t5:type=,P:value%",
 gbG:function(a){var z=W.vD(a.querySelectorAll("option"),null)
 z=z.ad(z,new W.xv())
-return H.VM(new P.Yp(P.F(z,!0,H.W8(z,"mW",0))),[null])},
-$isbs:true,
+return H.VM(new P.Ui(P.F(z,!0,H.W8(z,"mW",0))),[null])},
+$iszk:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"hsw;",
@@ -10433,18 +10494,18 @@
 zD9:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-y0:{
+r5:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
 "^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-er:{
+KKC:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 AsS:{
 "^":"Gv;",
-FV:function(a,b){H.bQ(b,new W.AA(a))},
+FV:function(a,b){H.bQ(b,new W.lN(a))},
 NZ:function(a,b){return a.getItem(b)!=null},
 t:function(a,b){return a.getItem(b)},
 u:function(a,b,c){a.setItem(b,c)},
@@ -10460,7 +10521,7 @@
 this.aN(a,new W.wQ(z))
 return z},
 gUQ:function(a){var z=[]
-this.aN(a,new W.rs(z))
+this.aN(a,new W.We(z))
 return z},
 gB:function(a){return a.length},
 gl0:function(a){return a.key(0)==null},
@@ -10483,7 +10544,7 @@
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableElement"},
 Iv:{
-"^":"Bo;RH:rowIndex=",
+"^":"Bo;Cw:rowIndex=",
 iF:function(a,b){return a.insertCell(b)},
 $isIv:true,
 "%":"HTMLTableRowElement"},
@@ -10491,13 +10552,13 @@
 "^":"Bo;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableSectionElement"},
-OH:{
+yY:{
 "^":"Bo;rz:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|k5d|hg"},
-Un:{
+$isyY:true,
+"%":";HTMLTemplateElement;GLL|k5d|G0"},
+kJ:{
 "^":"nx;",
-$isUn:true,
+$iskJ:true,
 "%":"CDATASection|Text"},
 FBi:{
 "^":"Bo;oc:name%,vp:rows=,t5:type=,P:value%",
@@ -10506,7 +10567,7 @@
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
 y6:{
-"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+"^":"w6O;w4:altKey=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
 "%":"TouchEvent"},
 RHt:{
 "^":"Bo;fY:kind=,ph:label%",
@@ -10519,13 +10580,13 @@
 "^":"ftg;fg:height%,R:width}",
 "%":"HTMLVideoElement"},
 EKW:{
-"^":"PZ;aB:protocol=,O3:url=",
+"^":"FU;A8:protocol=,O3:url=",
 XW:function(a,b,c){return a.close(b,c)},
 xO:function(a){return a.close()},
 wR:function(a,b){return a.send(b)},
 "%":"WebSocket"},
 K5:{
-"^":"PZ;bq:history=,oc:name%,pf:status%",
+"^":"FU;bq:history=,oc:name%,pf:status%",
 ne:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
 Wq:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
 for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
@@ -10534,14 +10595,14 @@
 b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 xO:function(a){return a.close()},
-xc:function(a,b,c,d){a.postMessage(P.pf(b),c)
+xc:function(a,b,c,d){a.postMessage(P.jl(b),c)
 return},
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 $isK5:true,
-$isPZ:true,
+$isFU:true,
 "%":"DOMWindow|Window"},
-U3:{
+UM:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
 FR:{
@@ -10566,19 +10627,19 @@
 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)
+w=W.Zm(W.Zm(W.Zm(W.Zm(0,z),y),x),w)
 v=536870911&w+((67108863&w)<<3>>>0)
 v^=v>>>11
 return 536870911&v+((16383&v)<<15>>>0)},
-gTt:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
+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,
+$isFU:true,
 "%":"HTMLFrameSetElement"},
-Cy:{
+rhM:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -10586,7 +10647,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -10608,7 +10669,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gqG:function(a){if(a.length>0)return a[0]
+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]
@@ -10639,22 +10700,22 @@
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.Ff)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.lo)},
 GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
 Jd:function(a){return this.GT(a,null)},
 uk:function(a,b){this.aO(b,!1)},
 aO:function(a,b){var z,y,x
 z=this.dA
-if(b){z=J.Mx(z)
-y=z.ad(z,new W.dz(a))}else{z=J.Mx(z)
-y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Mp(x.gl())},
+if(b){z=J.dd(z)
+y=z.ad(z,new W.dz(a))}else{z=J.dd(z)
+y=z.ad(z,a)}for(z=H.VM(new H.Mo(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Rv(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.nO(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
 if(!!J.x(b).$ish4){z=this.dA
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},
-xe:function(a,b,c){var z,y,x
+aP:function(a,b,c){var z,y,x
 if(b>this.jS.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.jS
 y=z.length
@@ -10664,17 +10725,17 @@
 x.insertBefore(c,z[b])}},
 Mh:function(a,b,c){throw H.b(P.nO(null))},
 V1:function(a){J.Wf(this.dA)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)this.dA.removeChild(z)
+f4:function(a){var z=this.grZ(this)
+this.dA.removeChild(z)
 return z},
-gqG:function(a){var z=this.dA.firstElementChild
+gtH:function(a){var z=this.dA.firstElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 grZ:function(a){var z=this.dA.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asark:function(){return[W.h4]},
-$aseD:function(){return[W.h4]},
+$asE9h:function(){return[W.h4]},
 $asWO:function(){return[W.h4]},
 $asQV:function(){return[W.h4]}},
 dz:{
@@ -10682,19 +10743,19 @@
 $1:function(a){return this.a.$1(a)!==!0},
 $isEH:true},
 wz:{
-"^":"ark;jt,xa",
-gB:function(a){return this.jt.length},
-t:function(a,b){var z=this.jt
+"^":"ark;mk,xa",
+gB:function(a){return this.mk.length},
+t:function(a,b){var z=this.mk
 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)},
-gqG:function(a){return C.t5.gqG(this.jt)},
-grZ:function(a){return C.t5.grZ(this.jt)},
-gDD:function(a){return W.or(this.xa)},
-S8:function(a,b){var z=C.t5.ad(this.jt,new W.ty())
+gtH:function(a){return C.z0.gtH(this.mk)},
+grZ:function(a){return C.z0.grZ(this.mk)},
+gDD:function(a){return W.Uk(this.xa)},
+S8:function(a,b){var z=C.z0.ad(this.mk,new W.ty())
 this.xa=P.F(z,!0,H.W8(z,"mW",0))},
 $isWO:true,
 $asWO:null,
@@ -10708,7 +10769,7 @@
 "^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-QI:{
+M5K:{
 "^":"Gv;"},
 RAp:{
 "^":"Gv+lD;",
@@ -10726,7 +10787,7 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"TpZ:12;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,151,"call"],
+$1:[function(a){return J.CA(a)},"$1",null,2,0,null,151,"call"],
 $isEH:true},
 bU2:{
 "^":"TpZ:81;a",
@@ -10748,9 +10809,9 @@
 "^":"TpZ:81;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
-wi:{
+OB:{
 "^":"ark;uR",
-gqG:function(a){var z=this.uR.firstChild
+gtH:function(a){var z=this.uR.firstChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 grZ:function(a){var z=this.uR.lastChild
@@ -10758,8 +10819,8 @@
 return z},
 h:function(a,b){this.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.Ff)},
-xe:function(a,b,c){var z,y,x
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.lo)},
+aP:function(a,b,c){var z,y,x
 if(b>this.uR.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.uR
 y=z.childNodes
@@ -10771,7 +10832,7 @@
 z=this.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.r5(z,c,y[b])},
+J.qD(z,c,y[b])},
 Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 Rz:function(a,b){var z
 if(!J.x(b).$isKV)return!1
@@ -10791,7 +10852,7 @@
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 z.replaceChild(c,y[b])},
-gA:function(a){return C.t5.gA(this.uR.childNodes)},
+gA:function(a){return C.z0.gA(this.uR.childNodes)},
 GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
 Jd:function(a){return this.GT(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
@@ -10801,9 +10862,9 @@
 t:function(a,b){var z=this.uR.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-$iswi:true,
+$isOB:true,
 $asark:function(){return[W.KV]},
-$aseD:function(){return[W.KV]},
+$asE9h:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
@@ -10822,9 +10883,9 @@
 $asQV:function(){return[W.KV]}},
 xv:{
 "^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$islq},
+$1:function(a){return!!J.x(a).$isQlt},
 $isEH:true},
-AA:{
+lN:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
@@ -10832,7 +10893,7 @@
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
-rs:{
+We:{
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
@@ -10866,11 +10927,11 @@
 $asQV:function(){return[W.vKL]}},
 a7B:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.Za(this))},
+FV:function(a,b){J.Me(b,new W.ZcQ(this))},
 V1:function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.Ff)},
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.lo)},
 aN:function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 b.$2(y,this.t(0,y))}},
 gvc:function(a){var z,y,x,w
 z=this.dA.attributes
@@ -10888,7 +10949,7 @@
 gor:function(a){return this.gB(this)!==0},
 $isT8:true,
 $asT8:function(){return[P.qU,P.qU]}},
-Za:{
+ZcQ:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
@@ -10905,25 +10966,25 @@
 gB:function(a){return this.gvc(this).length},
 O2:function(a){return a.namespaceURI==null}},
 nFk:{
-"^":"As3;RN,AL",
-DG:function(){var z=P.Ls(null,null,null,P.qU)
-this.AL.aN(0,new W.jL(z))
+"^":"As3;a7,AL",
+DG:function(){var z=P.fM(null,null,null,P.qU)
+this.AL.aN(0,new W.pd(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.RN,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.Ff,z)},
+for(y=this.a7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.fm(y.lo,z)},
 H9:function(a){this.AL.aN(0,new W.uS(a))},
-Rz:function(a,b){return this.jA(new W.FcD(b))},
-jA:function(a){return this.AL.es(0,!1,new W.hD(a))},
-b1:function(a){this.AL=H.VM(new H.A8(P.F(this.RN,!0,null),new W.FK()),[null,null])},
-static:{or:function(a){var z=new W.nFk(a,null)
+Rz:function(a,b){return this.Fm(new W.FcD(b))},
+Fm:function(a){return this.AL.es(0,!1,new W.cf(a))},
+b1:function(a){this.AL=H.VM(new H.A8(P.F(this.a7,!0,null),new W.Zu()),[null,null])},
+static:{Uk:function(a){var z=new W.nFk(a,null)
 z.b1(a)
 return z}}},
-FK:{
+Zu:{
 "^":"TpZ:12;",
 $1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-jL:{
+pd:{
 "^":"TpZ:12;a",
 $1:function(a){return this.a.FV(0,a.DG())},
 $isEH:true},
@@ -10935,40 +10996,38 @@
 "^":"TpZ:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
-hD:{
+cf:{
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
 "^":"As3;dA",
 DG:function(){var z,y,x
-z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.Ff)
+z=P.fM(null,null,null,P.qU)
+for(y=J.ufU(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.iY(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
-J.Pw(this.dA,a.zV(0," "))}},
-FkO:{
-"^":"a;fA"},
-RO:{
-"^":"wS;bi,fA,el",
+J.fm(this.dA,a.zV(0," "))}},
+vG:{
+"^":"cb;bi,fA,el",
 KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.fA,W.Yt(a),this.el)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.DN()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
-Cqa:{
-"^":"RO;bi,fA,el",
-xZ:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"wS",0)])
-return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"wS",0),null])},
-$iswS:true},
+eu:{
+"^":"vG;bi,fA,el",
+WO:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"cb",0)])
+return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"cb",0),null])},
+$iscb:true},
 ie:{
 "^":"TpZ:12;a",
-$1:function(a){return J.tPf(J.l2(a),this.a)},
+$1:function(a){return J.vI(J.l2(a),this.a)},
 $isEH:true},
 tS:{
 "^":"TpZ:12;b",
-$1:[function(a){J.A6L(a,this.b)
+$1:[function(a){J.A6(a,this.b)
 return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
@@ -10980,14 +11039,14 @@
 return},
 Fv:[function(a,b){if(this.bi==null)return;++this.UU
 this.EO()
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
 gUF:function(){return this.UU>0},
 QE:[function(a){if(this.bi==null||this.UU<=0)return;--this.UU
 this.DN()},"$0","gDQ",0,0,17],
 DN:function(){var z=this.H2
 if(z!=null&&this.UU<=0)J.cZ(this.bi,this.fA,z,this.el)},
 EO:function(){var z=this.H2
-if(z!=null)J.we(this.bi,this.fA,z,this.el)}},
+if(z!=null)J.GJ(this.bi,this.fA,z,this.el)}},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.W8(a,"Gm",0)])},
@@ -10995,7 +11054,7 @@
 FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.GT(a,null)},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+aP:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
@@ -11009,44 +11068,44 @@
 $isQV:true,
 $asQV:null},
 uB:{
-"^":"ark;xN",
-gA:function(a){return H.VM(new W.LV(J.mY(this.xN)),[null])},
-gB:function(a){return this.xN.length},
-h:function(a,b){J.bi(this.xN,b)},
-Rz:function(a,b){return J.V1(this.xN,b)},
-V1:function(a){J.Z8(this.xN)},
-t:function(a,b){var z=this.xN
+"^":"ark;HA",
+gA:function(a){return H.VM(new W.Qg(J.mY(this.HA)),[null])},
+gB:function(a){return this.HA.length},
+h:function(a,b){J.dH(this.HA,b)},
+Rz:function(a,b){return J.V1(this.HA,b)},
+V1:function(a){J.U2(this.HA)},
+t:function(a,b){var z=this.HA
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.xN
+u:function(a,b,c){var z=this.HA
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.wg(this.xN,b)},
-GT:function(a,b){J.uF(this.xN,b)},
+sB:function(a,b){J.Vw(this.HA,b)},
+GT:function(a,b){J.uF(this.HA,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.DP(this.xN,b,c)},
+XU:function(a,b,c){return J.DP(this.HA,b,c)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.xN,b,c)},
+Pk:function(a,b,c){return J.ff(this.HA,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){return J.Vk(this.xN,b,c)},
-YW:function(a,b,c,d,e){J.CP(this.xN,b,c,d,e)},
+aP:function(a,b,c){return J.V2(this.HA,b,c)},
+YW:function(a,b,c,d,e){J.L0(this.HA,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-oq:function(a,b,c){J.Cz(this.xN,b,c)}},
-LV:{
-"^":"a;qD",
-G:function(){return this.qD.G()},
-gl:function(){return this.qD.QZ}},
+oq:function(a,b,c){J.Cz(this.HA,b,c)}},
+Qg:{
+"^":"a;iB",
+G:function(){return this.iB.G()},
+gl:function(){return this.iB.Ff}},
 W9:{
-"^":"a;NX,vN,G3,QZ",
+"^":"a;NX,bd,G3,Ff",
 G:function(){var z,y
 z=this.G3+1
-y=this.vN
-if(z<y){this.QZ=J.UQ(this.NX,z)
+y=this.bd
+if(z<y){this.Ff=J.UQ(this.NX,z)
 this.G3=z
-return!0}this.QZ=null
+return!0}this.Ff=null
 this.G3=y
 return!1},
-gl:function(){return this.QZ}},
+gl:function(){return this.Ff}},
 uY:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z=H.Va(this.b)
@@ -11059,17 +11118,17 @@
 gbq:function(a){return W.zK(this.uU.history)},
 geT:function(a){return W.P1(this.uU.parent)},
 xO:function(a){return this.uU.close()},
-xc:function(a,b,c,d){this.uU.postMessage(P.pf(b),c)},
+xc:function(a,b,c,d){this.uU.postMessage(P.jl(b),c)},
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-$isPZ:true,
+$isFU:true,
 static:{P1:function(a){if(a===window)return a
 else return new W.dW(a)}}},
-VP:{
-"^":"a;nA",
+IV:{
+"^":"a;nAT",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.VP(a)}}}}],["","",,P,{
+else return new W.IV(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -11077,10 +11136,10 @@
 "%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
-"^":"tpr;N:target=,mH:href=",
+"^":"tpr;N:target=,LU:href=",
 "%":"SVGAElement"},
 ZJQ:{
-"^":"Rc;mH:href=",
+"^":"dh;LU:href=",
 "%":"SVGAltGlyphElement"},
 jwG:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -11088,13 +11147,13 @@
 lvr:{
 "^":"d5G;t5:type=,UQ:values=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
-pfc:{
+vA:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-lF:{
+pyf:{
 "^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
-EfE:{
+B3:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
@@ -11110,7 +11169,7 @@
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 meI:{
-"^":"d5G;fg:height=,yG:result=,x=,y=,mH:href=",
+"^":"d5G;fg:height=,yG:result=,x=,y=,LU:href=",
 "%":"SVGFEImageElement"},
 oBW:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -11124,57 +11183,57 @@
 Ubr:{
 "^":"d5G;x=,y=",
 "%":"SVGFEPointLightElement"},
-bMB:{
+zu:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 HAk:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
-Rg:{
+Qya:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 juM:{
 "^":"d5G;t5:type=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 OE5:{
-"^":"d5G;fg:height=,x=,y=,mH:href=",
+"^":"d5G;fg:height=,x=,y=,LU:href=",
 "%":"SVGFilterElement"},
 l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
+d0D:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
 "^":"d5G;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 rEM:{
-"^":"tpr;fg:height=,x=,y=,mH:href=",
+"^":"tpr;fg:height=,x=,y=,LU:href=",
 "%":"SVGImageElement"},
 NBZ:{
 "^":"d5G;fg:height=,x=,y=",
 "%":"SVGMaskElement"},
 Gr5:{
-"^":"d5G;fg:height=,x=,y=,mH:href=",
+"^":"d5G;fg:height=,x=,y=,LU:href=",
 "%":"SVGPatternElement"},
-NJ3:{
-"^":"en;fg:height=,x=,y=",
+fQ:{
+"^":"d0D;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
-"^":"d5G;t5:type=,mH:href=",
+"^":"d5G;t5:type=,LU:href=",
 "%":"SVGScriptElement"},
 EUL:{
 "^":"d5G;t5:type=",
-smk:function(a,b){a.title=b},
+ska:function(a,b){a.title=b},
 "%":"SVGStyleElement"},
 d5G:{
 "^":"h4;",
-gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
+gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.Ci(a)
 return a._cssClassSet},
-gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
-gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
-$isPZ:true,
+gqu:function(a){return H.VM(new P.P0(a,new W.OB(a)),[W.h4])},
+gVY:function(a){return H.VM(new W.eu(a,"mousedown",!1),[null])},
+gf0:function(a){return H.VM(new W.eu(a,"mousemove",!1),[null])},
+$isFU:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
 static:{"^":"SHk<"}},
 hy:{
@@ -11186,24 +11245,24 @@
 "^":"tpr;",
 "%":";SVGTextContentElement"},
 Rk4:{
-"^":"mHq;mH:href=",
+"^":"mHq;LU:href=",
 "%":"SVGTextPathElement"},
-Rc:{
+dh:{
 "^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-o4:{
-"^":"tpr;fg:height=,x=,y=,mH:href=",
+pyk:{
+"^":"tpr;fg:height=,x=,y=,LU:href=",
 "%":"SVGUseElement"},
 cuU:{
-"^":"d5G;mH:href=",
+"^":"d5G;LU:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-O7:{
+Ci:{
 "^":"As3;LO",
 DG:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,P.qU)
+y=P.fM(null,null,null,P.qU)
 if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.Ff)
+for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.iY(x.lo)
 if(w.length!==0)y.h(0,w)}return y},
 p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
@@ -11211,9 +11270,9 @@
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["","",,P,{
 "^":"",
-hq:{
+XY:{
 "^":"a;",
-$ishq:true}}],["","",,P,{
+$isXY:true}}],["","",,P,{
 "^":"",
 z8:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
@@ -11279,7 +11338,7 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},XY:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
+return P.ND(new x())},kW:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
 return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(H.VM(new P.PL(0,null,null,null,null),[null,null])).$1(a)}}},
 Xb:{
 "^":"TpZ:12;a",
@@ -11305,7 +11364,7 @@
 $isr7:true,
 static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
 GD:{
-"^":"WkF;S1",
+"^":"F6;S1",
 t:function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
 else z=!1
@@ -11320,9 +11379,9 @@
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
 h:function(a,b){this.V7("push",[b])},
 FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
-xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
+aP:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
 this.V7("splice",[b,0,c])},
-oq:function(a,b,c){P.ze(b,c,this.gB(this))
+oq:function(a,b,c){P.UP(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)
@@ -11332,14 +11391,14 @@
 if(y===0)return
 if(e<0)throw H.b(P.u(e))
 x=[b,y]
-C.Nm.FV(x,J.Ld(d,e).rh(0,y))
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
 this.V7("splice",x)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[])},
 Jd:function(a){return this.GT(a,null)},
-static:{ze:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
+static:{UP: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))}}},
-WkF:{
+F6:{
 "^":"E4+lD;",
 $isWO:true,
 $asWO:null,
@@ -11369,10 +11428,10 @@
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["","",,P,{
 "^":"",
-Zm:function(a,b){a=536870911&a+b
+VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-xk:function(a){a=536870911&a+((67108863&a)<<3>>>0)
+Up: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
@@ -11399,7 +11458,7 @@
 return Math.random()*a>>>0}},
 kh:{
 "^":"a;xx,vz",
-SR:function(){var z,y,x,w,v,u
+xv:function(){var z,y,x,w,v,u
 z=this.xx
 y=4294901760*z
 x=(y&4294967295)>>>0
@@ -11412,19 +11471,19 @@
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.SR()
-return(this.xx&z)>>>0}do{this.SR()
+if((a&z)===0){this.xv()
+return(this.xx&z)>>>0}do{this.xv()
 y=this.xx
 x=y%a}while(y-x+a>=4294967296)
 return x},
-mK:function(a){var z,y,x,w,v,u,t,s
+FO: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.Cl(y.W(a,x),4294967296)
+a=J.Ts(y.W(a,x),4294967296)
 y=J.Wx(a)
 w=y.i(a,4294967295)
-a=J.Cl(y.W(a,w),4294967296)
+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.BU(v-u,4294967296)&4294967295
@@ -11447,12 +11506,12 @@
 this.xx=(t^u)>>>0
 this.vz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
 if(this.vz===0&&this.xx===0)this.xx=23063
-this.SR()
-this.SR()
-this.SR()
-this.SR()},
-static:{"^":"tgM,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
-z.mK(a)
+this.xv()
+this.xv()
+this.xv()
+this.xv()},
+static:{"^":"dK,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
+z.FO(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
@@ -11470,7 +11529,7 @@
 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))},
+return P.Up(P.VC(P.VC(0,z),y))},
 g:function(a,b){var z,y,x,w
 z=this.x
 y=J.RE(b)
@@ -11520,8 +11579,8 @@
 z=y===z.gG6(b)&&this.Bb+this.R===z.gT8(b)&&y+this.fg===z.gQG(b)}else z=!1
 return z},
 giO:function(a){var z=this.G6
-return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
-gTt:function(a){var z=new P.hL(this.gBb(this),this.G6)
+return P.Up(P.VC(P.VC(P.VC(P.VC(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
+gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
@@ -11536,7 +11595,7 @@
 moY:{
 "^":"a;JH",
 static:{"^":"aRn,aLE,Rwl"}},
-V2:{
+Wy:{
 "^":"a;",
 $isAS:true}}],["","",,H,{
 "^":"",
@@ -11547,14 +11606,14 @@
 return a},
 aRu:function(a){a.toString
 return a},
-z4:function(a,b,c){H.Hj(a,b,c)
+GG:function(a,b,c){H.Hj(a,b,c)
 return new Uint8Array(a,b)},
-bf:{
+WZ:{
 "^":"Gv;H3:byteLength=",
-gbx:function(a){return C.uh},
+gbx:function(a){return C.E0},
 kq:function(a,b,c){H.Hj(a,b,c)
 return new DataView(a,b)},
-$isbf:true,
+$isWZ:true,
 $isaI:true,
 "%":"ArrayBuffer"},
 eH:{
@@ -11570,32 +11629,32 @@
 return c},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;b0B|ObS|Ip|Dg|fjp|GVy|Pg"},
+"%":";ArrayBufferView;we|ObS|GVy|Dg|fjp|Ipv|Pg"},
 dfL:{
 "^":"eH;",
-gbx:function(a){return C.nW},
+gbx:function(a){return C.T1},
 mt:function(a,b,c){throw H.b(P.f("Uint64 accessor not supported by dart2js."))},
 $isAS:true,
 "%":"DataView"},
 zU7:{
 "^":"Dg;",
-gbx:function(a){return C.kq},
+gbx:function(a){return C.ra},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]},
+$asQV:function(){return[P.CP]},
 "%":"Float32Array"},
 K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.nC},
+gbx:function(a){return C.Ev},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]},
+$asQV:function(){return[P.CP]},
 "%":"Float64Array"},
 xja:{
 "^":"Pg;",
@@ -11612,7 +11671,7 @@
 "%":"Int16Array"},
 dE5:{
 "^":"Pg;",
-gbx:function(a){return C.QP},
+gbx:function(a){return C.J0},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11625,7 +11684,7 @@
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
-gbx:function(a){return C.laj},
+gbx:function(a){return C.qB},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11636,7 +11695,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Int8Array"},
-pd:{
+wfF:{
 "^":"Pg;",
 gbx:function(a){return C.M5},
 t:function(a,b){var z=a.length
@@ -11649,7 +11708,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Uint16Array"},
-Pqh:{
+N2:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
 t:function(a,b){var z=a.length
@@ -11664,7 +11723,7 @@
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
-gbx:function(a){return C.YZ},
+gbx:function(a){return C.hD},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
@@ -11676,9 +11735,9 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"CanvasPixelArray|Uint8ClampedArray"},
-V6:{
+V6a:{
 "^":"Pg;",
-gbx:function(a){return C.Wr},
+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.aq(a,b,z)
@@ -11691,7 +11750,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":";Uint8Array"},
-b0B:{
+we:{
 "^":"eH;",
 gB:function(a){return a.length},
 SM:function(a,b,c,d,e){var z,y,x
@@ -11707,7 +11766,7 @@
 a.set(d,b)},
 $isXj:true},
 Dg:{
-"^":"Ip;",
+"^":"GVy;",
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11719,16 +11778,16 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true},
 ObS:{
-"^":"b0B+lD;",
+"^":"we+lD;",
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]}},
-Ip:{
+$asQV:function(){return[P.CP]}},
+GVy:{
 "^":"ObS+SU7;"},
 Pg:{
-"^":"GVy;",
+"^":"Ipv;",
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 a[b]=c},
@@ -11742,43 +11801,43 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 fjp:{
-"^":"b0B+lD;",
+"^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-GVy:{
+Ipv:{
 "^":"fjp+SU7;"}}],["","",,H,{
 "^":"",
-Af:function(a){if(typeof dartPrint=="function"){dartPrint(a)
+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)}}],["","",,G,{
 "^":"",
 Tk:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{aMd:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.BB.LX(a)
-C.BB.XI(a)
+C.vo.LX(a)
+C.vo.XI(a)
 return a}}}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"pva;Ew,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"pva;Ew,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkc:function(a){return a.Ew},
 skc:function(a,b){a.Ew=this.ct(a,C.yh,a.Ew,b)},
 static:{Yw:function(a){var z,y,x,w
@@ -11787,7 +11846,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -11802,9 +11861,9 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"cda;a3,Ek,Ln,y4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-ga4:function(a){return a.a3},
-sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
+"^":"cda;fn,Ek,Ln,y4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+ga4:function(a){return a.fn},
+sa4:function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},
 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},
@@ -11813,22 +11872,22 @@
 sFR:function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},
 gCf:function(a){return a.y4},
 sCf:function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},
-hE:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
+hE:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isSc").value
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
-if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,116,2,106,107],
-kk:[function(a,b,c,d){var z,y,x
-J.fD(b)
-z=a.a3
-a.a3=this.ct(a,C.mi,z,"")
+if(J.xC(z,"1-line")){z=J.JA(a.fn,"\n"," ")
+a.fn=this.ct(a,C.mi,a.fn,z)}},"$3","gxb",6,0,116,2,106,107],
+jc:[function(a,b,c,d){var z,y,x
+J.jD(b)
+z=a.fn
+a.fn=this.ct(a,C.mi,z,"")
 if(a.Ln!=null){y=P.Fl(null,null)
 x=R.tB(y)
-J.kW(x,"expr",z)
-J.Vk(a.y4,0,x)
+J.qQ(x,"expr",z)
+J.V2(a.y4,0,x)
 this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,116,2,106,107],
-o5:[function(a,b){var z=J.VU(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,152,2],
+o5:[function(a,b){var z=J.MI(J.l2(b),"expr")
+a.fn=this.ct(a,C.mi,a.fn,z)},"$1","gHo",2,0,152,2],
 static:{Rpj:function(a){var z,y,x,w,v
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -11838,26 +11897,26 @@
 v=P.Fl(null,null)
 a.Ek="1-line"
 a.y4=z
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.Jh.LX(a)
-C.Jh.XI(a)
+C.GhT.LX(a)
+C.GhT.XI(a)
 return a}}},
 cda:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"TpZ:12;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){J.qQ(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"KAf;fe,l1,bY,jv,oy,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"KAf;fe,l1,bY,jv,oy,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gO9:function(a){return a.fe},
 sO9:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
@@ -11874,7 +11933,7 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gDf",6,0,84,49,50,85],
+this.LY(a,a.jv).ml(new R.Ou(a)).wM(new R.VO(a))}},"$3","gDf",6,0,84,49,50,85],
 static:{Ola:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11886,40 +11945,40 @@
 a.bY=null
 a.jv=""
 a.oy=null
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.lQ.LX(a)
-C.lQ.XI(a)
+C.qL.LX(a)
+C.qL.XI(a)
 return a}}},
 KAf:{
 "^":"xc+Pi;",
 $isd3:true},
-Kz:{
+Ou:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.oy=J.NB(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-uv:{
+VO:{
 "^":"TpZ:76;b",
 $0:[function(){var z=this.b
-z.fe=J.NB(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
+z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{hSW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -11931,7 +11990,7 @@
 return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"waa;KV,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"waa;KV,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
 pA:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,19,102],
@@ -11941,22 +12000,22 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.LTI.LX(a)
-C.LTI.XI(a)
+C.D4.LX(a)
+C.D4.XI(a)
 return a}}},
 waa:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"V10;DC,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V10;DC,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
 pA:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,19,102],
@@ -11966,45 +12025,45 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.n0.LX(a)
-C.n0.XI(a)
+C.N3.LX(a)
+C.N3.XI(a)
 return a}}},
 V10:{
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"V11;Zc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gQR:function(a){return a.Zc},
-sQR:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
+"^":"V11;Zc,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gng:function(a){return a.Zc},
+sng:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{IfX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.ls6.LX(a)
-C.ls6.XI(a)
+C.Hb.LX(a)
+C.Hb.XI(a)
 return a}}},
 V11:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"T53;PQ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"T53;PQ,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gU4:function(a){return a.PQ},
 sU4:function(a,b){a.PQ=this.ct(a,C.QK,a.PQ,b)},
 static:{v9:function(a){var z,y,x,w
@@ -12014,8 +12073,8 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.PQ=!0
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12030,18 +12089,18 @@
 $isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V12;P6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V12;P6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
 pA:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
+Da:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
 static:{nz:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12073,9 +12132,9 @@
 if(typeof z!=="number")return H.s(z)
 return new O.Hz(a,(y*x+z)*4)}}},
 x2:{
-"^":"a;Yu<,yT>"},
+"^":"a;Yu<,ky>"},
 Vb:{
-"^":"V13;N2,WC,rn,Tl,GE,Cv,PA,oj,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V13;N2,WC,rn,Tl,GE,Cv,PA,oj,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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},
@@ -12086,10 +12145,10 @@
 a.N2=z
 z=J.Q9(z)
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gL2(a)),z.el),[H.u3(z,0)]).DN()
-z=J.GW(a.N2)
+z=J.PQ(a.N2)
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gok(a)),z.el),[H.u3(z,0)]).DN()},
 Zt:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.Ff
+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},
 OU:function(a,b,c,d){var z=J.BQ(c,"@")
@@ -12100,7 +12159,7 @@
 DO:function(a,b,c){var z,y,x,w,v,u,t,s,r
 for(z=J.mY(J.UQ(b,"members")),y=a.Cv,x=a.Tl,w=a.GE;z.G();){v=z.gl()
 if(!J.x(v).$isdy){N.QM("").To(H.d(v))
-continue}u=H.BU(C.Nm.grZ(J.BQ(v.TU,"/")),null,null)
+continue}u=H.BU(C.Nm.grZ(J.BQ(v.r0,"/")),null,null)
 t=u==null?C.Xh:P.n2(u)
 s=[t.j1(128),t.j1(128),t.j1(128),255]
 r=J.BQ(v.bN,"@")
@@ -12108,7 +12167,7 @@
 y.u(0,u,r[0])
 x.u(0,u,s)
 w.u(0,this.Zt(a,s),u)}this.OU(a,c,"Free",$.R2())
-this.OU(a,0,"",$.Qg())},
+this.OU(a,0,"",$.vl())},
 Tm:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.rn
 y=J.eY(a.WC)
@@ -12144,15 +12203,15 @@
 bD:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=this.Tm(a,z.gD7(b))
-x=H.d(y.yT)+"B @ 0x"+J.u1(y.Yu,16)
+x=H.d(y.ky)+"B @ 0x"+J.u1(y.Yu,16)
 z=z.gD7(b)
 z=O.x6(a.WC,z)
 w=z.y5
 v=a.Cv.t(0,a.GE.t(0,this.Zt(a,C.yp.Yc(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
 a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gL2",2,0,152,87],
-qM:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gok",2,0,152,87],
+Vq:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.wg(a.oj)))+"/address/"+z},"$1","gok",2,0,152,87],
 UV:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.N2==null)return
@@ -12161,19 +12220,19 @@
 z=a.N2.parentElement
 z.toString
 x=P.T7(C.CD.yu(C.CD.RE(z.clientLeft)),C.CD.yu(C.CD.RE(z.clientTop)),C.CD.yu(C.CD.RE(z.clientWidth)),C.CD.yu(C.CD.RE(z.clientHeight)),null).R
-z=J.Cl(J.Cl(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
+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.rn=z
 w=J.q8(y)
 if(typeof w!=="number")return H.s(w)
 v=P.J(z*w,6000)
-w=P.f9(J.Ry(a.N2).createImageData(x,v))
+w=P.f9(J.rN(a.N2).createImageData(x,v))
 a.WC=w
 J.vP(a.N2,J.eY(w))
-J.OE(a.N2,J.OB(a.WC))
-this.Ky(a,0)},
-Ky:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+J.OE(a.N2,J.Jv(a.WC))
+this.JX(a,0)},
+JX:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.UQ(a.oj,"pages")
 y=J.U6(z)
 x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
@@ -12184,7 +12243,7 @@
 v=w+x
 x=y.gB(z)
 if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.OB(a.WC)
+if(!(b>=x)){x=J.Jv(a.WC)
 if(typeof x!=="number")return H.s(x)
 x=v>x}else x=!0
 if(x)return
@@ -12214,18 +12273,18 @@
 l=C.CD.Z(x,l)
 new P.hL(m,l).$builtinTypeInfo=[null]
 if(!(l<v))break
-x=$.Qg()
+x=$.vl()
 m=y+4
 C.yp.zB(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Ry(a.N2)
+u=new O.Hz(r,m)}y=J.rN(a.N2)
 x=a.WC
-J.kZ(y,x,0,0,0,w,J.eY(x),v)
-P.DJ(new O.R5(a,b),null)},
+J.nb(y,x,0,0,0,w,J.eY(x),v)
+P.nd(new O.nW(a,b),null)},
 pA:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.pM()).wM(b)},"$1","gvC",2,0,19,102],
-YS7:[function(a,b){P.DJ(new O.oc(a),null)},"$1","gRh",2,0,19,59],
-static:{"^":"nK,Os,SoT,WBO",teo:function(a){var z,y,x,w,v,u,t
+J.wg(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).wM(b)},"$1","gvC",2,0,19,102],
+YS7:[function(a,b){P.nd(new O.oc(a),null)},"$1","gRs",2,0,19,59],
+static:{"^":"nK,dg,SoT,WBO",dF:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
@@ -12237,7 +12296,7 @@
 a.Tl=z
 a.GE=y
 a.Cv=x
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=w
@@ -12250,32 +12309,32 @@
 V13:{
 "^":"uL+Pi;",
 $isd3:true},
-R5:{
+nW:{
 "^":"TpZ:76;a,b",
-$0:function(){J.AC(this.a,this.b+1)},
+$0:function(){J.tE(this.a,this.b+1)},
 $isEH:true},
 aG:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.oj=J.NB(z,C.QH,z.oj,a)},"$1",null,2,0,null,155,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
-pM:{
+z4:{
 "^":"TpZ:81;",
 $2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,156,"call"],
 $isEH:true},
 oc:{
 "^":"TpZ:76;a",
-$0:function(){J.oO(this.a)},
+$0:function(){J.J2g(this.a)},
 $isEH:true}}],["","",,K,{
 "^":"",
 UC:{
-"^":"Vz;oH,vp,zz,pT,Rj,Vg,fn",
+"^":"Vz;oH,vp,GD,pT,Rj,Vg,ij",
 Ey:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.DA(J.UQ(J.hI(z[a]),b))}return G.Vz.prototype.Ey.call(this,a,b)}},
 Ly:{
-"^":"V14;MF,uY,Xe,jF,FX,Uv,Rp,Na,Ol,Sk,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V14;MF,uY,Xe,JN,FX,qD,Rp,Na,Ol,Sk,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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},
@@ -12289,15 +12348,15 @@
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.yD(null,P.L5(null,null,null,null,null))
+y=new G.qu(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.jF=y
+a.JN=y
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.yD(null,P.L5(null,null,null,null,null))
+z=new G.qu(null,P.L5(null,null,null,null,null))
 z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.Uv=z
+a.qD=z
 a.Na=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Y1:function(a){var z,y,x,w
+Qf: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")
@@ -12317,28 +12376,28 @@
 s=y.gxQ().gEJ().wf
 r=y.gxQ().gl().wY
 q=y.gxQ().gl().wf
-J.an(a.Rp,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.II(a.Rp)},
-As:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.Rp),c)
+J.Ip(a.Rp,new G.c0([y,"",x,w,v,u,"",t,s,r,q]))}J.zq(a.Rp)},
+lD:function(a,b,c){var z,y,x,w,v,u
+z=J.UQ(J.x3(a.Rp),c)
 y=J.RE(b)
 x=J.RE(z)
-J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
+J.PP(J.UQ(J.dd(J.UQ(y.gqu(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.Q5,w))break c$0
-u=J.UQ(y.gks(b),w)
+c$0:{if(C.Nm.tg(C.jb,w))break c$0
+u=J.UQ(y.gqu(b),w)
 v=J.RE(u)
-v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
+v.ska(u,J.AG(J.UQ(x.gUQ(z),w)))
 v.sa4(u,a.Rp.Gu(c,w))}++w}},
 ya:function(a){var z,y,x,w,v,u,t,s
-z=J.Mx(a.Na)
-if(z.gB(z)>a.Rp.gzz().length){z=J.Mx(a.Na)
-y=z.gB(z)-a.Rp.gzz().length
-for(x=0;x<y;++x)J.Mx(a.Na).mv(0)}else{z=J.Mx(a.Na)
-if(z.gB(z)<a.Rp.gzz().length){z=a.Rp.gzz().length
-w=J.Mx(a.Na)
+z=J.dd(a.Na)
+if(z.gB(z)>a.Rp.gGD().length){z=J.dd(a.Na)
+y=z.gB(z)-a.Rp.gGD().length
+for(x=0;x<y;++x)J.dd(a.Na).f4(0)}else{z=J.dd(a.Na)
+if(z.gB(z)<a.Rp.gGD().length){z=a.Rp.gGD().length
+w=J.dd(a.Na)
 v=z-w.gB(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
 z=J.RE(u)
@@ -12357,42 +12416,42 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.Mx(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
+J.dd(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gGD().length;++x){z=a.Rp.gGD()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
-this.As(a,J.Mx(a.Na).t(0,x),s)}},
+this.lD(a,J.dd(a.Na).t(0,x),s)}},
 BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.Rp.gxp()
+if(!!J.x(d).$isv6){z=a.Rp.gn4()
 y=d.cellIndex
 x=a.Rp
-if(z==null?y!=null:z!==y){x.sxp(y)
+if(z==null?y!=null:z!==y){x.sn4(y)
 a.Rp.sT3(!0)}else x.sT3(!x.gT3())
-J.II(a.Rp)
+J.zq(a.Rp)
 this.ya(a)}},"$3","gQq",6,0,105,2,106,107],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).wM(b)},"$1","gvC",2,0,19,102],
+J.wg(z).cv("/allocationprofile").ml(this.gbM(a)).wM(b)},"$1","gvC",2,0,19,102],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).wM(b)},"$1","gyW",2,0,19,102],
+J.wg(z).cv("/allocationprofile?gc=full").ml(this.gbM(a)).wM(b)},"$1","gzH",2,0,19,102],
 eJ8:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).wM(b)},"$1","gNb",2,0,19,102],
-Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,157,158],
+J.wg(z).cv("/allocationprofile?reset=true").ml(this.gbM(a)).wM(b)},"$1","gNb",2,0,19,102],
+un:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gbM",2,0,157,158],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
-z=J.aT(z)
+z=J.wg(z)
 z=this.ct(a,C.rB,a.Sk,z)
 a.Sk=z
-z.Bs(J.UQ(a.Ol,"heaps"))
+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.Xe.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-x=J.aT(a.Ol)
+x=J.wg(a.Ol)
 z=a.Xe
 w=x.gUY().gSU()
 z=z.Yb
@@ -12400,7 +12459,7 @@
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.Xe
-z=J.bI(x.gUY().gkV(),x.gUY().gSU())
+z=J.bI(x.gUY().gbZ(),x.gUY().gSU())
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
@@ -12420,7 +12479,7 @@
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.FX
-z=J.bI(x.gxQ().gkV(),x.gxQ().gSU())
+z=J.bI(x.gxQ().gbZ(),x.gxQ().gSU())
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
@@ -12431,42 +12490,42 @@
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-this.Y1(a)
+this.Qf(a)
 this.FS(a)
 this.ya(a)
-a.jF.Am(0,a.Xe)
-a.Uv.Am(0,a.FX)
+a.JN.Am(0,a.Xe)
+a.qD.Am(0,a.FX)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
+this.ct(a,C.DS,0,1)},"$1","gwh",2,0,19,59],
 ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,159,160],
+return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,159,160],
 NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,159,160],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gBo",2,0,159,160],
 o7:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,159,160],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.Xe=new G.Kf(z)
+a.Xe=new G.eM(z)
 z.V7("addColumn",["string","Type"])
 a.Xe.Yb.V7("addColumn",["number","Size"])
 z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.FX=new G.Kf(z)
+a.FX=new G.eM(z)
 z.V7("addColumn",["string","Type"])
 a.FX.Yb.V7("addColumn",["number","Size"])
-z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.Tp()),new G.Kt("",G.Tp()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.OA()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.OA()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.OA()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.OA())],z,[],0,!0,null,null))
+z=H.VM([],[G.c0])
+z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.NZt()),new G.Kt("",G.NZt()),new G.Kt("Accumulated Size (New)",G.RC()),new G.Kt("Accumulated Instances",G.nI()),new G.Kt("Current Size",G.RC()),new G.Kt("Current Instances",G.nI()),new G.Kt("",G.NZt()),new G.Kt("Accumulator Size (Old)",G.RC()),new G.Kt("Accumulator Instances",G.nI()),new G.Kt("Current Size",G.RC()),new G.Kt("Current Instances",G.nI())],z,[],0,!0,null,null))
 a.Rp=z
-z.sxp(2)},
+z.sn4(2)},
 static:{EDe:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12475,7 +12534,7 @@
 w=P.Fl(null,null)
 a.MF="---"
 a.uY="---"
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12490,24 +12549,24 @@
 "^":"uL+Pi;",
 $isd3:true}}],["","",,P,{
 "^":"",
-pf:function(a){var z,y
+jl:function(a){var z,y
 z=[]
-y=new P.kd(new P.wF([],z),new P.rG(z),new P.yhO(z)).$1(a)
+y=new P.Tm(new P.wF([],z),new P.rG(z),new P.Os(z)).$1(a)
 new P.Qa().$0()
 return y},
 o7:function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.D6(z),new P.m5(z)).$1(a)},
+return new P.xL(b,new P.GW([],z),new P.D6(z),new P.m5(z)).$1(a)},
 f9:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.nl(a.data,a.height,a.width)},
-QO:function(a){if(!!J.x(a).$isnl)return{data:a.Rn,height:a.fg,width:a.R}
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isqS)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)
+if(z==null){z=J.QY(window.navigator.userAgent,"Opera",0)
+$.Qz=z}z=z!==!0&&J.QY(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
 wF:{
 "^":"TpZ:51;b,c",
@@ -12525,7 +12584,7 @@
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
-yhO:{
+Os:{
 "^":"TpZ:162;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
@@ -12535,7 +12594,7 @@
 "^":"TpZ:76;",
 $0:function(){},
 $isEH:true},
-kd:{
+Tm:{
 "^":"TpZ:12;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
@@ -12548,8 +12607,9 @@
 if(!!y.$iswL)throw H.b(P.nO("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
+if(!!y.$isXV)return a
 if(!!y.$isSg)return a
-if(!!y.$isbf)return a
+if(!!y.$isWZ)return a
 if(!!y.$iseH)return a
 if(!!y.$isT8){x=this.f.$1(a)
 w=this.UI.$1(x)
@@ -12573,7 +12633,7 @@
 "^":"TpZ:81;a,Gq",
 $2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
-CA:{
+GW:{
 "^":"TpZ:51;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
@@ -12609,7 +12669,7 @@
 if(y!=null)return y
 y=P.Fl(null,null)
 this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
+for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
 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
@@ -12623,9 +12683,9 @@
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
 return y}return a},
 $isEH:true},
-nl:{
+qS:{
 "^":"a;Rn>,fg>,R>",
-$isnl:true,
+$isqS:true,
 $isSg:true},
 As3:{
 "^":"a;",
@@ -12640,8 +12700,8 @@
 return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,163,30],
 ad:function(a,b){var z=this.DG()
 return H.VM(new H.U5(z,b),[H.u3(z,0)])},
-lM:[function(a,b){var z=this.DG()
-return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,164,30],
+yx:[function(a,b){var z=this.DG()
+return H.VM(new H.Fm(z,b),[H.u3(z,0),null])},"$1","git",2,0,164,30],
 Vr:function(a,b){return this.DG().Vr(0,b)},
 gl0:function(a){return this.DG().X5===0},
 gor:function(a){return this.DG().X5!==0},
@@ -12657,7 +12717,7 @@
 return y},
 FV:function(a,b){this.H9(new P.rl(b))},
 uk:function(a,b){this.H9(new P.Jg(b))},
-gqG:function(a){var z=this.DG().HH
+gtH:function(a){var z=this.DG().HH
 if(z==null)H.vh(P.w("No elements"))
 return z.gGc(z)},
 grZ:function(a){var z=this.DG().Nz
@@ -12665,27 +12725,27 @@
 return z.gGc(z)},
 tt:function(a,b){return this.DG().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y
+Oe:function(a){var z,y
 z=this.DG()
 y=z.iL()
 y.FV(0,z)
 return y},
 eR:function(a,b){var z=this.DG()
-return H.ke(z,b,H.u3(z,0))},
+return H.p6(z,b,H.u3(z,0))},
 V1:function(a){this.H9(new P.uQ())},
 H9:function(a){var z,y
 z=this.DG()
 y=a.$1(z)
 this.p5(z)
 return y},
-$isOl:true,
-$asOl:function(){return[P.qU]},
+$isz5:true,
+$asz5:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,165,"call"],
+$1:[function(a){return J.dH(a,this.a)},"$1",null,2,0,null,165,"call"],
 $isEH:true},
 rl:{
 "^":"TpZ:12;a",
@@ -12697,23 +12757,23 @@
 $isEH:true},
 uQ:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,165,"call"],
+$1:[function(a){return J.U2(a)},"$1",null,2,0,null,165,"call"],
 $isEH:true},
-D7:{
-"^":"ark;im,kG",
-gd3:function(){var z=this.kG
+P0:{
+"^":"ark;im,vN",
+gd3:function(){var z=this.vN
 return P.F(z.ad(z,new P.hT()),!0,W.h4)},
 aN:function(a,b){H.bQ(this.gd3(),b)},
 u:function(a,b,c){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.DG(z[b],c)},
+J.vR(z[b],c)},
 sB:function(a,b){var z=this.gd3().length
 if(b>=z)return
 else if(b<0)throw H.b(P.u("Invalid list length"))
 this.oq(0,b,z)},
-h:function(a,b){this.kG.uR.appendChild(b)},
+h:function(a,b){this.vN.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.kG.uR;z.G();)y.appendChild(z.Ff)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.vN.uR;z.G();)y.appendChild(z.lo)},
 tg:function(a,b){if(!J.x(b).$ish4)return!1
 return b.parentNode===this.im},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
@@ -12721,22 +12781,22 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 oq:function(a,b,c){H.bQ(C.Nm.aM(this.gd3(),b,c),new P.rK())},
-V1:function(a){J.Wf(this.kG.uR)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)J.Mp(z)
+V1:function(a){J.Wf(this.vN.uR)},
+f4:function(a){var z=this.grZ(this)
+if(z!=null)J.Rv(z)
 return z},
-xe:function(a,b,c){this.kG.xe(0,b,c)},
+aP:function(a,b,c){this.vN.aP(0,b,c)},
 UG:function(a,b,c){var z,y
-z=this.kG.uR
+z=this.vN.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.r5(z,c,y[b])},
+J.qD(z,c,y[b])},
 Rz:function(a,b){var z,y,x
 if(!J.x(b).$ish4)return!1
 for(z=0;z<this.gd3().length;++z){y=this.gd3()
 if(z>=y.length)return H.e(y,z)
 x=y[z]
-if(x===b){J.Mp(x)
+if(x===b){J.Rv(x)
 return!0}}return!1},
 gB:function(a){return this.gd3().length},
 t:function(a,b){var z=this.gd3()
@@ -12750,23 +12810,23 @@
 $isEH:true},
 rK:{
 "^":"TpZ:12;",
-$1:function(a){return J.Mp(a)},
+$1:function(a){return J.Rv(a)},
 $isEH:true}}],["","",,O,{
 "^":"",
 Im:{
-"^":"V15;ee,jw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V15;ee,jw,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.ee},
 snv:function(a,b){a.ee=this.ct(a,C.kY,a.ee,b)},
-gV8:function(a){return J.UQ(a.ee,"slot")},
-gyg:function(a){var z=J.UQ(a.ee,"slot")
+gnS:function(a){return J.UQ(a.ee,"slot")},
+guh:function(a){var z=J.UQ(a.ee,"slot")
 return typeof z==="number"},
-gWk:function(a){return!!J.x(J.UQ(a.ee,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.ee,"slot"),"type"),"@Field")},
+gB3:function(a){return!!J.x(J.UQ(a.ee,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.ee,"slot"),"type"),"@Field")},
 gFF:function(a){return J.UQ(a.ee,"source")},
 gyK:function(a){return a.jw},
 syK:function(a,b){a.jw=this.ct(a,C.uO,a.jw,b)},
-rT:[function(a,b){return J.aT(J.UQ(a.ee,"source")).cv(J.WB(J.eS(J.UQ(a.ee,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cC(a))},"$1","gi0",2,0,111,32],
+yg:[function(a,b){return J.wg(J.UQ(a.ee,"source")).cv(J.WB(J.eS(J.UQ(a.ee,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cCu(a))},"$1","gi0",2,0,111,32],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-vQ:[function(a,b,c){if(b===!0)this.rT(a,100).ml(new O.qm(a)).wM(c)
+vQ:[function(a,b,c){if(b===!0)this.yg(a,100).ml(new O.qm(a)).wM(c)
 else{a.jw=this.ct(a,C.uO,a.jw,null)
 c.$0()}},"$2","gus",4,0,118,119,120],
 static:{eka:function(a){var z,y,x,w
@@ -12775,7 +12835,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12788,22 +12848,22 @@
 V15:{
 "^":"uL+Pi;",
 $isd3:true},
-cC:{
+cCu:{
 "^":"TpZ:114;a",
 $1:[function(a){var z,y,x
 z=this.a
 y=J.UQ(a,"references")
 x=Q.pT(null,null)
 x.FV(0,y)
-z.jw=J.NB(z,C.uO,z.jw,x)},"$1",null,2,0,null,155,"call"],
+z.jw=J.Q5(z,C.uO,z.jw,x)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 qm:{
 "^":"TpZ:12;a",
-$1:[function(a){J.NB(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){J.Q5(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,B,{
 "^":"",
 pR:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gJp:function(a){var z=a.tY
 if(z!=null)if(J.xC(J.zH(z),"Sentinel"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
@@ -12813,42 +12873,42 @@
 return Q.xI.prototype.gJp.call(this,a)},
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new B.tV(a)).wM(c)
+if(b===!0)J.LE(z).ml(new B.Js(a)).wM(c)
 else{z.stJ(null)
-J.Z6(z,null)
+J.vF(z,null)
 c.$0()}},"$2","gus",4,0,118,119,120],
-static:{luW:function(a){var z,y,x,w
+static:{lu:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.uRw.LX(a)
-C.uRw.XI(a)
+C.hM.LX(a)
+C.hM.XI(a)
 return a}}},
-tV:{
+Js:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
-if(a.gPE()!=null){J.DF(a,a.gPE())
-a.sTE(a.gPE())}z=this.a
+if(a.gPE()!=null){J.WI(a,a.gPE())
+a.szz(a.gPE())}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
 y.ct(z,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,Z,{
 "^":"",
 EZ:{
-"^":"V16;VQ,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V16;VQ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 ghf:function(a){return a.VQ},
 shf:function(a,b){a.VQ=this.ct(a,C.fn,a.VQ,b)},
-vV:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+vV:[function(a,b){return J.wg(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
 pA:[function(a,b){J.LE(a.VQ).wM(b)},"$1","gvC",2,0,122,120],
 static:{CoW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -12856,7 +12916,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12871,7 +12931,7 @@
 $isd3:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V17;PM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V17;PM,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
 pA:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,19,102],
@@ -12881,50 +12941,50 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.j1o.LX(a)
-C.j1o.XI(a)
+C.j1.LX(a)
+C.j1.XI(a)
 return a}}},
 V17:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{RVI:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Ag.LX(a)
-C.Ag.XI(a)
+C.aj2.LX(a)
+C.aj2.XI(a)
 return a}}},
 mO:{
-"^":"V18;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V18;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{Ch:function(a){var z,y,x,w
+static:{V6:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12938,15 +12998,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{lIg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12957,119 +13017,119 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V19;yR,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V19;yR,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
 pA:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,19,102],
-nS:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gqw",0,0,17],
+T9:[function(a){J.LE(a.yR).wM(new E.Jj(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.c3
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.mZ
 if(z!=null){z.Gv()
-a.c3=null}},
+a.mZ=null}},
 static:{TiU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.VLs.LX(a)
-C.VLs.XI(a)
+C.x4.LX(a)
+C.x4.XI(a)
 return a}}},
 V19:{
 "^":"uL+Pi;",
 $isd3:true},
-XB:{
+Jj:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 H8:{
-"^":"V20;OS,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V20;OS,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPB:function(a){return a.OS},
 sPB:function(a,b){a.OS=this.ct(a,C.yL,a.OS,b)},
 pA:[function(a,b){J.LE(a.OS).wM(b)},"$1","gvC",2,0,19,102],
-nS:[function(a){J.LE(a.OS).wM(new E.cP(a))},"$0","gqw",0,0,17],
+T9:[function(a){J.LE(a.OS).wM(new E.uN(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.c3
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.mZ
 if(z!=null){z.Gv()
-a.c3=null}},
+a.mZ=null}},
 static:{ZhX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.tO.LX(a)
-C.tO.XI(a)
+C.GII.LX(a)
+C.GII.XI(a)
 return a}}},
 V20:{
 "^":"uL+Pi;",
 $isd3:true},
-cP:{
+uN:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 WS:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{jS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.bP.LX(a)
-C.bP.XI(a)
+C.Ug.LX(a)
+C.Ug.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{cua:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.IXz.LX(a)
-C.IXz.XI(a)
+C.wK.LX(a)
+C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V21;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V21;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
@@ -13079,7 +13139,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13093,7 +13153,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V22;uv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V22;uv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
 pA:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,19,102],
@@ -13103,7 +13163,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13117,36 +13177,36 @@
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{egu:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Fw.LX(a)
-C.Fw.XI(a)
+C.js.LX(a)
+C.js.XI(a)
 return a}}},
 Zn:{
-"^":"V23;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V23;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{kf:function(a){var z,y,x,w
+static:{n0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13160,9 +13220,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V24;h1,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gHy:function(a){return a.h1},
-sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
+"^":"V24;h1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gyW:function(a){return a.h1},
+syW:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
 pA:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,19,102],
 static:{iOo:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -13170,7 +13230,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13184,7 +13244,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V25;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V25;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
@@ -13194,7 +13254,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13208,15 +13268,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{ML:function(a){var z,y,x,w
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{wZ7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13227,25 +13287,25 @@
 C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V26;wT,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V26;wT,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
 pA:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,19,102],
-O7:[function(a){J.LE(a.wT).wM(new E.mj(a))},"$0","gdH",0,0,17],
+O7:[function(a){J.LE(a.wT).wM(new E.As(a))},"$0","gyT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.c3
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gyT(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.mZ
 if(z!=null){z.Gv()
-a.c3=null}},
+a.mZ=null}},
 static:{pIf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13258,23 +13318,23 @@
 V26:{
 "^":"uL+Pi;",
 $isd3:true},
-mj:{
+As:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qM:{
-"^":"V27;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V27;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{tX:function(a){var z,y,x,w
+static:{TEI:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13288,7 +13348,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 av:{
-"^":"ZzR;CB,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"ZzR;CB,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gEQ:function(a){return a.CB},
 sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
 static:{R7:function(a){var z,y,x,w
@@ -13298,41 +13358,41 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.CB=!1
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.OkI.LX(a)
-C.OkI.XI(a)
+C.Wa.LX(a)
+C.Wa.XI(a)
 return a}}},
 ZzR:{
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V28;RX,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V28;RX,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpE:function(a){return a.RX},
 Fn:function(a){return this.gpE(a).$0()},
 spE:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
 pA:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,19,102],
-O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gdH",0,0,17],
+O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gyT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.c3
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gyT(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.mZ
 if(z!=null){z.Gv()
-a.c3=null}},
+a.mZ=null}},
 static:{z1:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13348,40 +13408,40 @@
 Cc:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,X,{
 "^":"",
 Se:{
-"^":"Y2;B1>,SF,H,Zn<,vs<,zg<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
-gtT:function(a){return J.on(this.H)},
-Pz:function(a){var z,y,x,w,v,u,t,s
+"^":"Y2;B1>,X1,H,Zn<,mj<,ki<,Vh<,ZX<,eT,yt,qu,oH,PU,aZ,Lk,Vg,ij",
+gtT:function(a){return J.tX(this.H)},
+Pz:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
 y=J.UQ(z,"threshold")
-x=this.ks
+x=this.qu
 if(x.length>0)return
-for(w=this.H,v=J.mY(J.Mx(w)),u=this.SF;v.G();){t=v.gl()
-s=J.L9(t.gAv(),w.gAv())
+for(w=this.H,v=J.mY(J.dd(w)),u=this.X1,t=u.Av;v.G();){s=v.gl()
+r=J.X9(s.gAv(),w.gAv())
 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},
+if(!(r>y||J.X9(J.tX(s).gDu(),t)>y))continue
+x.push(X.i3(z,u,s,this))}},
+aY:function(){},
+Nh:function(){return J.q8(J.dd(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
-this.ZX=G.J8(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
+this.ZX=G.J8(J.X9(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.G0(z.gAv(),this.SF.Av)
-else this.vs=G.G0(z.gAv(),d.H.gAv())
-this.zg=G.G0(z.gAv(),this.SF.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+if(J.xC(J.Iz(y.gtT(z)),C.oA)){this.Zn="Tag (category)"
+if(d==null)this.mj=G.dj(z.gAv(),this.X1.Av)
+else this.mj=G.dj(z.gAv(),d.H.gAv())
+this.ki=G.dj(z.gAv(),this.X1.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.AA))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
-if(d==null)this.vs=G.G0(z.gAv(),this.SF.Av)
-else this.vs=G.G0(z.gAv(),d.H.gAv())
-this.zg=G.G0(y.gtT(z).gDu(),this.SF.Av)}z=this.oH
-z.push(this.vs)
-z.push(this.zg)},
-static:{SJ:function(a,b,c,d){var z,y
+if(d==null)this.mj=G.dj(z.gAv(),this.X1.Av)
+else this.mj=G.dj(z.gAv(),d.H.gAv())
+this.ki=G.dj(y.gtT(z).gDu(),this.X1.Av)}z=this.oH
+z.push(this.mj)
+z.push(this.ki)},
+static:{i3:function(a,b,c,d){var z,y
 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)
@@ -13389,7 +13449,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V29;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V29;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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},
@@ -13398,16 +13458,16 @@
 sLW:function(a,b){a.WT=this.ct(a,C.Gs,a.WT,b)},
 gUo:function(a){return a.Uw},
 sUo:function(a,b){a.Uw=this.ct(a,C.Dj,a.Uw,b)},
-gP2:function(a){return a.Ik},
-sP2:function(a,b){a.Ik=this.ct(a,C.YD,a.Ik,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)},
+gXc:function(a){return a.TM},
+sXc: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
@@ -13424,14 +13484,14 @@
 if(typeof w!=="number")return H.s(w)
 z=C.CD.Sy(1000000/w,0)
 a.Ik=this.ct(a,C.YD,a.Ik,z)
-z=G.mG(J.UQ(a.oi,"timeSpan"))
+z=G.mGl(J.UQ(a.oi,"timeSpan"))
 a.ev=this.ct(a,C.zz,a.ev,z)
 z=a.XX
 v=C.YI.bu(z*100)+"%"
 a.fE=this.ct(a,C.aH,a.fE,v)
-J.aT(a.oi).N3(a.oi)
-J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,19,59],
+J.wg(a.oi).f9(a.oi)
+J.qQ(a.oi,"threshold",z)
+this.Zb(a)},"$1","gwh",2,0,19,59],
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
@@ -13439,31 +13499,31 @@
 this.Zb(a)},
 ov:[function(a,b){this.pA(a,null)},"$1","gb6",2,0,19,59],
 pA:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
+J.wg(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
 Zb:function(a){if(a.oi==null)return
 this.FG(a)},
 FG:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gqo()
+z=J.wg(a.oi).gqo()
 if(z==null)return
-try{a.Hm.G7(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
+try{a.Hm.rT(X.i3(a.oi,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.oP(w,null)
-N.QM("").r0("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
+N.QM("").OW("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
 Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
-ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+ZZ:[function(a,b){return C.Jp[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
 wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.IO(z)
+v=J.JC(z)
 if(typeof v!=="number")return v.W()
-w.lo(v-1)}catch(u){w=H.Ru(u)
+w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
-static:{"^":"B6",jD:function(a){var z,y,x,w
+N.QM("").OW("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+static:{"^":"B6",CM:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13478,7 +13538,7 @@
 a.XX=0.0002
 a.TM="uv"
 a.Xg="#tableTree"
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13494,19 +13554,19 @@
 Xy:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.oi=J.NB(z,C.vb,z.oi,a)},"$1",null,2,0,null,166,"call"],
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,166,"call"],
 $isEH:true}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{Zgg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13518,7 +13578,7 @@
 return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V30;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V30;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y,x,w
@@ -13527,7 +13587,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13541,25 +13601,25 @@
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V31;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V31;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return J.Ho(a.ow)},"$1","gX0",2,0,167,13],
+Fv:[function(a,b){return J.Ag(a.ow)},"$1","gX0",2,0,167,13],
 qW:[function(a,b){$.Kh.pZ(a.ow)
 return J.df(a.ow)},"$1","gDQ",2,0,167,13],
 PyB:[function(a,b){$.Kh.pZ(a.ow)
-return J.UR(a.ow)},"$1","gLc",2,0,167,13],
-XQ:[function(a,b){$.Kh.pZ(a.ow)
-return J.MU(a.ow)},"$1","gqF",2,0,167,13],
+return J.v7(a.ow)},"$1","gLc",2,0,167,13],
+lMu:[function(a,b){$.Kh.pZ(a.ow)
+return J.J1(a.ow)},"$1","gqF",2,0,167,13],
 Cx:[function(a,b){$.Kh.pZ(a.ow)
 return J.Fy(a.ow)},"$1","gZp",2,0,167,13],
-static:{dmb:function(a){var z,y,x,w
+static:{v8:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13573,7 +13633,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Qh:{
-"^":"V32;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V32;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y,x,w
@@ -13582,7 +13642,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13596,7 +13656,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V33;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V33;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{TSH:function(a){var z,y,x,w
@@ -13605,7 +13665,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13618,10 +13678,10 @@
 V33:{
 "^":"uL+Pi;",
 $isd3:true},
-vT:{
-"^":"a;NK,aF",
+OD:{
+"^":"a;Y0,ZF",
 eC:function(a){var z,y,x,w,v,u
-z=this.NK.Yb
+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.RE(a),x=J.mY(y.gvc(a));x.G();){w=x.gl()
@@ -13633,28 +13693,28 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 Z4:{
-"^":"V34;wd,iw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V34;wd,iw,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
 o4:[function(a,b){var z,y,x
 if(a.wd==null)return
-if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
+if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.OD(new G.eM(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.aF
-if(x==null){x=new G.yD(null,P.L5(null,null,null,null,null))
+x=z.ZF
+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.aF=x}x.Am(0,z.NK)}},"$1","ghU",2,0,19,59],
+z.ZF=x}x.Am(0,z.Y0)}},"$1","ghU",2,0,19,59],
 static:{d7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13669,14 +13729,14 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 Lr:{
-"^":"a;KK,S2",
+"^":"a;Yi,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.KK.Yb
+z=this.Yi.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=J.mY(a.gaf());y.G();){x=y.Ff
+for(y=J.mY(a.gfJ());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.Q0(a.gaf(),"Idle")
+w=J.za(a.gfJ(),"Idle")
 v=a.gvh()
 for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
@@ -13701,29 +13761,29 @@
 if(u>=y.length)return H.e(y,u)
 y=y[u].XE
 if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.X9(y[q],r)*100))}++q}}y=[]
 C.Nm.FV(y,C.Nm.ez(s,P.En()))
 y=new P.GD(y)
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V35;TO,Cn,LR,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V35;TO,pF,e6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
-Pd:[function(a){a.TO.xB().ml(new L.LX(a))},"$0","gxD",0,0,17],
+return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+Pd:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gxD",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.Cn=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
-Lx:function(a){var z
-Z.uL.prototype.Lx.call(this,a)
-z=a.Cn
+a.pF=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
+dQ:function(a){var z
+Z.uL.prototype.dQ.call(this,a)
+z=a.pF
 if(z!=null){z.Gv()
-a.Cn=null}},
+a.pF=null}},
 pA:[function(a,b){J.LE(a.TO).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
+Da:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
 Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,167,13],
-qW:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,167,13],
+qW:[function(a,b){return a.TO.cv("resume").ml(new L.CZ(a))},"$1","gDQ",2,0,167,13],
 static:{Qtp:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -13731,16 +13791,16 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.LR=new L.Lr(new G.Kf(z),null)
-a.f4=[]
+a.e6=new L.Lr(new G.eM(z),null)
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.hys.LX(a)
-C.hys.XI(a)
+C.Xe.LX(a)
+C.Xe.XI(a)
 return a}}},
 V35:{
 "^":"uL+Pi;",
@@ -13749,50 +13809,50 @@
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
-y=z.LR
+y=z.e6
 y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null){if(y.S2==null){w=P.L5(null,null,null,null,null)
-v=new G.yD(null,w)
+v=new G.qu(null,w)
 v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(0,y.KK)}if(z.Cn!=null)z.Cn=P.cH(P.ii(0,0,0,0,0,1),J.vc(z))},"$1",null,2,0,null,168,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(0,y.Yi)}if(z.pF!=null)z.pF=P.cH(P.ii(0,0,0,0,0,1),J.vc(z))},"$1",null,2,0,null,168,"call"],
 $isEH:true},
 CV:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-Vq:{
+CZ:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,Z,{
 "^":"",
 xh:{
 "^":"a;ue,GO",
-KW:function(a,b){var z,y,x,w,v,u,t,s
+Qp: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.RE(a),x=J.mY(y.gvc(a)),w=this.ue,v=b+1;x.G();){u=x.gl()
 t=y.t(a,u)
 s=J.x(t)
-if(!!s.$isT8){s=C.xB.U("  ",b)
+if(!!s.$isT8){s=C.yo.U("  ",b)
 w.IN+=s
 s="\""+H.d(u)+"\": {\n"
 w.IN+=s
-this.KW(t,v)
-s=C.xB.U("  ",b)
+this.Qp(t,v)
+s=C.yo.U("  ",b)
 s=w.IN+=s
-w.IN=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
+w.IN=s+"}\n"}else if(!!s.$isWO){s=C.yo.U("  ",b)
 w.IN+=s
 s="\""+H.d(u)+"\": [\n"
 w.IN+=s
 this.J7(t,v)
-s=C.xB.U("  ",b)
+s=C.yo.U("  ",b)
 s=w.IN+=s
-w.IN=s+"]\n"}else{s=C.xB.U("  ",b)
+w.IN=s+"]\n"}else{s=C.yo.U("  ",b)
 w.IN+=s
 s="\""+H.d(u)+"\": "+H.d(t)
 s=w.IN+=s
@@ -13803,24 +13863,24 @@
 z.h(0,a)
 for(y=J.mY(a),x=this.ue,w=b+1;y.G();){v=y.gl()
 u=J.x(v)
-if(!!u.$isT8){u=C.xB.U("  ",b)
+if(!!u.$isT8){u=C.yo.U("  ",b)
 u=x.IN+=u
 x.IN=u+"{\n"
-this.KW(v,w)
-u=C.xB.U("  ",b)
+this.Qp(v,w)
+u=C.yo.U("  ",b)
 u=x.IN+=u
-x.IN=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
+x.IN=u+"}\n"}else if(!!u.$isWO){u=C.yo.U("  ",b)
 u=x.IN+=u
 x.IN=u+"[\n"
 this.J7(v,w)
-u=C.xB.U("  ",b)
+u=C.yo.U("  ",b)
 u=x.IN+=u
-x.IN=u+"]\n"}else{u=C.xB.U("  ",b)
+x.IN=u+"]\n"}else{u=C.yo.U("  ",b)
 x.IN+=u
 u=x.IN+=typeof v==="string"?v:H.d(v)
 x.IN=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V36;Ly,cs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V36;Ly,cs,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -13828,21 +13888,22 @@
 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)
+y=P.fM(null,null,null,null)
 x=a.Ly
 z.IN=""
 z.KF("{\n")
-new Z.xh(z,y).KW(x,0)
+new Z.xh(z,y).Qp(x,0)
 z.KF("}\n")
 z=z.IN
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gLU",2,0,19,59],
+z=z.charCodeAt(0)==0?z:z
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gWF",2,0,19,59],
 static:{mA:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13857,15 +13918,15 @@
 $isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{bUN:function(a){var z,y,x,w
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{Le:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13877,34 +13938,34 @@
 return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V37;px,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gHt:function(a){return a.px},
-sHt:function(a,b){a.px=this.ct(a,C.EV,a.px,b)},
-vV:[function(a,b){return J.aT(a.px).cv(J.WB(J.eS(a.px),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
-pA:[function(a,b){J.LE(a.px).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.px).wM(b)},"$1","gDX",2,0,19,102],
-static:{SPd:function(a){var z,y,x,w
+"^":"V37;a1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gHt:function(a){return a.a1},
+sHt:function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},
+vV:[function(a,b){return J.wg(a.a1).cv(J.WB(J.eS(a.a1),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+pA:[function(a,b){J.LE(a.a1).wM(b)},"$1","gvC",2,0,19,102],
+Da:[function(a,b){J.y9(a.a1).wM(b)},"$1","gDX",2,0,19,102],
+static:{ec:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.fQ.LX(a)
-C.fQ.XI(a)
+C.MG.LX(a)
+C.MG.XI(a)
 return a}}},
 V37:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
-"^":"a;oc>,eT>,cK,Zm>,ks>,z3",
+"^":"a;oc>,eT>,cK,Zm>,qu>,z3",
 gB8:function(){var z,y,x
 z=this.eT
 y=z==null||J.xC(J.DA(z),"")
@@ -13932,18 +13993,18 @@
 v=J.Lp(v)}else N.QM("").js(w)}},
 X2A:function(a,b,c){return this.Y6(C.EkO,a,b,c)},
 kS:function(a){return this.X2A(a,null,null)},
-TF:function(a,b,c){return this.Y6(C.t4,a,b,c)},
-J4:function(a){return this.TF(a,null,null)},
+TF:function(a,b,c){return this.Y6(C.R5,a,b,c)},
+Ny:function(a){return this.TF(a,null,null)},
 DH:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.DH(a,null,null)},
-r0:function(a,b,c){return this.Y6(C.nT,a,b,c)},
-j2:function(a){return this.r0(a,null,null)},
+OW:function(a,b,c){return this.Y6(C.nT,a,b,c)},
+j2:function(a){return this.OW(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.cd,a,b,c)},
 YX:function(a){return this.WB(a,null,null)},
 qX:function(){if($.RL||this.eT==null){var z=this.z3
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.z3=z}z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").qX()},
+return H.VM(new P.rk(z),[H.u3(z,0)])}else return N.QM("").qX()},
 js:function(a){var z=this.z3
 if(z!=null){if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)}},
@@ -13955,11 +14016,11 @@
 "^":"TpZ:76;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(C.yo.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
+y=C.yo.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.TJ)
+else{x=N.QM(C.yo.Nj(z,0,y))
+z=C.yo.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
 v=new N.TJ(z,x,null,w,H.VM(new P.A2(w),[null,null]),null)
 v.QL(z,x,w)
 return v},
@@ -13986,7 +14047,7 @@
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"$0","gCR",0,0,73],
 $isNg:true,
-static:{"^":"V7K,tmj,Enk,LkO,reI,kH8,hlK,MHK,Uu,wC,uxc"}},
+static:{"^":"V7K,tmj,Enk,LkO,reI,kH8,hlK,MHK,Uu,lDu,uxc"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gCR",0,0,73],
@@ -13995,14 +14056,14 @@
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e535())
+N.QM("").gSZ().yI(new F.e546())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
 z=J.UQ($.Xw(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e536())},
-e535:{
+$.Ib().MM.ml(G.vN()).ml(new F.e547())},
+e546:{
 "^":"TpZ:170;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
@@ -14011,17 +14072,17 @@
 if(z)return
 P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
 $isEH:true},
-e536:{
+e547:{
 "^":"TpZ:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
-try{A.YK()}catch(y){x=H.Ru(y)
+try{A.Ok()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["","",,N,{
 "^":"",
 qn:{
-"^":"V38;GC,OM,zv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V38;GC,OM,zv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 guc:function(a){return a.GC},
 suc:function(a,b){a.GC=this.ct(a,C.EP,a.GC,b)},
 god:function(a){return a.OM},
@@ -14032,24 +14093,24 @@
 if(a.zv!=null)return
 if(a.OM!=null){z=a.GC
 z=z!=null&&z.gcX()!=null}else z=!1
-if(z){z=a.OM.gpG().LL.t(0,a.GC.gcX())
+if(z){z=a.OM.gpG().tf.t(0,a.GC.gcX())
 z=this.ct(a,C.tf,a.zv,z)
 a.zv=z
-if(z==null){z=a.OM.gSn().LL.t(0,a.GC.gcX())
-a.zv=this.ct(a,C.tf,a.zv,z)}}if(a.zv==null&&a.OM!=null){z=a.OM.gpG().LL
+if(z==null){z=a.OM.gSn().tf.t(0,a.GC.gcX())
+a.zv=this.ct(a,C.tf,a.zv,z)}}if(a.zv==null&&a.OM!=null){z=a.OM.gpG().tf
 y=z.gUQ(z)
-z=y.gqG(y)
+z=y.gtH(y)
 a.zv=this.ct(a,C.tf,a.zv,z)}},
 Es:function(a){this.Sd(a)},
 vD:[function(a,b){var z=a.OM
-if(z!=null)z.VT().ml(new N.FQ(a))},"$1","guz",2,0,19,59],
+if(z!=null)z.VT().ml(new N.QI(a))},"$1","grV",2,0,19,59],
 pA:[function(a,b){a.OM.VT().wM(b)},"$1","gvC",2,0,19,102],
 Cd9:[function(a,b,c,d){var z,y,x
 z=J.Vs(d).dA.getAttribute("data-id")
-y=a.OM.gpG().LL.t(0,z)
+y=a.OM.gpG().tf.t(0,z)
 y=this.ct(a,C.tf,a.zv,y)
 a.zv=y
-if(y==null){y=a.OM.gSn().LL.t(0,z)
+if(y==null){y=a.OM.gSn().tf.t(0,z)
 y=this.ct(a,C.tf,a.zv,y)
 a.zv=y}x=a.GC
 if(y!=null)x.scX(z)
@@ -14061,7 +14122,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14074,16 +14135,16 @@
 V38:{
 "^":"uL+Pi;",
 $isd3:true},
-FQ:{
+QI:{
 "^":"TpZ:12;a",
 $1:[function(a){J.O8(this.a)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 I2:{
-"^":"V39;GC,on,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V39;GC,YE,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 guc:function(a){return a.GC},
 suc:function(a,b){a.GC=this.ct(a,C.EP,a.GC,b)},
-gbe:function(a){return a.on},
-sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
+gbe:function(a){return a.YE},
+sbe:function(a,b){a.YE=this.ct(a,C.kB,a.YE,b)},
 jV:function(a,b,c){var z,y
 if(b==null)return
 for(z=J.RE(b),y=0;y<J.q8(z.gbG(b));++y)if(J.xC(H.BU(J.Vm(J.UQ(z.gbG(b),y)),null,null),c))return y
@@ -14091,21 +14152,21 @@
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 this.hB(a)},
 hB:function(a){var z,y
-if(a.on==null)return
+if(a.YE==null)return
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#refreshrate")
 if(z==null)return
-J.yi(z,this.jV(a,z,a.on.gmw()!=null?J.cj(a.on.gmw()).gVs():0))
+J.yi(z,this.jV(a,z,a.YE.gmw()!=null?J.cj(a.YE.gmw()).gVs():0))
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#buffersize")
-J.yi(y,this.jV(a,y,a.on.ghM()))},
+J.yi(y,this.jV(a,y,a.YE.ghM()))},
 y3q:[function(a,b){this.hB(a)},"$1","gyZ",2,0,12,59],
-rm:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$isbs").value,null,null)
-y=a.on
+tC:[function(a,b,c,d){var z,y
+z=H.BU(H.Go(d,"$iszk").value,null,null)
+y=a.YE
 if(y==null)return
 a.GC.ZW(z,y)},"$3","gIf",6,0,105,2,106,107],
 d7:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$isbs").value,null,null)
-y=a.on
+z=H.BU(H.Go(d,"$iszk").value,null,null)
+y=a.YE
 if(y==null)return
 y.shM(z)},"$3","gTK",6,0,105,2,106,107],
 static:{rI3:function(a){var z,y,x,w
@@ -14114,7 +14175,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14128,9 +14189,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 FB:{
-"^":"V40;lB,qV,on,OM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gbe:function(a){return a.on},
-sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
+"^":"V40;Mu,aF,YE,OM,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gbe:function(a){return a.YE},
+sbe:function(a,b){a.YE=this.ct(a,C.kB,a.YE,b)},
 god:function(a){return a.OM},
 sod:function(a,b){a.OM=this.ct(a,C.rB,a.OM,b)},
 Es:function(a){var z=P.ii(0,0,0,0,0,1)
@@ -14138,23 +14199,23 @@
 Z.uL.prototype.Es.call(this,a)},
 yY:function(a){this.T1(a)},
 T1:function(a){var z,y
-if(a.qV==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
+if(a.aF==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
 if(z==null)return
-y=new G.yD(null,P.L5(null,null,null,null,null))
+y=new G.qu(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"LineChart"),[z])
-a.qV=y}if(a.on==null)return
-this.qt(a)
-a.qV.Am(0,a.lB)},
-qt:function(a){var z,y,x,w,v,u,t
-z=a.lB.Yb
+a.aF=y}if(a.YE==null)return
+this.Ta(a)
+a.aF.Am(0,a.Mu)},
+Ta:function(a){var z,y,x,w,v,u,t
+z=a.Mu.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-for(y=0;y<a.on.gJk().XG.length;++y){x=a.on.gJk().XG
+for(y=0;y<a.YE.gJk().xN.length;++y){x=a.YE.gJk().xN
 if(y>=x.length)return H.e(x,y)
 w=x[y]
 x=w.gFl()
 v=J.Vm(w)
 u=[]
-C.Nm.FV(u,C.Nm.ez([x.gGt(),x.gS6(),x.gBM()],P.En()))
+C.Nm.FV(u,C.Nm.ez([x.gX3(),x.gcO(),x.gIv()],P.En()))
 t=new P.GD(u)
 t.$builtinTypeInfo=[null]
 x=[]
@@ -14163,10 +14224,10 @@
 x.$builtinTypeInfo=[null]
 z.V7("addRow",[x])}},
 y3q:[function(a,b){var z
-if(!J.xC(b,a.on)){z=a.lB.Yb
+if(!J.xC(b,a.YE)){z=a.Mu.Yb
 z.V7("removeColumns",[0,z.nQ("getNumberOfColumns")])
 z.V7("addColumn",["timeofday","time"])
-z.V7("addColumn",["number",J.DA(a.on)])}},"$1","gyZ",2,0,12,59],
+z.V7("addColumn",["number",J.DA(a.YE)])}},"$1","gyZ",2,0,12,59],
 static:{kUw:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -14174,23 +14235,23 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.lB=new G.Kf(z)
-a.f4=[]
+a.Mu=new G.eM(z)
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.Mw.LX(a)
-C.Mw.XI(a)
+C.h1.LX(a)
+C.h1.XI(a)
 return a}}},
 V40:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V41;i4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V41;i4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y,x,w
@@ -14200,21 +14261,21 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.i4=!0
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.aV.LX(a)
-C.aV.XI(a)
+C.kD.LX(a)
+C.kD.XI(a)
 return a}}},
 V41:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V42;KU,V4,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V42;KU,V4,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gwp:function(a){return a.V4},
@@ -14230,7 +14291,7 @@
 a.KU="#"
 a.V4="---"
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14244,12 +14305,12 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V43;KU,V4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V43;KU,V4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gwp:function(a){return a.V4},
 swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{JR:function(a){var z,y,x,w
+static:{P5Z:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -14257,7 +14318,7 @@
 w=P.Fl(null,null)
 a.KU="#"
 a.V4="---"
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14271,29 +14332,29 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V44;rU,SB,Hq,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V44;rU,SB,z2,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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.Hq},
-sph:function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},
-VV:[function(a,b,c,d){var z=a.SB
+gph:function(a){return a.z2},
+sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
+Kp:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,116,2,106,107],
-uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
-static:{ZC:function(a){var z,y,x,w
+if(a.rU!=null)this.LY(a,this.gec(a))},"$3","gyr",6,0,116,2,106,107],
+uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gec",0,0,17],
+static:{wC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.SB=!1
-a.Hq="Refresh"
-a.f4=[]
+a.z2="Refresh"
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14307,14 +14368,14 @@
 "^":"uL+Pi;",
 $isd3:true},
 ye:{
-"^":"uL;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"uL;tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{mBQ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14325,17 +14386,17 @@
 C.pl.XI(a)
 return a}}},
 G1:{
-"^":"V45;Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V45;Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{Br:function(a){var z,y,x,w
+static:{PU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14349,24 +14410,24 @@
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V46;Jo,iy,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V46;Jo,iy,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","grV",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
 su6:function(a,b){},
-static:{YtF:function(a){var z,y,x,w
+static:{zf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14380,19 +14441,19 @@
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V47;VW,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V47;VW,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gHt:function(a){return a.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,x,w
+static:{Qje:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14406,7 +14467,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V48;Au,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V48;Au,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -14418,7 +14479,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14432,16 +14493,16 @@
 "^":"uL+Pi;",
 $isd3:true},
 NK:{
-"^":"V49;rv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V49;rv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
-static:{Xii:function(a){var z,y,x,w
+static:{kR:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14455,27 +14516,27 @@
 "^":"uL+Pi;",
 $isd3:true},
 Zx:{
-"^":"V50;rv,Wx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V50;rv,Wx,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
-gBk:function(a){return a.Wx},
-sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-qW:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,167,13],
-PyB:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.UR(J.aT(a.Wx))},"$1","gLc",2,0,167,13],
-XQ:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,167,13],
-Cx:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.Fy(J.aT(a.Wx))},"$1","gZp",2,0,167,13],
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,171,2,106,107],
+gMl:function(a){return a.Wx},
+sMl:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
+qW:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
+return J.df(J.wg(a.Wx))},"$1","gDQ",2,0,167,13],
+PyB:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
+return J.v7(J.wg(a.Wx))},"$1","gLc",2,0,167,13],
+lMu:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
+return J.J1(J.wg(a.Wx))},"$1","gqF",2,0,167,13],
+Cx:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
+return J.Fy(J.wg(a.Wx))},"$1","gZp",2,0,167,13],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gRN",6,0,171,2,106,107],
 static:{yno:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14490,19 +14551,19 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 qV:{
-"^":"V51;dV,qB,GI,wA,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gWA:function(a){return a.dV},
-sWA:function(a,b){a.dV=this.ct(a,C.td,a.dV,b)},
+"^":"V51;xt,qB,GI,wA,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gWA:function(a){return a.xt},
+sWA:function(a,b){a.xt=this.ct(a,C.td,a.xt,b)},
 gIi:function(a){return a.qB},
 sIi:function(a,b){a.qB=this.ct(a,C.XM,a.qB,b)},
 gyK:function(a){return a.GI},
 syK:function(a,b){a.GI=this.ct(a,C.uO,a.GI,b)},
 gCF:function(a){return a.wA},
 sCF:function(a,b){a.wA=this.ct(a,C.tg,a.wA,b)},
-zs:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/retained")).ml(new L.rQ(a))},"$1","ghN",2,0,111,113],
-Cc:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/retaining_path?limit="+H.d(b))).ml(new L.ky(a))},"$1","gCI",2,0,111,32],
-rT:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/inbound_references?limit="+H.d(b))).ml(new L.WZ(a))},"$1","gi0",2,0,111,32],
-pA:[function(a,b){J.LE(a.dV).wM(b)},"$1","gvC",2,0,122,120],
+Cq:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/retained")).ml(new L.uW(a))},"$1","ghN",2,0,111,113],
+Cc:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/retaining_path?limit="+H.d(b))).ml(new L.vT(a))},"$1","gCI",2,0,111,32],
+yg:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/inbound_references?limit="+H.d(b))).ml(new L.C1y(a))},"$1","gi0",2,0,111,32],
+pA:[function(a,b){J.LE(a.xt).wM(b)},"$1","gvC",2,0,122,120],
 static:{P5f:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -14510,60 +14571,84 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.wA=null
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.br.LX(a)
-C.br.XI(a)
+C.aD.LX(a)
+C.aD.XI(a)
 return a}}},
 V51:{
 "^":"uL+Pi;",
 $isd3:true},
-rQ:{
-"^":"TpZ:114;a",
+uW:{
+"^":"TpZ:115;a",
 $1:[function(a){var z,y
 z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.wA=J.NB(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
+y=H.BU(a.gPE(),null,null)
+z.wA=J.Q5(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-ky:{
+vT:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.qB=J.NB(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
+z.qB=J.Q5(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-WZ:{
+C1y:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.GI=J.NB(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["","",,V,{
+z.GI=J.Q5(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
+$isEH:true}}],["","",,L,{
+"^":"",
+NT:{
+"^":"V52;R6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gWA:function(a){return a.R6},
+sWA:function(a,b){a.R6=this.ct(a,C.td,a.R6,b)},
+static:{di:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.Fl(null,null)
+w=P.Fl(null,null)
+a.Iy=[]
+a.OD=!1
+a.kK=!1
+a.ZM=z
+a.ZQ=y
+a.qJ=x
+a.wy=w
+C.LQi.LX(a)
+C.LQi.XI(a)
+return a}}},
+V52:{
+"^":"uL+Pi;",
+$isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V52;qC,i6=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gz2:function(a){return a.qC},
-sz2:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
+"^":"V53;qC,i6=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gd0:function(a){return a.qC},
+sd0:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 Es:function(a){var z,y,x
 Z.uL.prototype.Es.call(this,a)
-if(a.qC===!0){z=new G.mL(H.VM([],[G.OS]),null,new G.ng("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
+if(a.qC===!0){z=new G.mL(H.VM([],[G.MQ]),null,new G.OR("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
 z.E0(a)
-a.i6=z}else{z=H.VM([],[G.OS])
+a.i6=z}else{z=H.VM([],[G.MQ])
 y=Q.pT(null,D.Mk)
-x=new G.nD(new G.V3("targetManager"),Q.pT(null,null),null,null,null,null)
-x.lK()
-y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
+x=new G.uh(new G.V3("targetManager"),Q.pT(null,null),null,null,null,null)
+x.vs()
+y=new G.mL(z,null,new G.OR("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
-static:{JT8:function(a){var z,y,x,w
+static:{Lu:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.qC=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14573,49 +14658,49 @@
 C.YpE.LX(a)
 C.YpE.XI(a)
 return a}}},
-V52:{
+V53:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"Xfs;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Xfs;tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gi6:function(a){return $.Kh},
-guc:function(a){return this.gi6(a).fN},
-gl6:function(a){return J.D8(this.guc(a))},
+guc:function(a){return this.gi6(a).Ef},
+gl6:function(a){return J.H3(this.guc(a))},
 Es:function(a){A.zs.prototype.Es.call(this,a)
 this.U2(a)},
-wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
-Lx:function(a){A.zs.prototype.Lx.call(this,a)
-this.yM(a)},
+aC:function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},
+dQ:function(a){A.zs.prototype.dQ.call(this,a)
+this.mv(a)},
 I9:function(a){A.zs.prototype.I9.call(this,a)},
 gMT:function(a){return a.tB},
 sMT:function(a,b){a.tB=this.ct(a,C.O9,a.tB,b)},
 yY:function(a){},
 JnB:[function(a,b){if(a.tB!=null)this.U2(a)
-else this.yM(a)},"$1","grX",2,0,19,59],
+else this.mv(a)},"$1","gqA",2,0,19,59],
 U2:function(a){var z
 if(a.tB==null)return
-z=a.Qf
+z=a.IO
 if(z!=null)z.Gv()
-a.Qf=P.cH(a.tB,this.gPs(a))},
-yM:function(a){var z=a.Qf
+a.IO=P.cH(a.tB,this.gPs(a))},
+mv:function(a){var z=a.IO
 if(z!=null)z.Gv()
-a.Qf=null},
+a.IO=null},
 Yl:[function(a){var z
 this.yY(a)
 z=a.tB
-if(z==null){this.yM(a)
-return}a.Qf=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
+if(z==null){this.mv(a)
+return}a.IO=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
 wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gCK",6,0,171,87,106,107],
-Gxe:[function(a,b){this.gi6(a).Z6
+XD:[function(a,b){this.gi6(a).Z6
 return"#"+H.d(b)},"$1","gGs",2,0,172,173],
-Qb:[function(a,b){return G.mG(b)},"$1","gSs",2,0,174,175],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
-YH:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,20],
+hA:[function(a,b){return G.mGl(b)},"$1","gSs",2,0,174,175],
+Ze:[function(a,b){return G.XzS(b)},"$1","gbJ",2,0,14,15],
+Zl:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,20],
 Rms:[function(a,b,c){var z,y,x,w
 z=[]
-z.push(C.xB.j("'",0))
-for(y=J.GG(b),y=y.gA(y);y.G();){x=y.Ff
+z.push(C.yo.j("'",0))
+for(y=J.OX(b),y=y.gA(y);y.G();){x=y.lo
 w=J.x(x)
 if(w.n(x,"\n".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\n"))
 else if(w.n(x,"\r".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\r"))
@@ -14626,25 +14711,25 @@
 else if(w.n(x,"$".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\$"))
 else if(w.n(x,"\\".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\\\"))
 else if(w.n(x,"'".charCodeAt(0)))C.Nm.FV(z,new J.IA("'"))
-else if(w.C(x,32))C.Nm.FV(z,new J.IA("\\u"+H.d(x)))
+else if(w.C(x,32))C.Nm.FV(z,new J.IA("\\u"+C.yo.LL(w.WZ(x,16),4,"0")))
 else z.push(x)}if(c===!0)C.Nm.FV(z,new J.IA("..."))
-else z.push(C.xB.j("'",0))
-return P.HM(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,176,69,20,177],
-static:{ew:function(a){var z,y,x,w
+else z.push(C.yo.j("'",0))
+return P.nB(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,176,69,20,177],
+static:{LD:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.mk.LX(a)
-C.mk.XI(a)
+C.Pfz.LX(a)
+C.Pfz.XI(a)
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
@@ -14662,14 +14747,14 @@
 if(z==null){z=this.gcm(a)
 z=P.bK(this.gym(a),z,!0,null)
 a.Vg=z}z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])},
-w37:[function(a){},"$0","gcm",0,0,17],
+return H.VM(new P.rk(z),[H.u3(z,0)])},
+Tr:[function(a){},"$0","gcm",0,0,17],
 dt:[function(a){a.Vg=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
-z=a.fn
-a.fn=null
+z=a.ij
+a.ij=null
 if(this.gnz(a)&&z!=null){y=a.Vg
-x=H.VM(new P.Yp(z),[T.yj])
+x=H.VM(new P.Ui(z),[T.yj])
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(x)
 return!0}return!1},"$0","gDx",0,0,131],
@@ -14680,8 +14765,8 @@
 return z},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},
+if(a.ij==null){a.ij=[]
+P.rb(this.gDx(a))}a.ij.push(b)},
 $isd3:true}}],["","",,T,{
 "^":"",
 yj:{
@@ -14692,7 +14777,7 @@
 bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isqI:true}}],["","",,O,{
 "^":"",
-X0:function(){var z,y,x,w,v,u,t,s,r,q
+N0:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.Oo==null)return
 $.Td=!0
@@ -14708,27 +14793,27 @@
 s=J.RE(t)
 if(s.gnz(t)){if(s.HC(t)){if(w)y.push([u,t])
 v=!0}$.Oo.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.S5()
+if(w&&v){w=$.aT()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.Ff
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(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))+".")}}$.Nc=$.Oo.length
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.dL=$.Oo.length
 $.Td=!1},
 Ht:function(){var z={}
 z.a=!1
-z=new O.YC(z)
-return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
-YC:{
+z=new O.Nq(z)
+return new P.yQ(null,null,null,null,new O.zI(z),new O.bF(z),null,null,null,null,null,null)},
+Nq:{
 "^":"TpZ:178;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.N0(z))},
+a.RK(b,new O.jB(z))},
 $isEH:true},
-N0:{
+jB:{
 "^":"TpZ:76;a",
 $0:[function(){this.a.a=!1
-O.X0()},"$0",null,0,0,null,"call"],
+O.N0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
 "^":"TpZ:29;b",
@@ -14740,18 +14825,18 @@
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-hw:{
+bF:{
 "^":"TpZ:179;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
+return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
-iu:{
+f6:{
 "^":"TpZ:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
 return this.w3.$1(a)},"$1",null,2,0,null,180,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
-B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+LR:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
 y=J.WB(J.bI(c,b),1)
 x=Array(z)
@@ -14787,7 +14872,7 @@
 m=P.J(p+1,m+1)
 if(t>=o)return H.e(n,t)
 n[t]=m}}return x},
-kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
@@ -14821,8 +14906,8 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.wb(),[H.u3(u,0)]),0)]).br(0)},
-rN:function(a,b,c){var z,y,x
+x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.TNQ(),[H.u3(u,0)]),0)]).br(0)},
+uf:function(a,b,c){var z,y,x
 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},
@@ -14840,7 +14925,7 @@
 z=J.Wx(c)
 y=P.J(z.W(c,b),f-e)
 x=J.x(b)
-w=x.n(b,0)&&e===0?G.rN(a,d,y):0
+w=x.n(b,0)&&e===0?G.uf(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
@@ -14849,53 +14934,52 @@
 z=J.Wx(c)
 if(J.xC(z.W(c,b),0)&&f-e===0)return C.xD
 if(J.xC(b,c)){u=[]
-z=new P.Yp(u)
+z=new P.Ui(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,b,0)
 for(;e<f;e=s){z=t.kJ
 s=e+1
 if(e>>>0!==e||e>=d.length)return H.e(d,e)
-J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
+C.Nm.h(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
 u=[]
-x=new P.Yp(u)
+x=new P.Ui(u)
 x.$builtinTypeInfo=[null]
-return[new G.Zq(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
+return[new G.Zq(a,x,u,b,z)]}r=G.Mw(G.LR(a,b,c,d,e,f))
 q=[]
 q.$builtinTypeInfo=[G.Zq]
 for(p=e,o=b,t=null,n=0;n<r.length;++n)switch(r[n]){case 0:if(t!=null){q.push(t)
 t=null}o=J.WB(o,1);++p
 break
 case 1:if(t==null){u=[]
-z=new P.Yp(u)
+z=new P.Ui(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
 o=J.WB(o,1)
 z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
+C.Nm.h(z,d[p]);++p
 break
 case 2:if(t==null){u=[]
-z=new P.Yp(u)
+z=new P.Ui(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
 o=J.WB(o,1)
 break
 case 3:if(t==null){u=[]
-z=new P.Yp(u)
+z=new P.Ui(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,o,0)}z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
+C.Nm.h(z,d[p]);++p
 break}if(t!=null)q.push(t)
 return q},
 m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=J.Nd(b.gkJ())
+x=C.Nm.br(b.gkJ())
 w=b.gNg()
-if(w==null)w=0
-v=new P.Yp(x)
+v=new P.Ui(x)
 v.$builtinTypeInfo=[null]
 u=new G.Zq(y,v,x,z,w)
 for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
@@ -14918,26 +15002,25 @@
 else{o=q.kJ
 if(J.u6(u.Ft,q.Ft)){z=u.HD
 z=z.Yc(z,0,J.bI(q.Ft,u.Ft))
-o.toString
-if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
+if(!!o.fixed$length)H.vh(P.f("insertAll"))
 H.IC(o,0,z)}if(J.xZ(J.WB(u.Ft,u.HD.G4.length),J.WB(q.Ft,q.wF))){z=u.HD
-J.bj(o,z.Yc(z,J.bI(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
+C.Nm.FV(o,z.Yc(z,J.bI(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
 u.HD=q.HD
 if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
-t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
+t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.aP(a,r,u);++r
 n=J.bI(u.wF,u.HD.G4.length)
 q.Ft=J.WB(q.Ft,n)
 if(typeof n!=="number")return H.s(n)
 s+=n
 t=!0}else t=!1}if(!t)a.push(u)},
-hs:function(a,b){var z,y
+VT:function(a,b){var z,y
 z=H.VM([],[G.Zq])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.Ff)
+for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(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.u3(y,0)]),x=a.XG;y.G();){w=y.Ff
+for(y=G.VT(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.xN;y.G();){w=y.lo
 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]
@@ -14958,15 +15041,12 @@
 if(z)return!1
 if(!J.xC(this.wF,this.HD.G4.length))return!0
 return J.u6(a,J.WB(this.Ft,this.wF))},
-bu:[function(a){var z,y
-z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
-y=this.HD
-return z+y.bu(y)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
+bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "+H.d(this.HD)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
 $isZq: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=new P.Ui(d)
 z.$builtinTypeInfo=[null]
 return new G.Zq(a,z,d,b,c)}}}}],["","",,K,{
 "^":"",
@@ -14975,17 +15055,17 @@
 vly:{
 "^":"a;"}}],["","",,F,{
 "^":"",
-kM:[function(){return O.X0()},"$0","Jy",0,0,17],
+kM:[function(){return O.N0()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,rJ:XY%,xt:cU%",
+"^":"a;R9:ro%,rJ:XY%,me:iS%",
 gqh:function(a){var z
 if(this.gR9(a)==null){z=this.gFW(a)
 this.sR9(a,P.bK(this.gEp(a),z,!0,null))}z=this.gR9(a)
 z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])},
+return H.VM(new P.rk(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
 if(this.gR9(a)!=null){z=this.gR9(a)
 y=z.iE
@@ -14995,35 +15075,35 @@
 z=$.Oo
 if(z==null){z=H.VM([],[F.d3])
 $.Oo=z}z.push(a)
-$.Nc=$.Nc+1
+$.dL=$.dL+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.bfK,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.Ff)
-w=$.cp().xV.II.t(0,x)
-if(w==null)H.vh(O.Fm("getter \""+H.d(x)+"\" in "+this.bu(a)))
+for(z=this.gbx(a),z=$.II().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.fo,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.lo)
+w=$.cp().JE.E4.t(0,x)
+if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+H.d(a)))
 y.u(0,x,w.$1(a))}this.srJ(a,y)},"$0","gFW",0,0,17],
-dJ:[function(a){if(this.grJ(a)!=null)this.srJ(a,null)},"$0","gEp",0,0,17],
+dJx:[function(a){if(this.grJ(a)!=null)this.srJ(a,null)},"$0","gEp",0,0,17],
 HC:function(a){var z,y
 z={}
 if(this.grJ(a)==null||!this.gnz(a))return!1
-z.a=this.gxt(a)
-this.sxt(a,null)
-this.grJ(a).aN(0,new F.D9(z,a))
+z.a=this.gme(a)
+this.sme(a,null)
+this.grJ(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])
+z=H.VM(new P.Ui(z.a),[T.yj])
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(z)
 return!0},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(this.gxt(a)==null)this.sxt(a,[])
-this.gxt(a).push(b)},
+if(this.gme(a)==null)this.sme(a,[])
+this.gme(a).push(b)},
 $isd3:true},
-D9:{
+X6:{
 "^":"TpZ:81;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
-y=$.cp().Gp(z,a)
+y=$.cp().jD(z,a)
 if(!J.xC(b,y)){x=this.a
 w=x.a
 if(w==null){v=[]
@@ -15040,14 +15120,14 @@
 bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Xq)+">"},"$0","gCR",0,0,73]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"uFU;lr@,Mu,XG,Vg,fn",
-gXF:function(){var z=this.Mu
-if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
-this.Mu=z}z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])},
-gB:function(a){return this.XG.length},
+"^":"uFU;lr@,fN,xN,Vg,ij",
+gXF:function(){var z=this.fN
+if(z==null){z=P.bK(new Q.BjH(this),null,!0,null)
+this.fN=z}z.toString
+return H.VM(new P.rk(z),[H.u3(z,0)])},
+gB:function(a){return this.xN.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.XG
+z=this.xN
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -15055,10 +15135,10 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.Mu
+x=this.fN
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){x=new H.wb()
+if(x)if(b<y){x=new H.TNQ()
 x.$builtinTypeInfo=[H.u3(z,0)]
 if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
 if(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
@@ -15068,24 +15148,24 @@
 if(y<0)H.vh(P.N(y))
 if(b>y)H.vh(P.TE(b,0,y))
 x=w.br(0)
-w=new P.Yp(x)
+w=new P.Ui(x)
 w.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,w,x,b,0))}else{v=[]
-x=new P.Yp(v)
+x=new P.Ui(v)
 x.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.XG
+t:function(a,b){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.XG
+z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.Mu
+x=this.fN
 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=new P.Ui(x)
 w.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
@@ -15095,42 +15175,42 @@
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.Mu
+z=this.fN
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.XG
-x=H.VM(new H.wb(),[H.u3(z,0)])
-H.xF(z,b,y)
-this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.XG,b,c)},
+if(z&&y>0){z=this.xN
+x=H.VM(new H.TNQ(),[H.u3(z,0)])
+H.K0(z,b,y)
+this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.xN,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.XG
+z=this.xN
 y=z.length
 this.Xy(y,y+1)
-x=this.Mu
+x=this.fN
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.E2(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.XG
+z=this.xN
 y=z.length
 C.Nm.FV(z,b)
 this.Xy(y,z.length)
 x=z.length-y
-z=this.Mu
+z=this.fN
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&x>0)this.E2(G.K6(this,y,x,null))},
 Rz:function(a,b){var z,y
-for(z=this.XG,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
+for(z=this.xN,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
 return!0}return!1},
 oq:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.XG.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.xN.length)H.vh(P.TE(b,0,this.gB(this)))
 y=!(c<b)
-if(!y||c>this.XG.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.xN.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.XG
+w=this.xN
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -15138,10 +15218,10 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.Mu
+u=this.fN
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
-if(u&&x>0){u=new H.wb()
+if(u&&x>0){u=new H.TNQ()
 u.$builtinTypeInfo=[H.u3(w,0)]
 if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
 if(!y||c>w.length)H.vh(P.TE(c,b,w.length))
@@ -15151,28 +15231,28 @@
 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=new P.Ui(z)
 y.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,y,z,b,0))}C.Nm.oq(w,b,c)},
 UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
+if(b<0||b>this.xN.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.XG
+z=this.xN
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
 H.h8(z,b,c)
 this.Xy(x,z.length)
-z=this.Mu
+z=this.fN
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&y>0)this.E2(G.K6(this,b,y,null))},
-xe:function(a,b,c){var z,y,x
-if(b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.XG
+aP:function(a,b,c){var z,y,x
+if(b>this.xN.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.xN
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
@@ -15180,14 +15260,14 @@
 H.qG(z,b+1,y,this,b)
 y=z.length
 this.Xy(y-1,y)
-y=this.Mu
+y=this.fN
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.E2(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
 E2:function(a){var z,y
-z=this.Mu
+z=this.fN
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
@@ -15204,16 +15284,16 @@
 if(z==null)return!1
 y=G.Qi(this,z)
 this.lr=null
-z=this.Mu
+z=this.fN
 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.Zq])
+if(x&&y.length!==0){x=H.VM(new P.Ui(y),[G.Zq])
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(x)
 return!0}return!1},"$0","gL6",0,0,131],
 $iswn:true,
 static:{pT:function(a,b){var z=H.VM([],[b])
-return H.VM(new Q.wn(null,null,z,null,null),[b])},Oi:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5p:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 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)
@@ -15246,38 +15326,38 @@
 uFU:{
 "^":"ark+Pi;",
 $isd3:true},
-xb:{
+BjH:{
 "^":"TpZ:76;a",
-$0:function(){this.a.Mu=null},
+$0:function(){this.a.fN=null},
 $isEH:true}}],["","",,V,{
 "^":"",
 ya:{
-"^":"yj;nl>,jL,zZ,aC,w5",
+"^":"yj;nl>,jL,zZ,Lv,w5",
 bu:[function(a){var z
-if(this.aC)z="insert"
+if(this.Lv)z="insert"
 else z=this.w5?"remove":"set"
 return"#<MapChangeRecord "+z+" "+H.d(this.nl)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isya:true},
 qC:{
-"^":"Pi;LL,Vg,fn",
-gvc:function(a){var z=this.LL
+"^":"Pi;tf,Vg,ij",
+gvc:function(a){var z=this.tf
 return z.gvc(z)},
-gUQ:function(a){var z=this.LL
+gUQ:function(a){var z=this.tf
 return z.gUQ(z)},
-gB:function(a){var z=this.LL
+gB:function(a){var z=this.tf
 return z.gB(z)},
-gl0:function(a){var z=this.LL
+gl0:function(a){var z=this.tf
 return z.gB(z)===0},
-gor:function(a){var z=this.LL
+gor:function(a){var z=this.tf
 return z.gB(z)!==0},
-NZ:function(a,b){return this.LL.NZ(0,b)},
-t:function(a,b){return this.LL.t(0,b)},
+NZ:function(a,b){return this.tf.NZ(0,b)},
+t:function(a,b){return this.tf.t(0,b)},
 u:function(a,b,c){var z,y,x,w
 z=this.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.LL.u(0,b,c)
-return}z=this.LL
+if(!z){this.tf.u(0,b,c)
+return}z=this.tf
 x=z.gB(z)
 w=z.t(0,b)
 z.u(0,b,c)
@@ -15287,7 +15367,7 @@
 this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))}},
 FV:function(a,b){J.Me(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
-z=this.LL
+z=this.tf
 y=z.gB(z)
 x=z.Rz(0,b)
 w=this.Vg
@@ -15297,7 +15377,7 @@
 F.Wi(this,C.Wn,y,z.gB(z))
 this.ld()}return x},
 V1:function(a){var z,y,x,w
-z=this.LL
+z=this.tf
 y=z.gB(z)
 x=this.Vg
 if(x!=null){w=x.iE
@@ -15305,7 +15385,7 @@
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)
 this.ld()}z.V1(0)},
-aN:function(a,b){return this.LL.aN(0,b)},
+aN:function(a,b){return this.tf.aN(0,b)},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 ld:function(){this.nq(this,H.VM(new T.qI(this,C.SY,null,null),[null]))
 this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))},
@@ -15329,30 +15409,30 @@
 $isEH:true}}],["","",,Y,{
 "^":"",
 cU:{
-"^":"Ap;Os,he,mD,Wv,XS",
+"^":"Ap;nA,he,mD,TW,cl",
 bl:function(a){return this.he.$1(a)},
-xq:function(a){return this.Wv.$1(a)},
+kk:function(a){return this.TW.$1(a)},
 TR:function(a,b){var z
-this.Wv=b
-z=this.bl(J.mu(this.Os,this.gYZ()))
-this.XS=z
+this.TW=b
+z=this.bl(J.mu(this.nA,this.giv()))
+this.cl=z
 return z},
-pN:[function(a){var z=this.bl(a)
-if(J.xC(z,this.XS))return
-this.XS=z
-return this.xq(z)},"$1","gYZ",2,0,12,60],
-xO:function(a){var z=this.Os
+ab:[function(a){var z=this.bl(a)
+if(J.xC(z,this.cl))return
+this.cl=z
+return this.kk(z)},"$1","giv",2,0,12,60],
+xO:function(a){var z=this.nA
 if(z!=null)J.yd(z)
-this.Os=null
+this.nA=null
 this.he=null
 this.mD=null
-this.Wv=null
-this.XS=null},
-gP:function(a){var z=this.bl(J.Vm(this.Os))
-this.XS=z
+this.TW=null
+this.cl=null},
+gP:function(a){var z=this.bl(J.Vm(this.nA))
+this.cl=z
 return z},
-sP:function(a,b){J.Fc(this.Os,b)},
-fR:function(){return this.Os.fR()}}}],["","",,L,{
+sP:function(a,b){J.Fc(this.nA,b)},
+fR:function(){return this.nA.fR()}}}],["","",,L,{
 "^":"",
 yfW:function(a,b){var z,y,x,w,v
 if(a==null)return
@@ -15360,59 +15440,59 @@
 if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{z=b
 if(typeof z==="string")return J.UQ(a,b)
 else if(!!J.x(b).$isIN){z=a
-y=H.RB(z,"$isHX",[P.qU,null],"$asHX")
+y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z)return J.UQ(a,$.vu().xV.af.t(0,b))
+if(z)return J.UQ(a,$.vu().JE.fJ.t(0,b))
 try{z=a
 y=b
-x=$.cp().xV.II.t(0,y)
-if(x==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+H.d(z)))
+x=$.cp().JE.E4.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.bB(a)
-v=$.mX().NW(z,C.OV)
-if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.YLt()
+v=$.II().NW(z,C.OV)
+if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.Nd()
 if(z.mL(C.EkO))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
-EX:function(a,b,c){var z,y,x
+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)
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.qQ(a,b,c)
 return!0}}else if(!!J.x(b).$isIN){z=a
-y=H.RB(z,"$isHX",[P.qU,null],"$asHX")
+y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z){J.kW(a,$.vu().xV.af.t(0,b),c)
-return!0}try{$.cp().Cq(a,b,c)
+if(z){J.qQ(a,$.vu().JE.fJ.t(0,b),c)
+return!0}try{$.cp().Q1(a,b,c)
 return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.bB(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YLt()
+if(!$.II().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
 if(z.mL(C.EkO))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 WR:{
-"^":"ARh;HS,Lq,IE,zo,dR,vS,KZ",
+"^":"ARh;HS,Lq,IE,wN,dR,z7,KZ",
 gIi:function(a){return this.HS},
 sP:function(a,b){var z=this.HS
 if(z!=null)z.rL(this.Lq,b)},
 gDJ:function(){return 2},
 TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
-Ej:function(a){this.IE=L.KJ(this,this.Lq)
+Ej:function(a){this.IE=L.SE(this,this.Lq)
 this.CG(!0)},
-U9:function(){this.vS=null
+U9:function(){this.z7=null
 this.HS=null
 this.Lq=null},
 VC:function(a){this.HS.I5(this.Lq,a)},
 CG:function(a){var z,y
-z=this.vS
+z=this.z7
 y=this.HS.WK(this.Lq)
-this.vS=y
+this.z7=y
 if(a||J.xC(y,z))return!1
-this.dC(this.vS,z,this)
+this.dC(this.z7,z,this)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Zl:{
+Tv:{
 "^":"a;T7",
 gB:function(a){return this.T7.length},
 gl0:function(a){return this.T7.length===0},
@@ -15420,17 +15500,18 @@
 bu:[function(a){var z,y,x,w,v,u
 if(!this.gPu())return"<invalid path>"
 z=P.p9("")
-for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.Ff
+for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.lo
 v=J.x(w)
 if(!!v.$isIN){if(!x)z.IN+="."
-u=$.vu().xV.af.t(0,w)
+u=$.vu().JE.fJ.t(0,w)
 z.IN+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
-z.IN+=v}else{v="[\""+J.JA(v.bu(w),"\"","\\\"")+"\"]"
-z.IN+=v}}return z.IN},"$0","gCR",0,0,73],
+z.IN+=v}else{v="[\""+H.d(J.JA(v.bu(w),"\"","\\\""))+"\"]"
+z.IN+=v}}y=z.IN
+return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isZl)return!1
+if(!J.x(b).$isTv)return!1
 if(this.gPu()!==b.gPu())return!1
 z=this.T7
 y=z.length
@@ -15451,7 +15532,7 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 WK:function(a){var z,y
 if(!this.gPu())return
-for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(a==null)return
 a=L.yfW(a,y)}return a},
 rL:function(a,b){var z,y,x
@@ -15461,7 +15542,7 @@
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
 a=L.yfW(a,z[x])}if(y>=z.length)return H.e(z,y)
-return L.EX(a,z[y],b)},
+return L.iu(a,z[y],b)},
 I5:function(a,b){var z,y,x,w
 if(!this.gPu()||this.T7.length===0)return
 z=this.T7
@@ -15472,42 +15553,42 @@
 w=x+1
 if(x>=z.length)return H.e(z,x)
 a=L.yfW(a,z[x])}},
-$isZl:true,
+$isTv:true,
 static:{hk:function(a){var z,y,x,w,v,u,t
 z=J.x(a)
-if(!!z.$isZl)return a
+if(!!z.$isTv)return a
 if(a!=null)z=!!z.$isWO&&z.gl0(a)
 else z=!0
 if(z)a=""
 if(!!J.x(a).$isWO){y=P.F(a,!1,null)
 z=new H.a7(y,y.length,0,null)
 z.$builtinTypeInfo=[H.u3(y,0)]
-for(;z.G();){x=z.Ff
-if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Zl(y)}z=$.fX()
+for(;z.G();){x=z.lo
+if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Tv(y)}z=$.aB()
 w=z.t(0,a)
 if(w!=null)return w
-v=new L.iF([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
-if(v==null)return $.ptP()
-w=new L.Zl(C.Nm.tt(v,!1))
+v=new L.Pw([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
+if(v==null)return $.O3()
+w=new L.Tv(C.Nm.tt(v,!1))
 if(z.X5>=100){u=new P.i5(z)
 u.$builtinTypeInfo=[H.u3(z,0)]
 t=u.gA(u)
-if(!t.G())H.vh(H.DU())
+if(!t.G())H.vh(H.Wp())
 z.Rz(0,t.gl())}z.u(0,a,w)
 return w}}},
 vH:{
-"^":"Zl;T7",
+"^":"Tv;T7",
 gPu:function(){return!1},
-static:{"^":"HS"}},
-lPa:{
+static:{"^":"l7"}},
+MdQ:{
 "^":"TpZ:76;",
-$0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.v4("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
+$0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.Vq("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
 $isEH:true},
-iF:{
-"^":"a;vc>,vH>,nl*,ep",
+Pw:{
+"^":"a;vc>,vH>,nl*,n5",
 Xn:function(a){var z
 if(a==null)return"eof"
-switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.eT([a])
+switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.LY([a])
 case 95:case 36:return"ident"
 case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}if(typeof a!=="number")return H.s(a)
 if(!(97<=a&&a<=122))z=65<=a&&a<=90
@@ -15515,13 +15596,13 @@
 if(z)return"ident"
 if(49<=a&&a<=57)return"number"
 return"else"},
-rXF:function(){var z,y,x,w
+rX:function(){var z,y,x,w
 z=this.nl
 if(z==null)return
-z=$.cx().B0(z)
+z=$.cD().B0(z)
 y=this.vc
 x=this.nl
-if(z)y.push($.vu().xV.T4.t(0,x))
+if(z)y.push($.vu().JE.T4.t(0,x))
 else{w=H.BU(x,10,new L.PD())
 y.push(w!=null?w:this.nl)}this.nl=null},
 mx:function(a,b){var z=this.nl
@@ -15532,142 +15613,142 @@
 if(z>=y)return!1;++z
 if(z<0||z>=y)return H.e(b,z)
 z=b[z]
-x=H.eT([z])
+x=H.LY([z])
 if(!(a==="inSingleQuote"&&x==="'"))z=a==="inDoubleQuote"&&x==="\""
 else z=!0
 if(z){++this.vH
 z=this.nl
 this.nl=z==null?x:H.d(z)+x
 return!0}return!1},
-pI:function(a){var z,y,x,w,v,u,t,s,r,q,p
-z=U.LQ(J.GG(a),0,null,65533)
-for(y=z.length,x="beforePath";x!=null;){w=++this.vH
-if(w>=y)v=null
-else{if(w<0)return H.e(z,w)
-v=z[w]}if(v!=null)w=H.eT([v])==="\\"&&this.jN(x,z)
-else w=!1
-if(w)continue
-u=this.Xn(v)
-if(J.xC(x,"error"))return
-t=this.ep.t(0,x)
-s=t.t(0,u)
-if(s==null)s=t.t(0,"else")
-if(s==null)return
-w=J.U6(s)
-x=w.t(s,0)
-r=w.gB(s)>1?w.t(s,1):null
-q=J.x(r)
-if(q.n(r,"push")&&this.nl!=null)this.rXF()
-if(q.n(r,"append")){if(w.gB(s)>2){w.t(s,2)
-q=!0}else q=!1
-if(q)p=w.t(s,2)
-else p=H.eT([v])
-w=this.nl
-this.nl=w==null?p:H.d(w)+H.d(p)}if(x==="afterPath")return this.vc}return}},
+pI:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+z=U.LQ(J.OX(a),0,null,65533)
+for(y=this.n5,x=z.length,w="beforePath";w!=null;){v=++this.vH
+if(v>=x)u=null
+else{if(v<0)return H.e(z,v)
+u=z[v]}if(u!=null)v=H.LY([u])==="\\"&&this.jN(w,z)
+else v=!1
+if(v)continue
+t=this.Xn(u)
+if(J.xC(w,"error"))return
+s=y.t(0,w)
+r=s.t(0,t)
+if(r==null)r=s.t(0,"else")
+if(r==null)return
+v=J.U6(r)
+w=v.t(r,0)
+q=v.gB(r)>1?v.t(r,1):null
+p=J.x(q)
+if(p.n(q,"push")&&this.nl!=null)this.rX()
+if(p.n(q,"append")){if(v.gB(r)>2){v.t(r,2)
+p=!0}else p=!1
+if(p)o=v.t(r,2)
+else o=H.LY([u])
+v=this.nl
+this.nl=v==null?o:H.d(v)+H.d(o)}if(w==="afterPath")return this.vc}return}},
 PD:{
 "^":"TpZ:12;",
 $1:function(a){return},
 $isEH:true},
 nQ:{
-"^":"ARh;IE,pu,vl,zo,dR,vS,KZ",
+"^":"ARh;IE,ds,vl,wN,dR,z7,KZ",
 gDJ:function(){return 3},
 TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
 Ej:function(a){var z,y,x,w
 for(z=this.vl,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.zr){z=$.rf
+if(w!==C.aZ){z=$.rf
 if(z!=null){y=z.Ou
 y=y==null?w!=null:y!==w}else y=!0
-if(y){z=w==null?null:P.Ls(null,null,null,null)
+if(y){z=w==null?null:P.fM(null,null,null,null)
 z=new L.Og(w,z,[],null)
 $.rf=z}if(z.Ou==null){z.Ou=w
-z.cE=P.Ls(null,null,null,null)}z.JD.push(this)
+z.cE=P.fM(null,null,null,null)}z.JD.push(this)
 this.VC(z.gUu(z))
 this.IE=null
-break}}this.CG(!this.pu)},
+break}}this.CG(!this.ds)},
 U9:function(){var z,y,x,w
-for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.zr){w=z+1
+for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
 if(w>=x)return H.e(y,w)
 J.yd(y[w])}this.vl=null
-this.vS=null},
+this.z7=null},
 WX:function(a,b){var z=this.KZ
-if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add paths once started."))
+if(z===$.ng||z===$.H2)throw H.b(P.w("Cannot add paths once started."))
 b=L.hk(b)
 z=this.vl
 z.push(a)
 z.push(b)
-if(!this.pu)return
-J.bi(this.vS,b.WK(a))},
+if(!this.ds)return
+J.dH(this.z7,b.WK(a))},
 ti:function(a){return this.WX(a,null)},
 YU:function(a){var z=this.KZ
-if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add observers once started."))
+if(z===$.ng||z===$.H2)throw H.b(P.w("Cannot add observers once started."))
 z=this.vl
-z.push(C.zr)
+z.push(C.aZ)
 z.push(a)
-if(!this.pu)return
-J.bi(this.vS,J.mu(a,new L.Zu(this)))},
+if(!this.ds)return
+J.dH(this.z7,J.mu(a,new L.bjd(this)))},
 VC:function(a){var z,y,x,w,v
 for(z=0;y=this.vl,x=y.length,z<x;z+=2){w=y[z]
-if(w!==C.zr){v=z+1
+if(w!==C.aZ){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isZl").I5(w,a)}}},
+H.Go(y[v],"$isTv").I5(w,a)}}},
 CG:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.vS,C.jn.BU(this.vl.length,2))
+J.Vw(this.z7,C.jn.BU(this.vl.length,2))
 for(z=!1,y=null,x=0;w=this.vl,v=w.length,x<v;x+=2){u=w[x]
 t=x+1
 if(t>=v)return H.e(w,t)
 s=w[t]
-if(u===C.zr){H.Go(s,"$isAp")
-r=this.KZ===$.jq1?s.TR(0,new L.vI(this)):s.gP(s)}else r=H.Go(s,"$isZl").WK(u)
-if(a){J.kW(this.vS,C.jn.BU(x,2),r)
-continue}w=this.vS
+if(u===C.aZ){H.Go(s,"$isAp")
+r=this.KZ===$.jq1?s.TR(0,new L.cmp(this)):s.gP(s)}else r=H.Go(s,"$isTv").WK(u)
+if(a){J.qQ(this.z7,C.jn.BU(x,2),r)
+continue}w=this.z7
 v=C.jn.BU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
 w=this.dR
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.vS,v))}J.kW(this.vS,v,r)
+y.u(0,v,J.UQ(this.z7,v))}J.qQ(this.z7,v,r)
 z=!0}if(!z)return!1
-this.dC(this.vS,y,w)
+this.dC(this.z7,y,w)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Zu:{
+bjd:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.fl()
+if(z.KZ===$.ng)z.fl()
 return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-vI:{
+cmp:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.fl()
+if(z.KZ===$.ng)z.fl()
 return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 iNc:{
 "^":"a;"},
 ARh:{
 "^":"Ap;",
-Yd:function(){return this.zo.$0()},
-d1:function(a){return this.zo.$1(a)},
-qk:function(a,b){return this.zo.$2(a,b)},
-Tu:function(a,b,c){return this.zo.$3(a,b,c)},
-gB9:function(){return this.KZ===$.ljh},
+Yd:function(){return this.wN.$0()},
+d1:function(a){return this.wN.$1(a)},
+qk:function(a,b){return this.wN.$2(a,b)},
+p0:function(a,b,c){return this.wN.$3(a,b,c)},
+gB9:function(){return this.KZ===$.ng},
 TR:function(a,b){var z=this.KZ
-if(z===$.ljh||z===$.ls)throw H.b(P.w("Observer has already been opened."))
-if(X.na(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
-this.zo=b
-this.dR=P.J(this.gDJ(),X.Zpg(b))
+if(z===$.ng||z===$.H2)throw H.b(P.w("Observer has already been opened."))
+if(X.OS(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
+this.wN=b
+this.dR=P.J(this.gDJ(),X.RI(b))
 this.Ej(0)
-this.KZ=$.ljh
-return this.vS},
+this.KZ=$.ng
+return this.z7},
 gP:function(a){this.CG(!0)
-return this.vS},
-xO:function(a){if(this.KZ!==$.ljh)return
+return this.z7},
+xO:function(a){if(this.KZ!==$.ng)return
 this.U9()
-this.vS=null
-this.zo=null
-this.KZ=$.ls},
-fR:function(){if(this.KZ===$.ljh)this.fl()},
+this.z7=null
+this.wN=null
+this.KZ=$.H2},
+fR:function(){if(this.KZ===$.ng)this.fl()},
 fl:function(){var z=0
 while(!0){if(!(z<1000&&this.mX()))break;++z}return z>0},
 dC:function(a,b,c){var z,y,x,w
@@ -15677,7 +15758,7 @@
 break
 case 2:this.qk(a,b)
 break
-case 3:this.Tu(a,b,c)
+case 3:this.p0(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
@@ -15700,17 +15781,17 @@
 if((x==null?w!=null:x!==w)||this.cE.tg(0,y.Ft))return!1}else return!1}return!0},
 F5:[function(a){var z,y,x
 if(this.b2(a))return
-for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
-if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.Ff
+for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
+if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.lo
 if(x.gB9())x.mX()}},"$1","gCP",2,0,19,183],
-static:{"^":"rf",KJ:function(a,b){var z,y
+static:{"^":"rf",SE:function(a,b){var z,y
 z=$.rf
 if(z!=null){y=z.Ou
 y=y==null?b!=null:y!==b}else y=!0
-if(y){z=b==null?null:P.Ls(null,null,null,null)
+if(y){z=b==null?null:P.fM(null,null,null,null)
 z=new L.Og(b,z,[],null)
 $.rf=z}if(z.Ou==null){z.Ou=b
-z.cE=P.Ls(null,null,null,null)}z.JD.push(a)
+z.cE=P.fM(null,null,null,null)}z.JD.push(a)
 a.VC(z.gUu(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
@@ -15727,89 +15808,90 @@
 $2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,141,66,"call"],
 $isEH:true}}],["","",,A,{
 "^":"",
-ec:function(a,b,c){var z=$.lx()
-if(z==null||$.Ep()!==!0)return
+YG:function(a,b,c){var z=$.lx()
+if(z==null||$.oo()!==!0)return
 z.V7("shimStyling",[a,b,c])},
-q3:function(a){var z,y,x,w,v
+Hl:function(a){var z,y,x,w,v
 if(a==null)return""
 if($.UG)return""
 w=J.RE(a)
-z=w.gmH(a)
+z=w.gLU(a)
 if(J.xC(z,""))z=w.gQg(a).dA.getAttribute("href")
 try{w=new XMLHttpRequest()
 C.W3.i3(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
-if(!!J.x(w).$isBK){y=w
+if(!!J.x(w).$isNh){y=w
 x=new H.oP(v,null)
-$.Is().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+$.eU().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 M8:[function(a){var z,y
-z=$.vu().xV.af.t(0,a)
+z=$.vu().JE.fJ.t(0,a)
 if(z==null)return!1
 y=J.Qe(z)
-return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","hU",2,0,64,65],
+return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,64,65],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.Xw(),"Polymer"),"$isr7").PO([a])},
 ZI:function(a,b){var z,y,x,w
 if(a==null)return
 document
-if($.Ep()===!0)b=document.head
+if($.oo()===!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.rk(C.t5.grZ(w.jt))}b.insertBefore(z,x)},
-YK:function(){A.c4()
+if(w.gor(w))x=J.cC(C.z0.grZ(w.mk))}b.insertBefore(z,x)},
+Ok:function(){A.c4()
 if($.UG){A.X1($.M6,!0)
 return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
-if($.HE)throw H.b("Initialization was already done.")
-$.HE=!0
+if($.DG)throw H.b("Initialization was already done.")
+$.DG=!0
 A.JP()
 $.ok=b
 if(a==null)throw H.b("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.")
-A.Ad("auto-binding-dart",C.nj)
+A.Ad("auto-binding-dart",C.kA)
 z=document.createElement("polymer-element",null)
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
-J.UQ($.Dw(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,91,0,null),[H.u3(a,0)]);y.G();)y.Ff.$0()},
-JP:function(){var z,y,x,w
-z=$.Xw()
-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.XR())])
-w=J.UQ($.Dw(),"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($.Dw(),"register",P.mt(new A.k2(x,w)))},
-c4:function(){var z,y,x
+J.UQ($.XX(),"init").qP([],z)
+for(y=H.VM(new H.a7(a,93,0,null),[H.u3(a,0)]);y.G();)y.lo.$0()},
+JP:function(){var z,y,x
+z=J.UQ($.Xw(),"Polymer")
+if(z==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org."))
+y=$.X3
+z.V7("whenPolymerReady",[y.ce(new A.XR())])
+x=J.UQ($.XX(),"register")
+if(x==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
+J.qQ($.XX(),"register",P.mt(new A.k2(y,x)))},
+c4:function(){var z,y,x,w
+z={}
 $.RL=!0
-z=J.UQ($.Xw(),"logFlags")
-y=[$.dn(),$.vo(),$.iX(),$.Lu(),$.REM(),$.lg()]
-x=N.QM("polymer")
-if(!H.Ck(y,new A.j0(z))){x.sOR(C.oOA)
-return}H.VM(new H.U5(y,new A.j0N(z)),[H.u3(H.VM(new H.wb(),[H.u3(y,0)]),0)]).aN(0,new A.MZ6())
-x.gSZ().yI(new A.mqr())},
-So:{
-"^":"a;FL>,t5>,Jh<,oc>,Q7<,Md<,eJ>,Gl<,PH<,ix<,y0,G9,wX>,mR<,WV,vT",
+y=J.UQ($.Xw(),"logFlags")
+z.a=y
+if(y==null)z.a=P.Fl(null,null)
+x=[$.a3(),$.xW(),$.UW(),$.aQ(),$.Is(),$.Fs()]
+w=N.QM("polymer")
+if(!H.Ck(x,new A.j0(z))){w.sOR(C.oO)
+return}H.VM(new H.U5(x,new A.j0N(z)),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]).aN(0,new A.MZ6())
+w.gSZ().yI(new A.mqr())},
+XP:{
+"^":"a;FL>,t5>,P1<,oc>,Q7<,DB<,eJ>,Gl<,CY<,ix<,y0,G9,wX>,mR<,yz,aU",
 gZf:function(){var z,y
-z=J.yR(this.FL,"template")
-if(z!=null)y=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
+z=J.Eh(this.FL,"template")
+if(z!=null)y=J.ti(!!J.x(z).$ishs?z:M.uH(z))
 else y=null
 return y},
 Ba:function(a){var z,y,x
 for(z=null,y=this;y!=null;){z=J.Vs(J.y3(y)).dA.getAttribute("extends")
-y=y.gJh()}x=document
-W.Ct(window,x,a,this.t5,z)},
-Cw:function(a){var z=$.Kc()
+y=y.gP1()}x=document
+W.wi(window,x,a,this.t5,z)},
+RH:function(a){var z=$.uj()
 if(z==null)return
 J.UQ(z,"urlResolver").V7("resolveDom",[a])},
 Zw:function(a){var z,y,x,w,v,u,t,s,r,q
@@ -15817,118 +15899,125 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 this.Q7=y}if(a.gix()!=null){z=a.gix()
-y=P.Ls(null,null,null,null)
+y=P.fM(null,null,null,null)
 y.FV(0,z)
 this.ix=y}}z=this.t5
 this.en(z)
 x=J.Vs(this.FL).dA.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.FF()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.Ff)
+if(x!=null)for(y=C.yo.Fr(x,$.FF()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.iY(y.lo)
 if(v==="")continue
-u=$.vu().xV.T4.t(0,v)
+u=$.vu().JE.T4.t(0,v)
 t=u!=null
 if(t){s=L.hk([u])
 r=this.Q7
 if(r!=null&&r.NZ(0,s))continue
-q=$.mX().CV(z,u)}else{q=null
-s=null}if(!t||q==null||q.gUA()||J.cL(q)===!0){window
+q=$.II().CV(z,u)}else{q=null
+s=null}if(!t||q==null||q.gUA()||J.Z6(q)===!0){window
 t="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
 if(typeof console!="undefined")console.warn(t)
 continue}t=this.Q7
 if(t==null){t=P.Fl(null,null)
 this.Q7=t}t.u(0,s,q)}},
 en:function(a){var z,y,x,w,v
-for(z=$.mX().Me(0,a,C.V4),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+for(z=$.II().Me(0,a,C.V4),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 w=this.Q7
 if(w==null){w=P.Fl(null,null)
 this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
 w=y.gDv()
-v=new H.wb()
+v=new H.TNQ()
 v.$builtinTypeInfo=[H.u3(w,0)]
 w=new H.U5(w,new A.Zd())
 w.$builtinTypeInfo=[H.u3(v,0)]
 if(w.Vr(0,new A.Da())){w=this.ix
-if(w==null){w=P.Ls(null,null,null,null)
+if(w==null){w=P.fM(null,null,null,null)
 this.ix=w}x=x.goc(y)
-w.h(0,$.vu().xV.af.t(0,x))}}},
+w.h(0,$.vu().JE.fJ.t(0,x))}}},
 Vk:function(){var z,y
 z=P.L5(null,null,null,P.qU,P.a)
-this.PH=z
-y=this.Jh
-if(y!=null)z.FV(0,y.gPH())
+this.CY=z
+y=this.P1
+if(y!=null)z.FV(0,y.gCY())
 J.Vs(this.FL).aN(0,new A.EB(this))},
-W3:function(a){J.Vs(this.FL).aN(0,new A.Y1(a))},
-ka:function(){var z=this.Bg("link[rel=stylesheet]")
+W3:function(a){J.Vs(this.FL).aN(0,new A.Pf(a))},
+fk:function(){var z=this.Bg("link[rel=stylesheet]")
 this.y0=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Rv(z.lo)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
 this.G9=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Rv(z.lo)},
 yq:function(){var z,y,x,w,v,u,t,s
 z=this.y0
 z.toString
-y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0)])
+y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.TNQ(),[H.u3(z,0)]),0)])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.q3(v.gl())
+for(z=H.VM(new H.Mo(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.Hl(v.gl())
 t=w.IN+=typeof u==="string"?u:H.d(u)
-w.IN=t+"\n"}if(w.IN.length>0){s=J.lu(this.FL).createElement("style",null)
+w.IN=t+"\n"}if(w.IN.length>0){s=J.Do(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.FO(x,s,z.gNL(x))}}},
+z.mK(x,s,z.gNL(x))}}},
 Wz:function(a,b){var z,y,x
-z=J.We(this.FL,a)
+z=J.Vj(this.FL,a)
 y=z.br(z)
 x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.We(x,a))
+if(x!=null)C.Nm.FV(y,J.Vj(x,a))
 return y},
 Bg:function(a){return this.Wz(a,null)},
-ds:function(a){var z,y,x,w,v,u
+l7:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.ui("[polymer-scope="+a+"]")
-for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.q3(w.gl())
+y=new A.Vi("[polymer-scope="+a+"]")
+for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]),x=H.VM(new H.Mo(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.Hl(w.gl())
 u=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
+z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]),x=H.VM(new H.Mo(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
 w=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=w+"\n\n"}return z.IN},
+z.IN=w+"\n\n"}y=z.IN
+return y.charCodeAt(0)==0?y:y},
 J3:function(a,b){var z
-if(a==="")return
+if(J.xC(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.u3(z,0)]);z.G();){y=z.Ff
+for(z=$.or(),z=$.II().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.vu().xV.af.t(0,w)
+v=$.vu().JE.fJ.t(0,w)
 w=J.U6(v)
 v=w.Nj(v,0,J.bI(w.gB(v),7))
 this.eJ.u(0,L.hk(v),[x.goc(y)])}},
-I7:function(){var z,y,x
-for(z=$.mX().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff.gDv()
-x=new H.a7(y,y.length,0,null)
-x.$builtinTypeInfo=[H.u3(y,0)]
-for(;x.G();)continue}},
+I7:function(){var z,y,x,w,v,u,t
+for(z=$.II().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+x=y.gDv()
+w=new H.a7(x,x.length,0,null)
+w.$builtinTypeInfo=[H.u3(x,0)]
+x=J.RE(y)
+for(;w.G();){v=w.lo
+if(!J.x(v).$iswA)continue
+if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
+for(u=v.gfJ(),u=u.gA(u);u.G(),!1;){t=u.gl()
+J.dH(this.eJ.to(0,L.hk(t),new A.XU()),x.goc(y))}}}},
 jq:function(a){var z=P.L5(null,null,null,P.qU,null)
-a.aN(0,new A.Tj(z))
+a.aN(0,new A.fh(z))
 return z},
-ut:function(){var z,y,x,w,v,u,t,s,r
+hW:function(){var z,y,x,w,v,u,t,s,r
 z=P.Fl(null,null)
-for(y=$.mX().Me(0,this.t5,C.m8),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.Ff
-v=H.FU(w.gDv(),new A.HH(),null)
+for(y=$.II().Me(0,this.t5,C.jJ),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.lo
+v=H.Sz(w.gDv(),new A.HH(),null)
 u=J.RE(w)
 t=u.goc(w)
 s=z.t(0,t)
 if(s!=null){u=u.gt5(w)
 r=J.zH(s)
-r=$.mX().xs(u,r)
+r=$.II().xs(u,r)
 u=r}else u=!0
-if(u){x.u(0,t,v.gXt())
+if(u){x.u(0,t,v.gEV())
 z.u(0,t,w)}}},
-$isSo:true,
+$isXP:true,
 static:{"^":"Kb"}},
 Zd:{
 "^":"TpZ:12;",
@@ -15940,52 +16029,52 @@
 $isEH:true},
 EB:{
 "^":"TpZ:81;a",
-$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.PH.u(0,a,b)},
+$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.CY.u(0,a,b)},
 $isEH:true},
-Y1:{
+Pf:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z,y,x
 z=J.Qe(a)
 if(z.nC(a,"on-")){y=J.U6(b).OY(b,"{{")
-x=C.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)))}},
+x=C.yo.cn(b,"}}")
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.yo.DY(C.yo.Nj(b,y+2,x)))}},
 $isEH:true},
 IJ:{
 "^":"TpZ:12;",
 $1:function(a){return J.Vs(a).dA.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-ui:{
+Vi:{
 "^":"TpZ:12;a",
-$1:function(a){return J.wK(a,this.a)},
+$1:function(a){return J.YN(a,this.a)},
 $isEH:true},
-eM:{
+XU:{
 "^":"TpZ:76;",
 $0:function(){return[]},
 $isEH:true},
-Tj:{
+fh:{
 "^":"TpZ:184;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 HH:{
 "^":"TpZ:12;",
-$1:function(a){return!1},
+$1:function(a){return!!J.x(a).$isYj},
 $isEH:true},
 Li:{
-"^":"BG9;Mn,oe",
-op:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
-return this.Mn.op(a,b,c)},
-static:{"^":"rd0,QPA"}},
+"^":"BG9;xI,oe",
+op:function(a,b,c){if(J.co(b,"on-"))return this.Io(a,b,c)
+return this.xI.op(a,b,c)},
+static:{"^":"rd0,Uv"}},
 BG9:{
-"^":"vE+d23;"},
+"^":"VE+d23;"},
 d23:{
 "^":"a;",
-XB:function(a){var z
+h5:function(a){var z
 for(;z=J.RE(a),z.gAd(a)!=null;){if(!!z.$iszs&&J.UQ(a.n7,"eventController")!=null)return J.UQ(z.gCp(a),"eventController")
 a=z.gAd(a)}return!!z.$isI0?a.host:null},
 Z8:function(a,b,c){var z={}
 z.a=a
-return new A.l5(z,this,b,c)},
-CZ:function(a,b,c){var z,y,x,w
+return new A.AC(z,this,b,c)},
+Io:function(a,b,c){var z,y,x,w
 z={}
 y=J.Qe(b)
 if(!y.nC(b,"on-"))return
@@ -15994,17 +16083,17 @@
 w=C.yt.t(0,x)
 z.a=w!=null?w:z.a
 return new A.liz(z,this,a)}},
-l5:{
+AC:{
 "^":"TpZ:12;a,b,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
+if(y==null||!J.x(y).$iszs){x=this.b.h5(this.c)
 z.a=x
 y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$isDG4){w=y.gey(a)
-if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
-y=y.gF0(a)
+if(!!y.$isRb){w=C.lG.gey(a)
+if(w==null)w=J.UQ(P.kW(a),"detail")}else w=null
+y=y.gXQ(a)
 z=z.a
 J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
@@ -16012,50 +16101,50 @@
 "^":"TpZ:188;a,b,c",
 $3:[function(a,b,c){var z,y,x
 z=this.c
-y=P.mt(new A.kD($.X3.mS(this.b.Z8(null,b,z))))
+y=P.mt(new A.Bc($.X3.mS(this.b.Z8(null,b,z))))
 x=this.a
-$.tNi().V7("addEventListener",[b,x.a,y])
+$.Op().V7("addEventListener",[b,x.a,y])
 if(c===!0)return
-return new A.zIs(z,b,x.a,y)},"$3",null,6,0,null,185,186,187,"call"],
+return new A.d6(z,b,x.a,y)},"$3",null,6,0,null,185,186,187,"call"],
 $isEH:true},
-kD:{
+Bc:{
 "^":"TpZ:81;d",
 $2:[function(a,b){return this.d.$1(b)},"$2",null,4,0,null,13,2,"call"],
 $isEH:true},
-zIs:{
-"^":"Ap;ED,d9,dF,Xj",
+d6:{
+"^":"Ap;ED,v3,dF,Xj",
 gP:function(a){return"{{ "+this.ED+" }}"},
 TR:function(a,b){return"{{ "+this.ED+" }}"},
-xO:function(a){$.tNi().V7("removeEventListener",[this.d9,this.dF,this.Xj])}},
+xO:function(a){$.Op().V7("removeEventListener",[this.v3,this.dF,this.Xj])}},
 xn:{
 "^":"iv;vn<",
 $isxn:true},
 xc:{
-"^":"TR0;Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"TR0;Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 XI:function(a){this.kR(a)},
-static:{oaJ:function(a){var z,y,x,w
+static:{yk:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.GBL.LX(a)
-C.GBL.XI(a)
+C.Vk.LX(a)
+C.Vk.XI(a)
 return a}}},
 jpR:{
 "^":"Bo+zs;Cp:n7=",
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 $isKV:true},
 TR0:{
 "^":"jpR+Pi;",
@@ -16070,137 +16159,137 @@
 y=this.gQg(a).dA.getAttribute("is")
 return y==null||y===""?this.gqn(a):y},
 kR:function(a){var z,y
-z=this.gmb(a)
+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.Ec(a)
-y=this.gJ8(a)
-if(!J.xC($.Ks().t(0,y),!0))this.rf(a)},
+y=this.gM0(a)
+if(!J.xC($.Tg().t(0,y),!0))this.rf(a)},
 Ec:function(a){var z,y
 if(a.IX!=null){window
 z="Element already prepared: "+H.d(this.gRT(a))
 if(typeof console!="undefined")console.warn(z)
-return}a.n7=P.XY(a)
+return}a.n7=P.kW(a)
 z=this.gRT(a)
-a.IX=$.w3G().t(0,z)
-this.jM(a)
+a.IX=$.RA().t(0,z)
+this.nt(a)
 z=a.MJ
 if(z!=null){y=this.gnu(a)
 z.toString
 L.ARh.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gLj(a))
 this.oR(a)
-this.xL(a)
+this.xX(a)
 this.Uc(a)},
 rf:function(a){if(a.OD)return
 a.OD=!0
 this.bT(a)
 this.Qs(a,a.IX)
 this.gQg(a).Rz(0,"unresolved")
-$.lg().To(new A.pN(a))
+$.Fs().To(new A.pN(a))
 this.I9(a)},
 I9:function(a){},
 Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
 this.oW(a)
 if(!a.kK){a.kK=!0
 this.rW(a,new A.hp(a))}},
-Lx:function(a){this.x3(a)},
-Qs:function(a,b){if(b!=null){this.Qs(a,b.gJh())
+dQ:function(a){this.x3(a)},
+Qs:function(a,b){if(b!=null){this.Qs(a,b.gP1())
 this.aI(a,J.y3(b))}},
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.XT(b,"template")
+y=z.Wk(b,"template")
 if(y!=null){x=this.Tp(a,y)
 w=z.gQg(b).dA.getAttribute("name")
 if(w==null)return
 a.ZM.u(0,w,x)}},
 Tp:function(a,b){var z,y,x,w,v,u
-if(b==null)return
-z=this.TL(a)
+z=this.er(a)
+M.uH(b).rp(null)
 y=this.gwX(a)
-x=!!J.x(b).$isvy?b:M.Xi(b)
-w=J.dv(x,a,y==null&&J.qy(x)==null?J.v7(a.IX):y)
-v=a.f4
-u=$.nR().t(0,w)
+x=!!J.x(b).$ishs?b:M.uH(b)
+w=J.ju(x,a,y==null&&J.Ee(x)==null?J.RH0(a.IX):y)
+v=a.Iy
+u=$.Uo().t(0,w)
 C.Nm.FV(v,u!=null?u.gdn():u)
 z.appendChild(w)
 this.lj(a,z)
 return z},
 lj:function(a,b){var z,y,x
 if(b==null)return
-for(z=J.We(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.Ff
+for(z=J.Vj(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
 y.u(0,J.eS(x),x)}},
-wN:function(a,b,c,d){var z=J.x(b)
+aC:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
-oR:function(a){a.IX.gPH().aN(0,new A.Sv(a))},
-xL:function(a){if(a.IX.gMd()==null)return
+oR:function(a){a.IX.gCY().aN(0,new A.va(a))},
+xX:function(a){if(a.IX.gDB()==null)return
 this.gQg(a).aN(0,this.gCg(a))},
 D3:[function(a,b,c){var z,y,x,w,v,u
 z=this.B2(a,b)
 if(z==null)return
-if(c==null||J.kE(c,$.VCp())===!0)return
+if(c==null||J.kE(c,$.iB())===!0)return
 y=J.RE(z)
 x=y.goc(z)
-w=$.cp().Gp(a,x)
+w=$.cp().jD(a,x)
 v=y.gt5(z)
 x=J.x(v)
-u=Z.fd(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
+u=Z.LB(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","gCg",4,0,189],
-B2:function(a,b){var z=a.IX.gMd()
+$.cp().Q1(a,y,u)}},"$2","gCg",4,0,189],
+B2:function(a,b){var z=a.IX.gDB()
 if(z==null)return
 return z.t(0,b)},
-TW:function(a,b){if(b==null)return
+JL:function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
 QH:function(a,b){var z,y
 z=L.hk(b).WK(a)
-y=this.TW(a,z)
+y=this.JL(a,z)
 if(y!=null)this.gQg(a).dA.setAttribute(b,y)
 else if(typeof z==="boolean")this.gQg(a).Rz(0,b)},
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z=this.B2(a,b)
-if(z==null)return J.IB(M.Xi(a),b,c,d)
+if(z==null)return J.FS1(M.uH(a),b,c,d)
 else{y=J.RE(z)
 x=this.Fy(a,y.goc(z),c,d)
-if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.Xi(a))==null){w=P.Fl(null,null)
-J.CS(M.Xi(a),w)}J.kW(J.QE(M.Xi(a)),b,x)}v=a.IX.gix()
+if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.uH(a))==null){w=P.Fl(null,null)
+J.nC(M.uH(a),w)}J.qQ(J.QE(M.uH(a)),b,x)}v=a.IX.gix()
 y=y.goc(z)
-u=$.vu().xV.af.t(0,y)
+u=$.vu().JE.fJ.t(0,y)
 if(v!=null&&v.tg(0,u))this.QH(a,u)
 return x}},
 lL:function(a){return this.rf(a)},
-gCd:function(a){return J.QE(M.Xi(a))},
-sCd:function(a,b){J.CS(M.Xi(a),b)},
-gmb:function(a){return J.re(M.Xi(a))},
+gCd:function(a){return J.QE(M.uH(a))},
+sCd:function(a,b){J.nC(M.uH(a),b)},
+gCn:function(a){return J.OC(M.uH(a))},
 x3:function(a){var z,y
 if(a.bb===!0)return
-$.iX().J4(new A.N3(a))
+$.UW().Ny(new A.rs(a))
 z=a.TT
-y=this.gyz(a)
+y=this.gf2(a)
 if(z==null)z=new A.FT(null,null,null)
-z.t6(0,y,null)
+z.ui(0,y,null)
 a.TT=z},
-GBV:[function(a){if(a.bb===!0)return
+GB:[function(a){if(a.bb===!0)return
 this.mc(a)
 this.Uq(a)
-a.bb=!0},"$0","gyz",0,0,17],
+a.bb=!0},"$0","gf2",0,0,17],
 oW:function(a){var z
-if(a.bb===!0){$.iX().j2(new A.ti(a))
-return}$.iX().J4(new A.Rb(a))
+if(a.bb===!0){$.UW().j2(new A.TV(a))
+return}$.UW().Ny(new A.Z7(a))
 z=a.TT
-if(z!=null){z.nY(0)
+if(z!=null){z.TP(0)
 a.TT=null}},
-jM:function(a){var z,y,x,w,v
+nt:function(a){var z,y,x,w,v
 z=J.q1(a.IX)
 if(z!=null){y=new L.nQ(null,!1,[],null,null,null,$.jq1)
-y.vS=[]
+y.z7=[]
 a.MJ=y
-a.f4.push(y)
+a.Iy.push(y)
 for(x=H.VM(new P.fG(z),[H.u3(z,0)]),w=x.ZD,x=H.VM(new P.EQ(w,w.Nm(),0,null),[H.u3(x,0)]);x.G();){v=x.fD
 y.WX(a,v)
 this.j6(a,v,v.WK(a),null)}}},
-FQx:[function(a,b,c,d){J.Me(c,new A.OaD(a,b,c,d,J.q1(a.IX),P.Rd(null,null,null,null)))},"$3","gnu",6,0,190],
+FQx:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.q1(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,190],
 p7:[function(a,b){var z,y,x,w
 for(z=J.mY(b),y=a.qJ;z.G();){x=z.gl()
 if(!J.x(x).$isqI)continue
@@ -16208,8 +16297,8 @@
 if(y.t(0,w)!=null)continue
 this.Dt(a,w,x.zZ,x.jL)}},"$1","gLj",2,0,191,183],
 Dt:function(a,b,c,d){var z,y
-$.REM().To(new A.qW(a,b,c,d))
-z=$.vu().xV.af.t(0,b)
+$.Is().To(new A.qW(a,b,c,d))
+z=$.vu().JE.fJ.t(0,b)
 y=a.IX.gix()
 if(y!=null&&y.tg(0,z))this.QH(a,z)},
 j6:function(a,b,c,d){var z,y,x,w,v
@@ -16217,18 +16306,18 @@
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){$.dn().J4(new A.xf(a,b))
-this.Mx(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.dn().J4(new A.Y0(a,b))
-x=c.gXF().k0(new A.kMK(a,d,y),null,null,!1)
+if(!!J.x(d).$iswn){$.a3().Ny(new A.xf(a,b))
+this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.a3().Ny(new A.Y0(a,b))
+x=c.gXF().k0(new A.fS(a,y),null,null,!1)
 w=H.d(b)+"__array"
-v=a.Bd
+v=a.vG
 if(v==null){v=P.L5(null,null,null,P.qU,P.yX)
-a.Bd=v}v.u(0,w,x)}},
-hq:function(a,b,c,d){if(d==null?c==null:d===c)return
+a.vG=v}v.u(0,w,x)}},
+Oq:function(a,b,c,d){if(d==null?c==null:d===c)return
 this.Dt(a,b,c,d)},
-hO:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
-z=$.cp().xV.II.t(0,b)
-if(z==null)H.vh(O.Fm("getter \""+H.d(b)+"\" in "+this.bu(a)))
+rh:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
+z=$.cp().JE.E4.t(0,b)
+if(z==null)H.vh(O.lA("getter \""+H.d(b)+"\" in "+this.bu(a)))
 y=z.$1(a)
 x=a.qJ.t(0,b)
 if(x==null){w=J.RE(c)
@@ -16237,10 +16326,10 @@
 v.Sx=this.gqh(a).k0(v.gou(),null,null,!1)
 w=J.mu(c,v.gew())
 v.RP=w
-u=$.cp().xV.F8.t(0,b)
-if(u==null)H.vh(O.Fm("setter \""+H.d(b)+"\" in "+this.bu(a)))
+u=$.cp().JE.F8.t(0,b)
+if(u==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.bu(a)))
 u.$2(a,w)
-a.f4.push(v)
+a.Iy.push(v)
 return v}x.mn=c
 w=J.RE(c)
 t=w.TR(c,x.gUe())
@@ -16251,71 +16340,71 @@
 r=x.RT
 q=J.RE(w)
 x.VB=q.ct(w,r,y,t)
-q.hq(w,r,t,y)
+q.Oq(w,r,t,y)
 v=new A.p0(x)
-a.f4.push(v)
+a.Iy.push(v)
 return v},
-hH:function(a,b,c){return this.hO(a,b,c,!1)},
+wc:function(a,b,c){return this.rh(a,b,c,!1)},
 yO:function(a,b){var z=a.IX.gGl().t(0,b)
 if(z==null)return
-return T.yM().$3$globals(T.u5().$1(z),a,J.v7(a.IX).Mn.nF)},
+return T.aC().$3$globals(T.Ms().$1(z),a,J.RH0(a.IX).xI.nF)},
 bT:function(a){var z,y,x,w,v,u,t,s
 z=a.IX.gGl()
-for(v=J.mY(J.iY(z)),u=a.qJ;v.G();){y=v.gl()
+for(v=J.mY(J.iYM(z)),u=a.qJ;v.G();){y=v.gl()
 try{x=this.yO(a,y)
 if(u.t(0,y)==null){t=new A.Zw(y,J.Vm(x),a,null)
 t.$builtinTypeInfo=[null]
-u.u(0,y,t)}this.hH(a,y,x)}catch(s){t=H.Ru(s)
+u.u(0,y,t)}this.wc(a,y,x)}catch(s){t=H.Ru(s)
 w=t
 window
 t="Failed to create computed property "+H.d(y)+" ("+H.d(J.UQ(z,y))+"): "+H.d(w)
 if(typeof console!="undefined")console.error(t)}}},
 mc:function(a){var z,y
-for(z=a.f4,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
-if(y!=null)J.yd(y)}a.f4=[]},
-Mx:function(a,b){var z=a.Bd.Rz(0,b)
+for(z=a.Iy,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+if(y!=null)J.yd(y)}a.Iy=[]},
+iQ:function(a,b){var z=a.vG.Rz(0,b)
 if(z==null)return!1
 z.Gv()
 return!0},
 Uq:function(a){var z,y
-z=a.Bd
+z=a.vG
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.Ff
-if(y!=null)y.Gv()}a.Bd.V1(0)
-a.Bd=null},
-Fy:function(a,b,c,d){var z=$.Lu()
-z.J4(new A.aM(a,b,c))
-if(d){if(!!J.x(c).$isAp)z.j2(new A.RM(a,b,c))
-$.cp().Cq(a,b,c)
-return}return this.hO(a,b,c,!0)},
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.lo
+if(y!=null)y.Gv()}a.vG.V1(0)
+a.vG=null},
+Fy:function(a,b,c,d){var z=$.aQ()
+z.Ny(new A.aM(a,b,c))
+if(d){if(!!J.x(c).$isAp)z.j2(new A.aMY(a,b,c))
+$.cp().Q1(a,b,c)
+return}return this.rh(a,b,c,!0)},
 Uc:function(a){var z=a.IX.gmR()
 if(z.gl0(z))return
-$.vo().J4(new A.SX(a,z))
+$.xW().Ny(new A.SX(a,z))
 z.aN(0,new A.Jys(a))},
 ea:function(a,b,c,d){var z,y,x
-z=$.vo()
+z=$.xW()
 z.To(new A.od(a,c))
-if(!!J.x(c).$isEH){y=X.Zpg(c)
+if(!!J.x(c).$isEH){y=X.RI(c)
 if(y===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,y)
-H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.vu().xV.T4.t(0,c)
+H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.vu().JE.T4.t(0,c)
 $.cp().Ck(b,x,d,!0,null)}else z.j2("invalid callback")
-z.J4(new A.cB(a,c))},
+z.Ny(new A.cB(a,c))},
 rW:function(a,b){var z
 P.rb(F.Jy())
 $.Kc().nQ("flush")
 z=window
-C.Ui.Wq(z)
-return C.Ui.ne(z,W.Yt(b))},
-SE:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
-this.Ph(a,z)
+C.ol.Wq(z)
+return C.ol.ne(z,W.Yt(b))},
+TZ:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
+this.jR(a,z)
 return z},
-ZB:function(a,b){return this.SE(a,b,null,null,null,null)},
+ZB:function(a,b){return this.TZ(a,b,null,null,null,null)},
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 $isKV:true},
 pN:{
 "^":"TpZ:76;a",
@@ -16325,7 +16414,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-Sv:{
+va:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.NZ(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
@@ -16335,19 +16424,19 @@
 "^":"TpZ:76;b",
 $0:function(){return this.b},
 $isEH:true},
-N3:{
+rs:{
 "^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.RI(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-ti:{
+TV:{
 "^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.RI(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-Rb:{
+Z7:{
 "^":"TpZ:76;b",
-$0:[function(){return"["+H.d(J.RI(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-OaD:{
+N4:{
 "^":"TpZ:81;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
@@ -16370,52 +16459,52 @@
 $isEH:true},
 xf:{
 "^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.RI(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Y0:{
 "^":"TpZ:76;c,d",
-$0:[function(){return"["+H.d(J.RI(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-kMK:{
-"^":"TpZ:12;e,f,UI",
-$1:[function(a){var z,y,x,w
-for(z=J.mY(this.UI),y=this.e,x=this.f;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,192,"call"],
+fS:{
+"^":"TpZ:12;e,f",
+$1:[function(a){var z,y,x
+for(z=J.mY(this.f),y=this.e;z.G();){x=z.gl()
+$.cp().Ck(y,x,[a],!0,null)}},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 aM:{
 "^":"TpZ:76;a,b,c",
-$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.RI(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
+$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.VB(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
 $isEH:true},
-RM:{
+aMY:{
 "^":"TpZ:76;d,e,f",
-$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.RI(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
+$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.VB(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
 $isEH:true},
 SX:{
 "^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.RI(this.a))+"] addHostListeners: "+this.b.bu(0)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.VB(this.a))+"] addHostListeners: "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jys:{
 "^":"TpZ:81;c",
 $2:function(a,b){var z=this.c
-$.tNi().V7("addEventListener",[z,a,$.X3.mS(J.v7(z.IX).Z8(z,z,b))])},
+$.Op().V7("addEventListener",[z,a,$.X3.mS(J.RH0(z.IX).Z8(z,z,b))])},
 $isEH:true},
 od:{
 "^":"TpZ:76;a,b",
-$0:[function(){return">>> ["+H.d(J.RI(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return">>> ["+H.d(J.VB(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cB:{
 "^":"TpZ:76;c,d",
-$0:[function(){return"<<< ["+H.d(J.RI(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$0:[function(){return"<<< ["+H.d(J.VB(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lK:{
 "^":"Ap;I6,ko,q0,Sx,RP",
 z9N:[function(a){this.RP=a
-$.cp().Cq(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
-TZ:[function(a){var z,y,x,w,v
+$.cp().Q1(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
+XH:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.ko;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().xV.II.t(0,y)
-if(w==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+J.AG(z)))
+w=$.cp().JE.E4.t(0,y)
+if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
 v=w.$1(z)
 z=this.RP
 if(z==null?v!=null:z!==v)J.Fc(this.q0,v)
@@ -16440,26 +16529,26 @@
 J.yd(y)
 z.mn=null}},
 FT:{
-"^":"a;ek,Ar,lS",
-Dj:function(){return this.ek.$0()},
-t6:function(a,b,c){var z
-this.nY(0)
-this.ek=b
+"^":"a;Hi,Ar,TU",
+Dj:function(){return this.Hi.$0()},
+ui:function(a,b,c){var z
+this.TP(0)
+this.Hi=b
 z=window
-C.Ui.Wq(z)
-this.lS=C.Ui.ne(z,W.Yt(new A.K3(this)))},
-nY:function(a){var z,y
-z=this.lS
+C.ol.Wq(z)
+this.TU=C.ol.ne(z,W.Yt(new A.K3(this)))},
+TP:function(a){var z,y
+z=this.TU
 if(z!=null){y=window
-C.Ui.Wq(y)
+C.ol.Wq(y)
 y.cancelAnimationFrame(z)
-this.lS=null}z=this.Ar
+this.TU=null}z=this.Ar
 if(z!=null){z.Gv()
 this.Ar=null}}},
 K3:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.Ar!=null||z.lS!=null){z.nY(0)
+if(z.Ar!=null||z.TU!=null){z.TP(0)
 z.Dj()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
@@ -16476,10 +16565,10 @@
 k2:{
 "^":"TpZ:195;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
-if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.w3G().t(0,c)))
+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,193,58,194,"call"],
 $isEH:true},
-zR:{
+v4:{
 "^":"TpZ:76;c,d,e,f",
 $0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=this.c
@@ -16487,75 +16576,76 @@
 x=this.e
 w=this.f
 v=P.Fl(null,null)
-u=$.Ak()
+u=$.Cl()
 t=P.Fl(null,null)
-v=new A.So(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
-$.w3G().u(0,y,v)
+v=new A.XP(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
+$.RA().u(0,y,v)
 v.Zw(w)
 s=v.Q7
-if(s!=null)v.Md=v.jq(s)
+if(s!=null)v.DB=v.jq(s)
 v.rH()
 v.I7()
-v.ut()
+v.hW()
 s=J.RE(z)
-r=s.XT(z,"template")
-if(r!=null)J.D4(!!J.x(r).$isvy?r:M.Xi(r),u)
-v.ka()
+r=s.Wk(z,"template")
+if(r!=null)J.NA(!!J.x(r).$ishs?r:M.uH(r),u)
+v.fk()
 v.f6()
 v.yq()
-A.ZI(v.J3(v.ds("global"),"global"),document.head)
-v.Cw(z)
+A.ZI(v.J3(v.l7("global"),"global"),document.head)
+v.RH(z)
 v.Vk()
 v.W3(t)
 q=s.gQg(z).dA.getAttribute("assetpath")
 if(q==null)q=""
-p=P.hK(s.gJ8(z).baseURI)
+p=P.hK(s.gM0(z).baseURI)
 z=P.hK(q)
 o=z.Fi
 if(o.length!==0){if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=z.QB!=null?z.gtp(z):null}else{n=""
+l=z.Ni!=null?z.gtp(z):null}else{n=""
 m=null
-l=null}k=p.jn(z.Ee)
+l=null}k=p.mE(z.Ee)
 j=z.xu
 if(j!=null);else j=null}else{o=p.Fi
 if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=P.JF(z.QB!=null?z.gtp(z):null,o)
-k=p.jn(z.Ee)
+l=P.Ec(z.Ni!=null?z.gtp(z):null,o)
+k=p.mE(z.Ee)
 j=z.xu
 if(j!=null);else j=null}else{u=z.Ee
-if(u===""){k=p.Ee
+t=J.x(u)
+if(t.n(u,"")){k=p.Ee
 j=z.xu
-if(j!=null);else j=p.xu}else{k=C.xB.nC(u,"/")?p.jn(u):p.jn(p.pi(p.Ee,u))
+if(j!=null);else j=p.xu}else{k=t.nC(u,"/")?p.mE(u):p.mE(p.Bs(p.Ee,u))
 j=z.xu
 if(j!=null);else j=null}n=p.ku
 m=p.Kk
-l=p.QB}}i=z.ys
+l=p.Ni}}i=z.ys
 if(i!=null);else i=null
-v.vT=new P.q5(m,l,k,o,n,j,i,null,null)
+v.aU=new P.q5(m,l,k,o,n,j,i,null,null)
 z=v.gZf()
-A.ec(z,y,w!=null?J.DA(w):null)
-if($.mX().n6(x,C.SE))$.cp().Ck(x,C.SE,[v],!1,null)
+A.YG(z,y,w!=null?J.DA(w):null)
+if($.II().n6(x,C.L9))$.cp().Ck(x,C.L9,[v],!1,null)
 v.Ba(y)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
 "^":"TpZ:76;",
-$0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
-return!!J.x(z).$isKV?P.XY(z):z},
+$0:function(){var z=J.UQ(P.kW(document.createElement("polymer-element",null)),"__proto__")
+return!!J.x(z).$isKV?P.kW(z):z},
 $isEH:true},
 j0:{
 "^":"TpZ:12;a",
-$1:function(a){return J.xC(J.UQ(this.a,J.DA(a)),!0)},
+$1:function(a){return J.xC(J.UQ(this.a.a,J.DA(a)),!0)},
 $isEH:true},
 j0N:{
-"^":"TpZ:12;b",
-$1:function(a){return!J.xC(J.UQ(this.b,J.DA(a)),!0)},
+"^":"TpZ:12;a",
+$1:function(a){return!J.xC(J.UQ(this.a.a,J.DA(a)),!0)},
 $isEH:true},
 MZ6:{
 "^":"TpZ:12;",
-$1:function(a){a.sOR(C.oOA)},
+$1:function(a){a.sOR(C.oO)},
 $isEH:true},
 mqr:{
 "^":"TpZ:12;",
@@ -16563,48 +16653,48 @@
 $isEH:true},
 Zw:{
 "^":"a;RT,VB,I6,mn",
-xz:[function(a){var z,y,x,w
+VV:[function(a){var z,y,x,w
 z=this.VB
 y=this.I6
 x=this.RT
 w=J.RE(y)
 this.VB=w.ct(y,x,z,a)
-w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"Zw")},60],
+w.Oq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"Zw")},60],
 gP:function(a){var z=this.mn
 if(z!=null)z.fR()
 return this.VB},
 sP:function(a,b){var z=this.mn
 if(z!=null)J.Fc(z,b)
-else this.xz(b)},
+else this.VV(b)},
 bu:[function(a){var z,y
-z=$.vu().xV.af.t(0,this.RT)
+z=$.vu().JE.fJ.t(0,this.RT)
 y=this.mn==null?"(no-binding)":"(with-binding)"
 return"["+H.d(new H.cu(H.wO(this),null))+": "+J.AG(this.I6)+"."+H.d(z)+": "+H.d(this.VB)+" "+y+"]"},"$0","gCR",0,0,76]}}],["","",,Y,{
 "^":"",
-hg:{
-"^":"k5d;Hf,ro,XY,cU,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+G0:{
+"^":"k5d;Hf,ro,XY,iS,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gk8:function(a){return J.ZH(a.Hf)},
-gA0:function(a){return J.qy(a.Hf)},
-sA0:function(a,b){J.D4(a.Hf,b)},
-V1:function(a){return J.Z8(a.Hf)},
-gwX:function(a){return J.qy(a.Hf)},
-v3:function(a,b,c){return J.dv(a.Hf,b,c)},
+gG5:function(a){return J.Ee(a.Hf)},
+sG5:function(a,b){J.NA(a.Hf,b)},
+V1:function(a){return J.U2(a.Hf)},
+gwX:function(a){return J.Ee(a.Hf)},
+eX:function(a,b,c){return J.ju(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
 this.kR(a)
-a.Hf=M.Xi(a)
-z=T.Mo(null,C.qY)
-J.D4(a.Hf,new Y.oM(a,z,null))
+a.Hf=M.uH(a)
+z=T.GF(null,C.qY)
+J.NA(a.Hf,new Y.oM(a,z,null))
 $.j6().MM.ml(new Y.lkK(a))},
 $isDT:true,
-$isvy:true,
-static:{Ifw:function(a){var z,y,x,w
+$ishs:true,
+static:{zE:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -16615,21 +16705,21 @@
 C.Gkp.dX(a)
 return a}}},
 GLL:{
-"^":"OH+zs;Cp:n7=",
+"^":"yY+zs;Cp:n7=",
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
 $ish4:true,
-$isPZ:true,
+$isFU:true,
 $isKV:true},
 k5d:{
-"^":"GLL+d3;R9:ro%,rJ:XY%,xt:cU%",
+"^":"GLL+d3;R9:ro%,rJ:XY%,me:iS%",
 $isd3:true},
 lkK:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.J1(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
+J.mI(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Mrx:{
 "^":"TpZ:12;b",
@@ -16640,35 +16730,35 @@
 y.ZB(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 oM:{
-"^":"Li;dq,Mn,oe",
-XB:function(a){return this.dq}}}],["","",,Z,{
+"^":"Li;dq,xI,oe",
+h5:function(a){return this.dq}}}],["","",,Z,{
 "^":"",
-fd:function(a,b,c){var z,y,x
-z=$.h2().t(0,c)
+LB:function(a,b,c){var z,y,x
+z=$.RO().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.iQ(J.JA(a,"'","\""))
+try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
+DO:{
+"^":"TpZ:81;",
+$2:function(a,b){return a},
+$isEH:true},
 lP:{
 "^":"TpZ:81;",
 $2:function(a,b){return a},
 $isEH:true},
-wJY:{
-"^":"TpZ:81;",
-$2:function(a,b){return a},
-$isEH:true},
-zOQ:{
+Uf:{
 "^":"TpZ:81;",
 $2:function(a,b){var z,y
-try{z=P.zu(a)
+try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
-W6o:{
+Ra:{
 "^":"TpZ:81;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
-MdQ:{
+wJY:{
 "^":"TpZ:81;",
 $2:function(a,b){return H.BU(a,null,new Z.pp(b))},
 $isEH:true},
@@ -16676,7 +16766,7 @@
 "^":"TpZ:12;a",
 $1:function(a){return this.a},
 $isEH:true},
-YJG:{
+zOQ:{
 "^":"TpZ:81;",
 $2:function(a,b){return H.RR(a,new Z.fT(b))},
 $isEH:true},
@@ -16689,10 +16779,10 @@
 if(!!z.$isT8)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
 return z},"$1","PG6",2,0,52,66],
-qN:[function(a){var z=J.x(a)
+SC:[function(a){var z=J.x(a)
 if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.k9(a)),";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Bn",2,0,52,66],
+return z},"$1","Oq",2,0,52,66],
 IK:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,141,"call"],
@@ -16702,10 +16792,10 @@
 $1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,141,"call"],
 $isEH:true},
 QB:{
-"^":"vE;OH,nF,R3,SY,oe",
+"^":"VE;OH,nF,R3,CZ,oe",
 op:function(a,b,c){var z,y,x
 z={}
-y=T.OD(a,null).oK()
+y=T.eHj(a,null).oK()
 if(M.CF(c)){x=J.x(b)
 x=x.n(b,"bind")||x.n(b,"repeat")}else x=!1
 if(x){z=J.x(y)
@@ -16713,22 +16803,22 @@
 else return new T.Xyb(this,y)}z.a=null
 x=!!J.x(c).$ish4
 if(x&&J.xC(b,"class"))z.a=T.PG6()
-else if(x&&J.xC(b,"style"))z.a=T.Bn()
+else if(x&&J.xC(b,"style"))z.a=T.Oq()
 return new T.Ddj(z,this,y)},
-CE:function(a){var z=this.SY.t(0,a)
+CE:function(a){var z=this.CZ.t(0,a)
 if(z==null)return new T.uK(this,a)
-return new T.uKo(this,a,z)},
-jX:function(a){var z,y,x,w,v
+return new T.rc(this,a,z)},
+LR:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=z.gAd(a)
 if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.Xi(a)
+if(M.CF(a)){x=!!z.$ishs?a:M.uH(a)
 z=J.RE(x)
-w=z.gmb(x)
+w=z.gCn(x)
 v=w==null?z.gk8(x):w.k8
 if(!!J.x(v).$isPF)return v
-else return this.R3.t(0,a)}return this.jX(y)},
-fi:function(a,b){var z,y
+else return this.R3.t(0,a)}return this.LR(y)},
+mH:function(a,b){var z,y
 if(a==null)return K.wm(b,this.nF)
 z=J.x(a)
 if(!!z.$ish4);if(!!J.x(b).$isPF)return b
@@ -16738,26 +16828,24 @@
 else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
 return this.W5(a,b)}},
 W5:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Xi(a)
+if(M.CF(a)){z=!!J.x(a).$ishs?a:M.uH(a)
 y=J.RE(z)
-if(y.gmb(z)==null)y.gk8(z)
+if(y.gCn(z)==null)y.gk8(z)
 return this.R3.t(0,a)}else{y=J.RE(a)
 if(y.geT(a)==null){x=this.R3.t(0,a)
 return x!=null?x:K.wm(b,this.nF)}else return this.W5(y.gAd(a),b)}},
-static:{"^":"rp3",Mo:function(a,b){var z,y,x
+static:{"^":"rp3",GF:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.PF])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.mB)
-return new T.QB(b,x,z,y,null)},ct:[function(a){return T.OD(a,null).oK()},"$1","u5",2,0,67],mD:[function(a,b,c,d){var z
-if(c==null){c=P.L5(null,null,null,null,null)
-c.FV(0,C.mB)}z=K.wm(b,c)
-return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.mD(a,b,null,!1)},null,function(a,b,c){return T.mD(a,b,null,c)},null,function(a,b,c){return T.mD(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","yM",4,5,68,22,69]}},
+x.FV(0,C.c7)
+return new T.QB(b,x,z,y,null)},aV:[function(a){return T.eHj(a,null).oK()},"$1","Ms",2,0,67],QP:[function(a,b,c,d){var z=K.wm(b,c)
+return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.QP(a,b,null,!1)},null,function(a,b,c){return T.QP(a,b,null,c)},null,function(a,b,c){return T.QP(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","aC",4,5,68,22,69]}},
 qb:{
 "^":"TpZ:196;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
-z.SY.u(0,b,this.c)
+z.CZ.u(0,b,this.c)
 y=!!J.x(a).$isPF?a:K.wm(a,z.nF)
 z.R3.u(0,b,y)
 return new T.tI(y,null,this.d,null,null,null,null)},"$3",null,6,0,null,185,186,187,"call"],
@@ -16773,7 +16861,7 @@
 $isEH:true},
 Ddj:{
 "^":"TpZ:196;a,UI,bK",
-$3:[function(a,b,c){var z=this.UI.fi(b,a)
+$3:[function(a,b,c){var z=this.UI.mH(b,a)
 if(c===!0)return T.rD(this.bK,z,this.a.a)
 return new T.tI(z,this.a.a,this.bK,null,null,null,null)},"$3",null,6,0,null,185,186,187,"call"],
 $isEH:true},
@@ -16784,9 +16872,9 @@
 y=this.b
 x=z.R3.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.wm(a,z.nF)}else return z.fi(y,a)},"$1",null,2,0,null,185,"call"],
+return K.wm(a,z.nF)}else return z.mH(y,a)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
-uKo:{
+rc:{
 "^":"TpZ:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
@@ -16794,10 +16882,10 @@
 x=z.R3.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.jX(y).t1(w,a)},"$1",null,2,0,null,185,"call"],
+else return z.LR(y).t1(w,a)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;Hk,mo,te,qc,RQ,uZ,Ke",
+"^":"Ap;Hk,mo,te,qc,F0,kg,Ke",
 Ko:function(a){return this.mo.$1(a)},
 AO:function(a){return this.qc.$1(a)},
 Mr:[function(a,b){var z,y
@@ -16816,41 +16904,39 @@
 TR:function(a,b){var z,y
 if(this.qc!=null)throw H.b(P.w("already open"))
 this.qc=b
-z=H.VM(new P.nd(null,0,0,0),[null])
-z.Eo(null,null)
-y=J.okV(this.te,new K.Oy(z))
-this.uZ=y
-z=y.gju().yI(this.gGX())
-z.fm(0,new T.yF(this))
-this.RQ=z
+z=J.okV(this.te,new K.Oy(P.NZ2(null,null)))
+this.kg=z
+y=z.gqM().yI(this.gGX())
+y.fm(0,new T.yF(this))
+this.F0=y
 this.kf(!0)
 return this.Ke},
 kf:function(a){var z,y,x,w,v
-try{x=this.uZ
-J.okV(x,new K.Edh(this.Hk,a))
+try{x=this.kg
+J.okV(x,new K.pf(this.Hk,a))
 x.gBI()
-x=this.Mr(this.uZ.gBI(),a)
+x=this.Mr(this.kg.gBI(),a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
 x=new P.Gc(0,$.X3,null,null,null,null,null,null)
 x.$builtinTypeInfo=[null]
 new P.Zf(x).$builtinTypeInfo=[null]
-v="Error evaluating expression '"+H.d(this.uZ)+"': "+H.d(z)
+v="Error evaluating expression '"+H.d(this.kg)+"': "+H.d(z)
 if(x.YM!==0)H.vh(P.w("Future already completed"))
 x.Nk(v,y)
 return!1}},
 Yg:function(){return this.kf(!1)},
 xO:function(a){var z,y
 if(this.qc==null)return
-this.RQ.Gv()
-this.RQ=null
+this.F0.Gv()
+this.F0=null
 this.qc=null
 z=$.Pk()
-y=this.uZ
+y=this.kg
 z.toString
 J.okV(y,z)
-this.uZ=null},
+this.kg=null},
 fR:function(){if(this.qc!=null)this.Cm()},
 Cm:function(){var z=0
 while(!0){if(!(z<1000&&this.Yg()===!0))break;++z}return z>0},
@@ -16863,16 +16949,16 @@
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 yF:{
 "^":"TpZ:81;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.uZ)+"': "+H.d(a),b)},"$2",null,4,0,null,2,165,"call"],
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.kg)+"': "+H.d(a),b)},"$2",null,4,0,null,2,165,"call"],
 $isEH:true},
 WM:{
 "^":"a;"}}],["","",,B,{
 "^":"",
-LL:{
-"^":"xhq;vq>,Xq,Vg,fn",
+De:{
+"^":"xhq;vq>,Xq,Vg,ij",
 vb:function(a,b){this.vq.yI(new B.iH6(b,this))},
 $asxhq:function(a){return[null]},
-static:{Ha:function(a,b){var z=H.VM(new B.LL(a,null,null,null),[b])
+static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 iH6:{
@@ -16880,130 +16966,132 @@
 $1:[function(a){var z=this.b
 z.Xq=F.Wi(z,C.zd,z.Xq,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"WM",args:[a]}},this.b,"LL")}}}],["","",,K,{
+$signature:function(){return H.oZ(function(a){return{func:"Lf1",args:[a]}},this.b,"De")}}}],["","",,K,{
 "^":"",
-jXm:function(a,b,c,d){var z,y,x,w,v,u,t
-z=H.VM([],[U.rx])
+jXm:function(a,b,c,d){var z,y,x,w,v,u,t,s
+z=H.VM([],[U.hw])
 for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gxS(a),"|"))break
 z.push(y.gT8(a))
 a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.x4
+w=C.OL
 v=!1}else if(!!y.$isvn){w=a.gZs()
 x=a.gmU()
 v=!0}else{if(!!y.$isx9){w=a.gZs()
-x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.Ff
-J.okV(u,new K.GQ(c))
-if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
-else return}t=J.okV(w,new K.GQ(c))
-if(t==null)return
-if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
-else{y=$.vu().xV.T4.t(0,x)
-$.cp().Cq(t,y,b)}return b},
-wm:function(a,b){var z,y,x
-z=new K.ug(a)
-if(b==null)y=z
-else{y=P.L5(null,null,null,P.qU,P.a)
-y.FV(0,b)
-x=new K.Ph(z,y)
-if(y.NZ(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-y=x}return y},
-w12:{
+x=y.goc(a)}else{if(d)throw H.b(K.du("Expression is not assignable: "+H.d(a)))
+return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.lo
+t=J.okV(u,new K.GQ(c))
+if(!J.x(t).$isKq)if(d)throw H.b(K.du("filter must implement Transformer to be assignable: "+H.d(u)))
+else return
+b=t.Kh(b)}s=J.okV(w,new K.GQ(c))
+if(s==null)return
+if(v)J.qQ(s,J.okV(x,new K.GQ(c)),b)
+else{y=$.vu().JE.T4.t(0,x)
+$.cp().Q1(s,y,b)}return b},
+wm:function(a,b){var z,y
+z=P.L5(null,null,null,P.qU,P.a)
+z.FV(0,b)
+y=new K.Ph(new K.nk(a),z)
+if(z.NZ(0,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
+z=y
+return z},
+w5:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.WB(a,b)},
 $isEH:true},
-w13:{
+w10:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.bI(a,b)},
 $isEH:true},
-w14:{
+w11:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
-w15:{
+w12:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.L9(a,b)},
+$2:function(a,b){return J.X9(a,b)},
 $isEH:true},
-w16:{
+w13:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.jOZ(a,b)},
 $isEH:true},
-w17:{
+w14:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
-w18:{
+w15:{
 "^":"TpZ:81;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
-w19:{
+w16:{
 "^":"TpZ:81;",
 $2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
-w20:{
+w17:{
 "^":"TpZ:81;",
 $2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
-w21:{
+w18:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.xZ(a,b)},
 $isEH:true},
-w22:{
+w19:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
-w23:{
+w20:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
-w24:{
+w21:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
-w25:{
+w22:{
 "^":"TpZ:81;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
-w26:{
+w23:{
 "^":"TpZ:81;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
-w27:{
+w24:{
 "^":"TpZ:81;",
-$2:function(a,b){var z=H.Ogz(P.a)
+$2:function(a,b){var z=J.x(b)
+if(!!z.$isKq)return z.At(b,a)
+z=H.Ogz(P.a)
 z=H.KT(z,[z]).Zg(b)
 if(z)return b.$1(a)
-throw H.b(K.zq("Filters must be a one-argument function."))},
+throw H.b(K.du("Filters must be a one-argument function."))},
 $isEH:true},
-w5:{
+lPa:{
 "^":"TpZ:12;",
 $1:function(a){return a},
 $isEH:true},
-w10:{
+Ufa:{
 "^":"TpZ:12;",
-$1:function(a){return J.Lh(a)},
+$1:function(a){return J.jzo(a)},
 $isEH:true},
-w11:{
+Raa:{
 "^":"TpZ:12;",
 $1:function(a){return a!==!0},
 $isEH:true},
 PF:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
-t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+t1:function(a,b){if(J.xC(a,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
 return new K.Rf(this,a,b)},
 $isPF:true,
-$isHX:true,
-$asHX:function(){return[P.qU,P.a]}},
-ug:{
+$isueT:true,
+$asueT:function(){return[P.qU,P.a]}},
+nk:{
 "^":"PF;k8>",
 t:function(a,b){var z,y
 if(J.xC(b,"this"))return this.k8
-z=$.vu().xV.T4.t(0,b)
+z=$.vu().JE.T4.t(0,b)
 y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
-y=$.cp().Gp(y,z)
-return!!J.x(y).$iswS?B.Ha(y,null):y},
+if(y==null||z==null)throw H.b(K.du("variable '"+H.d(b)+"' not found"))
+y=$.cp().jD(y,z)
+return!!J.x(y).$iscb?B.zR(y,null):y},
 tc:function(a){return!J.xC(a,"this")},
 bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gCR",0,0,73]},
 Rf:{
@@ -17013,7 +17101,7 @@
 return z},
 t:function(a,b){var z
 if(J.xC(this.hI,b)){z=this.P
-return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
+return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
 tc:function(a){if(J.xC(this.hI,a))return!1
 return this.eT.tc(a)},
 bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.hI)+"]"},"$0","gCR",0,0,73]},
@@ -17022,40 +17110,40 @@
 gk8:function(a){return this.eT.k8},
 t:function(a,b){var z=this.Z3
 if(z.NZ(0,b)){z=z.t(0,b)
-return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
+return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
 tc:function(a){if(this.Z3.NZ(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.B4(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gCR",0,0,73]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+H.d(H.VM(new P.i5(z),[H.u3(z,0)]))+"]"},"$0","gCR",0,0,73]},
 Ay0:{
-"^":"a;VO?,Xl<",
-gju:function(){var z=this.vO
-return H.VM(new P.Ik(z),[H.u3(z,0)])},
-gXt:function(){return this.KL},
-gBI:function(){return this.Xl},
-MN:function(a){},
-Yo:function(a){var z
+"^":"a;VO?,vt<",
+gqM:function(){var z=this.vO
+return H.VM(new P.rk(z),[H.u3(z,0)])},
+gEV:function(){return this.KL},
+gBI:function(){return this.vt},
+ux:function(a){},
+BZ:function(a){var z
 this.jK(0,a,!1)
 z=this.VO
-if(z!=null)z.Yo(a)},
+if(z!=null)z.BZ(a)},
 fs:function(){var z=this.tj
 if(z!=null){z.Gv()
 this.tj=null}},
 jK:function(a,b,c){var z,y,x
 this.fs()
-z=this.Xl
-this.MN(b)
-if(!c){y=this.Xl
+z=this.vt
+this.ux(b)
+if(!c){y=this.vt
 y=y==null?z!=null:y!==z}else y=!1
 if(y){y=this.vO
-x=this.Xl
+x=this.vt
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(x)}},
 bu:[function(a){return this.KL.bu(0)},"$0","gCR",0,0,73],
-$isrx:true},
-Edh:{
-"^":"cfS;ms,OQ",
-xn:function(a){a.jK(0,this.ms,this.OQ)}},
+$ishw:true},
+pf:{
+"^":"cfS;ms,xZ",
+xn:function(a){a.jK(0,this.ms,this.xZ)}},
 me:{
 "^":"cfS;",
 xn:function(a){a.fs()},
@@ -17063,13 +17151,13 @@
 GQ:{
 "^":"P55;ms",
 W9:function(a){return J.ZH(this.ms)},
-Hs:function(a){return a.o2.RR(0,this)},
+Hs:function(a){return a.ep.RR(0,this)},
 Ci:function(a){var z,y,x
 z=J.okV(a.gZs(),this)
 if(z==null)return
 y=a.goc(a)
-x=$.vu().xV.T4.t(0,y)
-return $.cp().Gp(z,x)},
+x=$.vu().JE.T4.t(0,y)
+return $.cp().jD(z,x)},
 CU:function(a){var z=J.okV(a.gZs(),this)
 if(z==null)return
 return J.UQ(z,J.okV(a.gmU(),this))},
@@ -17082,13 +17170,13 @@
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gnK(a)==null)return H.eC(z,y,P.Te(null))
 x=a.gnK(a)
-v=$.vu().xV.T4.t(0,x)
+v=$.vu().JE.T4.t(0,x)
 return $.cp().Ck(z,v,y,!1,null)},
-I6W:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).br(0)},
+la:function(a){return a.gP(a)},
+Zh:function(a){return H.VM(new H.A8(a.glm(),this.gnG()),[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.u3(y,0)]);y.G();){x=y.Ff
+for(y=a.gJq(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
 z.u(0,J.okV(J.AW(x),this),J.okV(x.gv4(),this))}return z},
 YV:function(a){return H.vh(P.f("should never be called"))},
 qv:function(a){return J.UQ(this.ms,a.gP(a))},
@@ -17102,27 +17190,27 @@
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
 else if(y==null||x==null)return
 return w.$2(y,x)},
-kb:function(a){var z,y
-z=J.okV(a.go2(),this)
-y=$.fs().t(0,a.gxS(a))
+zPR:function(a){var z,y
+z=J.okV(a.gep(),this)
+y=$.EU().t(0,a.gxS(a))
 if(J.xC(a.gxS(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.geE(),this)},
-ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-eS:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
+RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.gHy(),this)},
+kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+pg:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
 "^":"P55;ZG",
-W9:function(a){return new K.Il(a,null,null,null,P.bK(null,null,!1,null))},
-Hs:function(a){return a.o2.RR(0,this)},
+W9:function(a){return new K.WhS(a,null,null,null,P.bK(null,null,!1,null))},
+Hs:function(a){return a.ep.RR(0,this)},
 Ci:function(a){var z,y
 z=J.okV(a.gZs(),this)
-y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
+y=new K.vlk(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.gZs(),this)
 y=J.okV(a.gmU(),this)
-x=new K.iTN(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(x)
 y.sVO(x)
 return x},
@@ -17134,17 +17222,17 @@
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.faZ(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(v)
-if(y!=null)H.bQ(y,new K.zD(v))
+if(y!=null)H.bQ(y,new K.o4(v))
 return v},
-I6W:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
+la:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.UF(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.XV(y))
+H.bQ(z,new K.wr(y))
 return y},
 o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
-y=new K.ev2(z,a,null,null,null,P.bK(null,null,!1,null))
+z=H.VM(new H.A8(a.gJq(a),this.gnG()),[null,null]).tt(0,!1)
+y=new K.ED(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Xs(y))
 return y},
 YV:function(a){var z,y,x
@@ -17158,33 +17246,33 @@
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.ED(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.ky(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(x)
 y.sVO(x)
 return x},
-kb:function(a){var z,y
-z=J.okV(a.go2(),this)
+zPR:function(a){var z,y
+z=J.okV(a.gep(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(y)
 return y},
 RD:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
 y=J.okV(a.gav(),this)
-x=J.okV(a.geE(),this)
-w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+x=J.okV(a.gHy(),this)
+w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(w)
 y.sVO(w)
 x.sVO(w)
 return w},
-ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-eS:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
-zD:{
+kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+pg:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
+o4:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sVO(z)
 return z},
 $isEH:true},
-XV:{
+wr:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sVO(z)
@@ -17196,217 +17284,217 @@
 a.sVO(z)
 return z},
 $isEH:true},
-Il:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
-MN:function(a){this.Xl=J.ZH(a)},
+WhS:{
+"^":"Ay0;KL,VO,tj,vt,vO",
+ux:function(a){this.vt=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.WH]},
-$isWH:true,
-$isrx:true},
+$asAy0:function(){return[U.EO]},
+$isEO:true,
+$ishw:true},
 x5:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
+"^":"Ay0;KL,VO,tj,vt,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-MN:function(a){var z=this.KL
-this.Xl=z.gP(z)},
-RR:function(a,b){return b.I6W(this)},
-$asAy0:function(){return[U.noG]},
-$asnoG:function(){return[null]},
-$isnoG:true,
-$isrx:true},
+ux:function(a){var z=this.KL
+this.vt=z.gP(z)},
+RR:function(a,b){return b.la(this)},
+$asAy0:function(){return[U.Dv]},
+$asDv:function(){return[null]},
+$isDv:true,
+$ishw:true},
 UF:{
-"^":"Ay0;Bx<,KL,VO,tj,Xl,vO",
-MN:function(a){this.Xl=H.VM(new H.A8(this.Bx,new K.Hv()),[null,null]).br(0)},
+"^":"Ay0;lm<,KL,VO,tj,vt,vO",
+ux:function(a){this.vt=H.VM(new H.A8(this.lm,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c0]},
-$isc0:true,
-$isrx:true},
+$asAy0:function(){return[U.c09]},
+$isc09:true,
+$ishw:true},
 Hv:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"],
+$1:[function(a){return a.gvt()},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-ev2:{
-"^":"Ay0;Rl>,KL,VO,tj,Xl,vO",
-MN:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
+ED:{
+"^":"Ay0;Jq>,KL,VO,tj,vt,vO",
+ux:function(a){this.vt=H.n3(this.Jq,P.L5(null,null,null,null,null),new K.Ku())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
-$isrx:true},
+$ishw:true},
 Ku:{
 "^":"TpZ:81;",
-$2:function(a,b){J.kW(a,J.AW(b).gXl(),b.gv4().gXl())
+$2:function(a,b){J.qQ(a,J.AW(b).gvt(),b.gv4().gvt())
 return a},
 $isEH:true},
 EL:{
-"^":"Ay0;nl>,v4<,KL,VO,tj,Xl,vO",
+"^":"Ay0;nl>,v4<,KL,VO,tj,vt,vO",
 RR:function(a,b){return b.YV(this)},
 $asAy0:function(){return[U.nu]},
 $isnu:true,
-$isrx:true},
+$ishw:true},
 ek:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
+"^":"Ay0;KL,VO,tj,vt,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-MN:function(a){var z,y,x,w
+ux:function(a){var z,y,x,w
 z=this.KL
 y=J.U6(a)
-this.Xl=y.t(a,z.gP(z))
+this.vt=y.t(a,z.gP(z))
 if(!a.tc(z.gP(z)))return
 x=y.gk8(a)
 y=J.x(x)
 if(!y.$isd3)return
 z=z.gP(z)
-w=$.vu().xV.T4.t(0,z)
-this.tj=y.gqh(x).yI(new K.OC(this,a,w))},
+w=$.vu().JE.T4.t(0,z)
+this.tj=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,
-$isrx:true},
-OC:{
+$ishw:true},
+j9:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 GC:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;o2<,KL,VO,tj,Xl,vO",
+"^":"Ay0;ep<,KL,VO,tj,vt,vO",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
-MN:function(a){var z,y
+ux:function(a){var z,y
 z=this.KL
-y=$.fs().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"!")){z=this.o2.gXl()
-this.Xl=y.$1(z==null?!1:z)}else{z=this.o2
-this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
-RR:function(a,b){return b.kb(this)},
+y=$.EU().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"!")){z=this.ep.gvt()
+this.vt=y.$1(z==null?!1:z)}else{z=this.ep
+this.vt=z.gvt()==null?null:y.$1(z.gvt())}},
+RR:function(a,b){return b.zPR(this)},
 $asAy0:function(){return[U.FH]},
 $isFH:true,
-$isrx:true},
-ED:{
-"^":"Ay0;Bb>,T8>,KL,VO,tj,Xl,vO",
+$ishw:true},
+ky:{
+"^":"Ay0;Bb>,T8>,KL,VO,tj,vt,vO",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
-MN:function(a){var z,y,x
+ux:function(a){var z,y,x
 z=this.KL
 y=$.YP().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gXl()
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gvt()
 if(z==null)z=!1
-x=this.T8.gXl()
-this.Xl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Xl=y.$2(this.Bb.gXl(),this.T8.gXl())
+x=this.T8.gvt()
+this.vt=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.vt=y.$2(this.Bb.gvt(),this.T8.gvt())
 else{x=this.Bb
-if(x.gXl()==null||this.T8.gXl()==null)this.Xl=null
-else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gXl()).$iswn)this.tj=H.Go(x.gXl(),"$iswn").gXF().yI(new K.P8(this,a))
-this.Xl=y.$2(x.gXl(),this.T8.gXl())}}},
+if(x.gvt()==null||this.T8.gvt()==null)this.vt=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gvt()).$iswn)this.tj=H.Go(x.gvt(),"$iswn").gXF().yI(new K.nV(this,a))
+this.vt=y.$2(x.gvt(),this.T8.gvt())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
-$isrx:true},
-P8:{
+$ishw:true},
+nV:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return this.a.Yo(this.b)},"$1",null,2,0,null,13,"call"],
+$1:[function(a){return this.a.BZ(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-WW:{
-"^":"Ay0;dc<,av<,eE<,KL,VO,tj,Xl,vO",
-MN:function(a){var z=this.dc.gXl()
-this.Xl=(z==null?!1:z)===!0?this.av.gXl():this.eE.gXl()},
+an:{
+"^":"Ay0;dc<,av<,Hy<,KL,VO,tj,vt,vO",
+ux:function(a){var z=this.dc.gvt()
+this.vt=(z==null?!1:z)===!0?this.av.gvt():this.Hy.gvt()},
 RR:function(a,b){return b.RD(this)},
 $asAy0:function(){return[U.x06]},
 $isx06:true,
-$isrx:true},
-vl:{
-"^":"Ay0;Zs<,KL,VO,tj,Xl,vO",
+$ishw:true},
+vlk:{
+"^":"Ay0;Zs<,KL,VO,tj,vt,vO",
 goc:function(a){var z=this.KL
 return z.goc(z)},
-MN:function(a){var z,y,x
-z=this.Zs.gXl()
-if(z==null){this.Xl=null
+ux:function(a){var z,y,x
+z=this.Zs.gvt()
+if(z==null){this.vt=null
 return}y=this.KL
 y=y.goc(y)
-x=$.vu().xV.T4.t(0,y)
-this.Xl=$.cp().Gp(z,x)
+x=$.vu().JE.T4.t(0,y)
+this.vt=$.cp().jD(z,x)
 y=J.x(z)
-if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.Vw(this,a,x))},
+if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.e9n(this,a,x))},
 RR:function(a,b){return b.Ci(this)},
 $asAy0:function(){return[U.x9]},
 $isx9:true,
-$isrx:true},
-Vw:{
+$ishw:true},
+e9n:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 WKb:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-iTN:{
-"^":"Ay0;Zs<,mU<,KL,VO,tj,Xl,vO",
-MN:function(a){var z,y,x
-z=this.Zs.gXl()
-if(z==null){this.Xl=null
-return}y=this.mU.gXl()
+iT:{
+"^":"Ay0;Zs<,mU<,KL,VO,tj,vt,vO",
+ux:function(a){var z,y,x
+z=this.Zs.gvt()
+if(z==null){this.vt=null
+return}y=this.mU.gvt()
 x=J.U6(z)
-this.Xl=x.t(z,y)
-if(!!x.$iswn)this.tj=z.gXF().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.z5(this,a,y))},
+this.vt=x.t(z,y)
+if(!!x.$iswn)this.tj=z.gXF().yI(new K.jai(this,a,y))
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.FAT(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy0:function(){return[U.vn]},
 $isvn:true,
-$isrx:true},
-tE:{
+$ishw:true},
+jai:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GST(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.zw(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
-GST:{
+zw:{
 "^":"TpZ:12;d",
 $1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-z5:{
+FAT:{
 "^":"TpZ:12;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.Yo(this.f)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.BZ(this.f)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 ey:{
 "^":"TpZ:12;bK",
 $1:[function(a){return!!J.x(a).$isya&&J.xC(a.nl,this.bK)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 faZ:{
-"^":"Ay0;Zs<,re<,KL,VO,tj,Xl,vO",
+"^":"Ay0;Zs<,re<,KL,VO,tj,vt,vO",
 gnK:function(a){var z=this.KL
 return z.gnK(z)},
-MN:function(a){var z,y,x,w
+ux:function(a){var z,y,x,w
 z=this.re
 z.toString
-y=H.VM(new H.A8(z,new K.vQ()),[null,null]).br(0)
-x=this.Zs.gXl()
-if(x==null){this.Xl=null
+y=H.VM(new H.A8(z,new K.BGc()),[null,null]).br(0)
+x=this.Zs.gvt()
+if(x==null){this.vt=null
 return}z=this.KL
 if(z.gnK(z)==null){z=H.eC(x,y,P.Te(null))
-this.Xl=!!J.x(z).$iswS?B.Ha(z,null):z}else{z=z.gnK(z)
-w=$.vu().xV.T4.t(0,z)
-this.Xl=$.cp().Ck(x,w,y,!1,null)
+this.vt=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gnK(z)
+w=$.vu().JE.T4.t(0,z)
+this.vt=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.BGc(this,a,w))}},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.WWJ(this,a,w))}},
 RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.RWc]},
 $isRWc:true,
-$isrx:true},
-vQ:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
-$isEH:true},
+$ishw:true},
 BGc:{
-"^":"TpZ:199;a,b,c",
-$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gvt()},"$1",null,2,0,null,49,"call"],
 $isEH:true},
-ho:{
+WWJ:{
+"^":"TpZ:199;a,b,c",
+$1:[function(a){if(J.VA(a,new K.Kr(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$isEH:true},
+Kr:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-XX:{
+nD:{
 "^":"a;G1>",
 bu:[function(a){return"EvalException: "+this.G1},"$0","gCR",0,0,73],
-static:{zq:function(a){return new K.XX(a)}}}}],["","",,U,{
+static:{du:function(a){return new K.nD(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -17415,58 +17503,58 @@
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
 if(!J.xC(y,b[z]))return!1}return!0},
-N4:function(a){a.toString
-return U.Le(H.n3(a,0,new U.lc()))},
+pz:function(a){a.toString
+return U.OT(H.n3(a,0,new U.lc()))},
 C0C:function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-Le:function(a){if(typeof a!=="number")return H.s(a)
+OT: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)},
-Fs:{
+tu:{
 "^":"a;",
 Bf:[function(a,b,c){return new U.vn(b,c)},"$2","gvH",4,0,200,2,49]},
-rx:{
+hw:{
 "^":"a;",
-$isrx:true},
-WH:{
-"^":"rx;",
+$ishw:true},
+EO:{
+"^":"hw;",
 RR:function(a,b){return b.W9(this)},
-$isWH:true},
-noG:{
-"^":"rx;P>",
-RR:function(a,b){return b.I6W(this)},
+$isEO:true},
+Dv:{
+"^":"hw;P>",
+RR:function(a,b){return b.la(this)},
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
-z=H.RB(b,"$isnoG",[H.u3(this,0)],"$asnoG")
+z=H.RB(b,"$isDv",[H.u3(this,0)],"$asDv")
 return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isnoG:true},
-c0:{
-"^":"rx;Bx<",
+$isDv:true},
+c09:{
+"^":"hw;lm<",
 RR:function(a,b){return b.Zh(this)},
-bu:[function(a){return H.d(this.Bx)},"$0","gCR",0,0,73],
+bu:[function(a){return H.d(this.lm)},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc0&&U.Pu(b.gBx(),this.Bx)},
-giO:function(a){return U.N4(this.Bx)},
-$isc0:true},
+return!!J.x(b).$isc09&&U.Pu(b.glm(),this.lm)},
+giO:function(a){return U.pz(this.lm)},
+$isc09:true},
 Mm:{
-"^":"rx;Rl>",
+"^":"hw;Jq>",
 RR:function(a,b){return b.o0(this)},
-bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gCR",0,0,73],
+bu:[function(a){return"{"+H.d(this.Jq)+"}"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isMm&&U.Pu(z.gRl(b),this.Rl)},
-giO:function(a){return U.N4(this.Rl)},
+return!!z.$isMm&&U.Pu(z.gJq(b),this.Jq)},
+giO:function(a){return U.pz(this.Jq)},
 $isMm:true},
 nu:{
-"^":"rx;nl>,v4<",
+"^":"hw;nl>,v4<",
 RR:function(a,b){return b.YV(this)},
 bu:[function(a){return this.nl.bu(0)+": "+H.d(this.v4)},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17476,18 +17564,18 @@
 giO:function(a){var z,y
 z=J.v1(this.nl.P)
 y=J.v1(this.v4)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isnu:true},
 XC:{
-"^":"rx;o2",
+"^":"hw;ep",
 RR:function(a,b){return b.Hs(this)},
-bu:[function(a){return"("+H.d(this.o2)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"("+H.d(this.ep)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.xC(b.o2,this.o2)},
-giO:function(a){return J.v1(this.o2)},
+return!!J.x(b).$isXC&&J.xC(b.ep,this.ep)},
+giO:function(a){return J.v1(this.ep)},
 $isXC:true},
 fp:{
-"^":"rx;P>",
+"^":"hw;P>",
 RR:function(a,b){return b.qv(this)},
 bu:[function(a){return this.P},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17497,20 +17585,20 @@
 giO:function(a){return J.v1(this.P)},
 $isfp:true},
 FH:{
-"^":"rx;xS>,o2<",
-RR:function(a,b){return b.kb(this)},
-bu:[function(a){return H.d(this.xS)+" "+H.d(this.o2)},"$0","gCR",0,0,73],
+"^":"hw;xS>,ep<",
+RR:function(a,b){return b.zPR(this)},
+bu:[function(a){return H.d(this.xS)+" "+H.d(this.ep)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.go2(),this.o2)},
+return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.gep(),this.ep)},
 giO:function(a){var z,y
 z=J.v1(this.xS)
-y=J.v1(this.o2)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+y=J.v1(this.ep)
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isFH:true},
 uku:{
-"^":"rx;xS>,Bb>,T8>",
+"^":"hw;xS>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17521,23 +17609,23 @@
 z=J.v1(this.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
 x06:{
-"^":"rx;dc<,av<,eE<",
+"^":"hw;dc<,av<,Hy<",
 RR:function(a,b){return b.RD(this)},
-bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.eE)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.Hy)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isx06&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.geE(),this.eE)},
+return!!J.x(b).$isx06&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.gHy(),this.Hy)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
 y=J.v1(this.av)
-x=J.v1(this.eE)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+x=J.v1(this.Hy)
+return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isx06:true},
 X7S:{
-"^":"rx;Bb>,T8>",
-RR:function(a,b){return b.ky(this)},
+"^":"hw;Bb>,T8>",
+RR:function(a,b){return b.kz(this)},
 gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
@@ -17548,27 +17636,27 @@
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
 $isDI:true},
-Sc:{
-"^":"rx;Bb>,T8>",
-RR:function(a,b){return b.eS(this)},
+NM:{
+"^":"hw;Bb>,T8>",
+RR:function(a,b){return b.pg(this)},
 gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
 bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isSc&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
+return!!J.x(b).$isNM&&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))},
-$isSc:true,
+return U.OT(U.C0C(U.C0C(0,z),y))},
+$isNM:true,
 $isDI:true},
 vn:{
-"^":"rx;Zs<,mU<",
+"^":"hw;Zs<,mU<",
 RR:function(a,b){return b.CU(this)},
 bu:[function(a){return H.d(this.Zs)+"["+H.d(this.mU)+"]"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
@@ -17576,10 +17664,10 @@
 giO:function(a){var z,y
 z=J.v1(this.Zs)
 y=J.v1(this.mU)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isvn:true},
 x9:{
-"^":"rx;Zs<,oc>",
+"^":"hw;Zs<,oc>",
 RR:function(a,b){return b.Ci(this)},
 bu:[function(a){return H.d(this.Zs)+"."+H.d(this.oc)},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17589,10 +17677,10 @@
 giO:function(a){var z,y
 z=J.v1(this.Zs)
 y=J.v1(this.oc)
-return U.Le(U.C0C(U.C0C(0,z),y))},
+return U.OT(U.C0C(U.C0C(0,z),y))},
 $isx9:true},
 RWc:{
-"^":"rx;Zs<,nK>,re<",
+"^":"hw;Zs<,nK>,re<",
 RR:function(a,b){return b.Y7(this)},
 bu:[function(a){return H.d(this.Zs)+"."+H.d(this.nK)+"("+H.d(this.re)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17602,8 +17690,8 @@
 giO:function(a){var z,y,x
 z=J.v1(this.Zs)
 y=J.v1(this.nK)
-x=U.N4(this.re)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+x=U.pz(this.re)
+return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isRWc:true},
 lc:{
 "^":"TpZ:81;",
@@ -17612,68 +17700,57 @@
 "^":"",
 FX:{
 "^":"a;Wi,f7,JR,V6",
-gVd:function(){return this.V6.Ff},
+gVd:function(){return this.V6.lo},
 oK:function(){var z=this.f7.zl()
 this.JR=z
 this.V6=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])
 this.jz()
 return this.VK()},
 Jn:function(a,b){var z
-if(a!=null){z=this.V6.Ff
+if(a!=null){z=this.V6.lo
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.V6.Ff
+if(!z)if(b!=null){z=this.V6.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.gVd())))
 this.V6.G()},
 jz:function(){return this.Jn(null,null)},
 IH:function(a){return this.Jn(a,null)},
-VK:function(){if(this.V6.Ff==null){this.Wi.toString
-return C.x4}var z=this.ZR()
-return z==null?null:this.Ay(z,0)},
-Ay:function(a,b){var z,y,x,w,v,u
-for(;z=this.V6.Ff,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.Ff),"(")){y=this.Hr()
-this.Wi.toString
-a=new U.RWc(a,null,y)}else if(J.xC(J.Vm(this.V6.Ff),"[")){x=this.le()
-this.Wi.toString
-a=new U.vn(a,x)}else break
-else if(J.xC(J.Iz(this.V6.Ff),3)){this.jz()
-a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.Ff),10))if(J.xC(J.Vm(this.V6.Ff),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
+VK:function(){if(this.V6.lo==null)return C.OL
+var z=this.ZR()
+return z==null?null:this.lM(z,0)},
+lM:function(a,b){var z,y,x
+for(;z=this.V6.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.lo),"("))a=new U.RWc(a,null,this.Hr())
+else if(J.xC(J.Vm(this.V6.lo),"["))a=new U.vn(a,this.FD())
+else break
+else if(J.xC(J.Iz(this.V6.lo),3)){this.jz()
+a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.lo),10))if(J.xC(J.Vm(this.V6.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
 this.jz()
-w=this.VK()
-this.Wi.toString
-a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.V6.Ff),"as")){this.jz()
-w=this.VK()
-if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.Wi.toString
-a=new U.Sc(a,w)}else break
-else{if(J.xC(J.Iz(this.V6.Ff),8)){z=this.V6.Ff.gG8()
+a=new U.X7S(a,this.VK())}else if(J.xC(J.Vm(this.V6.lo),"as")){this.jz()
+y=this.VK()
+if(!J.x(y).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
+a=new U.NM(a,y)}else break
+else{if(J.xC(J.Iz(this.V6.lo),8)){z=this.V6.lo.gG8()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.V6.Ff),"?")){this.Jn(8,"?")
-v=this.VK()
+if(z)if(J.xC(J.Vm(this.V6.lo),"?")){this.Jn(8,"?")
+x=this.VK()
 this.IH(5)
-u=this.VK()
-this.Wi.toString
-a=new U.x06(a,v,u)}else a=this.Ax(a)
+a=new U.x06(a,x,this.VK())}else a=this.Ax(a)
 else break}return a},
-JuP:function(a,b){var z,y
-z=J.x(b)
-if(!!z.$isfp){z=z.gP(b)
-this.Wi.toString
-return new U.x9(a,z)}else if(!!z.$isRWc&&!!J.x(b.gZs()).$isfp){z=J.Vm(b.gZs())
-y=b.gre()
-this.Wi.toString
-return new U.RWc(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
+JuP:function(a,b){var z=J.x(b)
+if(!!z.$isfp)return new U.x9(a,z.gP(b))
+else if(!!z.$isRWc&&!!J.x(b.gZs()).$isfp)return new U.RWc(a,J.Vm(b.gZs()),b.gre())
+else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 Ax:function(a){var z,y,x,w,v
-z=this.V6.Ff
+z=this.V6.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.jz()
 x=this.ZR()
-while(!0){w=this.V6.Ff
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.Ff),3)||J.xC(J.Iz(this.V6.Ff),9)){w=this.V6.Ff.gG8()
+while(!0){w=this.V6.lo
+if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.lo),3)||J.xC(J.Iz(this.V6.lo),9)){w=this.V6.lo.gG8()
 v=z.gG8()
 if(typeof w!=="number")return w.D()
 if(typeof v!=="number")return H.s(v)
@@ -17681,178 +17758,150 @@
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.Ay(x,this.V6.Ff.gG8())}y=y.gP(z)
-this.Wi.toString
-return new U.uku(y,a,x)},
-ZR:function(){var z,y,x,w
-if(J.xC(J.Iz(this.V6.Ff),8)){z=J.Vm(this.V6.Ff)
+x=this.lM(x,this.V6.lo.gG8())}return new U.uku(y.gP(z),a,x)},
+ZR:function(){var z,y
+if(J.xC(J.Iz(this.V6.lo),8)){z=J.Vm(this.V6.lo)
 y=J.x(z)
 if(y.n(z,"+")||y.n(z,"-")){this.jz()
-if(J.xC(J.Iz(this.V6.Ff),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.V6.Ff)),null,null)
-this.Wi.toString
-z=new U.noG(y)
+if(J.xC(J.Iz(this.V6.lo),6)){z=new U.Dv(H.BU(H.d(z)+H.d(J.Vm(this.V6.lo)),null,null))
 z.$builtinTypeInfo=[null]
 this.jz()
-return z}else{y=this.Wi
-if(J.xC(J.Iz(this.V6.Ff),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.V6.Ff)),null)
-y.toString
-z=new U.noG(x)
+return z}else if(J.xC(J.Iz(this.V6.lo),7)){z=new U.Dv(H.RR(H.d(z)+H.d(J.Vm(this.V6.lo)),null))
 z.$builtinTypeInfo=[null]
 this.jz()
-return z}else{w=this.Ay(this.LE(),11)
-y.toString
-return new U.FH(z,w)}}}else if(y.n(z,"!")){this.jz()
-w=this.Ay(this.LE(),11)
-this.Wi.toString
-return new U.FH(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
+return z}else return new U.FH(z,this.lM(this.LE(),11))}else if(y.n(z,"!")){this.jz()
+return new U.FH(z,this.lM(this.LE(),11))}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
 LE:function(){var z,y
-switch(J.Iz(this.V6.Ff)){case 10:z=J.Vm(this.V6.Ff)
+switch(J.Iz(this.V6.lo)){case 10:z=J.Vm(this.V6.lo)
 if(J.xC(z,"this")){this.jz()
-this.Wi.toString
 return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
 case 2:return this.Yj()
 case 1:return this.Dy()
 case 6:return this.c9()
 case 7:return this.eD()
-case 9:if(J.xC(J.Vm(this.V6.Ff),"(")){this.jz()
+case 9:if(J.xC(J.Vm(this.V6.lo),"(")){this.jz()
 y=this.VK()
 this.Jn(9,")")
-this.Wi.toString
-return new U.XC(y)}else if(J.xC(J.Vm(this.V6.Ff),"{"))return this.hR()
-else if(J.xC(J.Vm(this.V6.Ff),"["))return this.U3()
+return new U.XC(y)}else if(J.xC(J.Vm(this.V6.lo),"{"))return this.I1()
+else if(J.xC(J.Vm(this.V6.lo),"["))return this.U3()
 return
 case 5:throw H.b(Y.RV("unexpected token \":\""))
 default:return}},
 U3:function(){var z,y
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"]"))break
+if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),"]"))break
 z.push(this.VK())
-y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
+y=this.V6.lo}while(y!=null&&J.xC(J.Vm(y),","))
 this.Jn(9,"]")
-return new U.c0(z)},
-hR:function(){var z,y,x
+return new U.c09(z)},
+I1:function(){var z,y,x
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"}"))break
-y=J.Vm(this.V6.Ff)
-this.Wi.toString
-x=new U.noG(y)
-x.$builtinTypeInfo=[null]
+if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),"}"))break
+y=new U.Dv(J.Vm(this.V6.lo))
+y.$builtinTypeInfo=[null]
 this.jz()
 this.Jn(5,":")
-z.push(new U.nu(x,this.VK()))
-y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
+z.push(new U.nu(y,this.VK()))
+x=this.V6.lo}while(x!=null&&J.xC(J.Vm(x),","))
 this.Jn(9,"}")
 return new U.Mm(z)},
 Yj:function(){var z,y,x
-if(J.xC(J.Vm(this.V6.Ff),"true")){this.jz()
-this.Wi.toString
-return H.VM(new U.noG(!0),[null])}if(J.xC(J.Vm(this.V6.Ff),"false")){this.jz()
-this.Wi.toString
-return H.VM(new U.noG(!1),[null])}if(J.xC(J.Vm(this.V6.Ff),"null")){this.jz()
-this.Wi.toString
-return H.VM(new U.noG(null),[null])}if(!J.xC(J.Iz(this.V6.Ff),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
-z=J.Vm(this.V6.Ff)
+if(J.xC(J.Vm(this.V6.lo),"true")){this.jz()
+return H.VM(new U.Dv(!0),[null])}if(J.xC(J.Vm(this.V6.lo),"false")){this.jz()
+return H.VM(new U.Dv(!1),[null])}if(J.xC(J.Vm(this.V6.lo),"null")){this.jz()
+return H.VM(new U.Dv(null),[null])}if(!J.xC(J.Iz(this.V6.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
+z=J.Vm(this.V6.lo)
 this.jz()
-this.Wi.toString
 y=new U.fp(z)
 x=this.Hr()
 if(x==null)return y
 else return new U.RWc(y,null,x)},
 Hr:function(){var z,y
-z=this.V6.Ff
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"(")){y=[]
+z=this.V6.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.lo),"(")){y=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),")"))break
+if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),")"))break
 y.push(this.VK())
-z=this.V6.Ff}while(z!=null&&J.xC(J.Vm(z),","))
+z=this.V6.lo}while(z!=null&&J.xC(J.Vm(z),","))
 this.Jn(9,")")
 return y}return},
-le:function(){var z,y
-z=this.V6.Ff
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"[")){this.jz()
+FD:function(){var z,y
+z=this.V6.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.lo),"[")){this.jz()
 y=this.VK()
 this.Jn(9,"]")
 return y}return},
-Dy:function(){var z,y
-z=J.Vm(this.V6.Ff)
-this.Wi.toString
-y=H.VM(new U.noG(z),[null])
+Dy:function(){var z=H.VM(new U.Dv(J.Vm(this.V6.lo)),[null])
 this.jz()
-return y},
-Rb:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.V6.Ff)),null,null)
-this.Wi.toString
-y=H.VM(new U.noG(z),[null])
+return z},
+Rb:function(a){var z=H.VM(new U.Dv(H.BU(H.d(a)+H.d(J.Vm(this.V6.lo)),null,null)),[null])
 this.jz()
-return y},
+return z},
 c9:function(){return this.Rb("")},
-XO:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.V6.Ff)),null)
-this.Wi.toString
-y=H.VM(new U.noG(z),[null])
+XO:function(a){var z=H.VM(new U.Dv(H.RR(H.d(a)+H.d(J.Vm(this.V6.lo)),null)),[null])
 this.jz()
-return y},
+return z},
 eD:function(){return this.XO("")},
-static:{OD:function(a,b){var z,y,x
-z=H.VM([],[Y.qS])
+static:{eHj:function(a,b){var z,y,x
+z=H.VM([],[Y.PnY])
 y=P.p9("")
-x=new U.Fs()
-return new T.FX(x,new Y.dd(z,y,new P.ysG(a,0,0,null),null),null,null)}}}}],["","",,K,{
+x=new U.tu()
+return new T.FX(x,new Y.hc6(z,y,new P.Kg(a,0,0,null),null),null,null)}}}}],["","",,K,{
 "^":"",
-eq:[function(a){return H.VM(new K.Bt(a),[null])},"$1","FLA",2,0,70,71],
-Aep:{
+Dce:[function(a){return H.VM(new K.Bt(a),[null])},"$1","HZg",2,0,70,71],
+O1:{
 "^":"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)},
+return!!J.x(b).$isO1&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
 giO:function(a){return J.v1(this.P)},
 bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gCR",0,0,73],
-$isAep:true},
+$isO1:true},
 Bt:{
-"^":"mW;FD",
-gA:function(a){var z=new K.vR(J.mY(this.FD),0,null)
+"^":"mW;ty",
+gA:function(a){var z=new K.kd(J.mY(this.ty),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.FD)},
-gl0:function(a){return J.FN(this.FD)},
-gqG:function(a){var z=new K.Aep(0,J.bT(this.FD))
+gB:function(a){return J.q8(this.ty)},
+gl0:function(a){return J.FN(this.ty)},
+gtH:function(a){var z=new K.O1(0,J.Es(this.ty))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 grZ:function(a){var z,y
-z=this.FD
+z=this.ty
 y=J.U6(z)
-z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
+z=new K.O1(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:{
+$asmW:function(a){return[[K.O1,a]]},
+$asQV:function(a){return[[K.O1,a]]}},
+kd:{
 "^":"Anv;FU,vk,Uh",
 gl:function(){return this.Uh},
 G:function(){var z=this.FU
-if(z.G()){this.Uh=H.VM(new K.Aep(this.vk++,z.gl()),[null])
+if(z.G()){this.Uh=H.VM(new K.O1(this.vk++,z.gl()),[null])
 return!0}this.Uh=null
 return!1},
-$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
+$asAnv:function(a){return[[K.O1,a]]}}}],["","",,Y,{
 "^":"",
-wX:function(a){switch(a){case 102:return 12
+Ox: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:{
+PnY:{
 "^":"a;fY>,P>,G8<",
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gCR",0,0,73],
-$isqS:true},
-dd:{
-"^":"a;dE,Lz,Te,x0",
+bu:[function(a){return"("+this.fY+", '"+H.d(this.P)+"')"},"$0","gCR",0,0,73],
+$isPnY:true},
+hc6:{
+"^":"a;Bv,Lz,LP,pV",
 zl:function(){var z,y,x,w,v,u,t,s
-z=this.Te
-this.x0=z.G()?z.ft:null
-for(y=this.dE;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.ft:null
+z=this.LP
+this.pV=z.G()?z.ft:null
+for(y=this.Bv;x=this.pV,x!=null;)if(x===32||x===9||x===160)this.pV=z.G()?z.ft:null
 else if(x===34||x===39)this.DS()
 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
@@ -17860,44 +17909,45 @@
 if(w)this.y3()
 else if(48<=x&&x<=57)this.jj()
 else if(x===46){x=z.G()?z.ft:null
-this.x0=x
+this.pV=x
 if(typeof x!=="number")return H.s(x)
 if(48<=x&&x<=57)this.e1()
-else y.push(new Y.qS(3,".",11))}else if(x===44){this.x0=z.G()?z.ft:null
-y.push(new Y.qS(4,",",0))}else if(x===58){this.x0=z.G()?z.ft:null
-y.push(new Y.qS(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.x0
+else y.push(new Y.PnY(3,".",11))}else if(x===44){this.pV=z.G()?z.ft:null
+y.push(new Y.PnY(4,",",0))}else if(x===58){this.pV=z.G()?z.ft:null
+y.push(new Y.PnY(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.pV
 x=z.G()?z.ft:null
-this.x0=x
-if(C.Nm.tg(C.bg,x)){x=this.x0
-u=H.eT([v,x])
+this.pV=x
+if(C.Nm.tg(C.bg,x)){x=this.pV
+u=H.LY([v,x])
 if(C.Nm.tg(C.ip,u)){x=z.G()?z.ft:null
-this.x0=x
+this.pV=x
 if(x===61)x=v===33||v===61
 else x=!1
 if(x){t=u+"="
-this.x0=z.G()?z.ft:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
-y.push(new Y.qS(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.mx(this.x0)
-y.push(new Y.qS(9,s,C.w0.t(0,s)))
-this.x0=z.G()?z.ft:null}else this.x0=z.G()?z.ft:null}return y},
+this.pV=z.G()?z.ft:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
+y.push(new Y.PnY(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.ML,this.pV)){s=H.mx(this.pV)
+y.push(new Y.PnY(9,s,C.w0.t(0,s)))
+this.pV=z.G()?z.ft:null}else this.pV=z.G()?z.ft:null}return y},
 DS:function(){var z,y,x,w
-z=this.x0
-y=this.Te
+z=this.pV
+y=this.LP
 x=y.G()?y.ft:null
-this.x0=x
+this.pV=x
 for(w=this.Lz;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
 if(x===92){x=y.G()?y.ft:null
-this.x0=x
+this.pV=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.mx(Y.wX(x))
+x=H.mx(Y.Ox(x))
 w.IN+=x}else{x=H.mx(x)
 w.IN+=x}x=y.G()?y.ft:null
-this.x0=x}this.dE.push(new Y.qS(1,w.IN,0))
+this.pV=x}x=w.IN
+this.Bv.push(new Y.PnY(1,x.charCodeAt(0)==0?x:x,0))
 w.IN=""
-this.x0=y.G()?y.ft:null},
+this.pV=y.G()?y.ft:null},
 y3:function(){var z,y,x,w,v
-z=this.Te
+z=this.LP
 y=this.Lz
-while(!0){x=this.x0
+while(!0){x=this.pV
 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
@@ -17905,42 +17955,45 @@
 if(!w)break
 x=H.mx(x)
 y.IN+=x
-this.x0=z.G()?z.ft:null}v=y.IN
-z=this.dE
-if(C.Nm.tg(C.jY,v))z.push(new Y.qS(10,v,0))
-else z.push(new Y.qS(2,v,0))
+this.pV=z.G()?z.ft:null}z=y.IN
+v=z.charCodeAt(0)==0?z:z
+z=this.Bv
+if(C.Nm.tg(C.jY,v))z.push(new Y.PnY(10,v,0))
+else z.push(new Y.PnY(2,v,0))
 y.IN=""},
 jj:function(){var z,y,x,w
-z=this.Te
+z=this.LP
 y=this.Lz
-while(!0){x=this.x0
+while(!0){x=this.pV
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
 y.IN+=x
-this.x0=z.G()?z.ft:null}if(x===46){z=z.G()?z.ft:null
-this.x0=z
+this.pV=z.G()?z.ft:null}if(x===46){z=z.G()?z.ft:null
+this.pV=z
 if(typeof z!=="number")return H.s(z)
 if(48<=z&&z<=57)this.e1()
-else this.dE.push(new Y.qS(3,".",11))}else{this.dE.push(new Y.qS(6,y.IN,0))
+else this.Bv.push(new Y.PnY(3,".",11))}else{z=y.IN
+this.Bv.push(new Y.PnY(6,z.charCodeAt(0)==0?z:z,0))
 y.IN=""}},
 e1:function(){var z,y,x,w
 z=this.Lz
 z.KF(H.mx(46))
-y=this.Te
-while(!0){x=this.x0
+y=this.LP
+while(!0){x=this.pV
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
 z.IN+=x
-this.x0=y.G()?y.ft:null}this.dE.push(new Y.qS(7,z.IN,0))
+this.pV=y.G()?y.ft:null}y=z.IN
+this.Bv.push(new Y.PnY(7,y.charCodeAt(0)==0?y:y,0))
 z.IN=""}},
-hAN:{
+Em:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"$0","gCR",0,0,73],
-static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
+static:{RV:function(a){return new Y.Em(a)}}}}],["","",,S,{
 "^":"",
 P55:{
 "^":"a;",
@@ -17949,7 +18002,7 @@
 "^":"P55;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-Hs:function(a){a.o2.RR(0,this)
+Hs:function(a){a.ep.RR(0,this)
 this.xn(a)},
 Ci:function(a){J.okV(a.gZs(),this)
 this.xn(a)},
@@ -17958,14 +18011,14 @@
 this.xn(a)},
 Y7:function(a){var z
 J.okV(a.gZs(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-I6W:function(a){this.xn(a)},
+la:function(a){this.xn(a)},
 Zh:function(a){var z
-for(z=a.gBx(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
+for(z=a.glm(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(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.u3(z,0)]);z.G();)J.okV(z.Ff,this)
+for(z=a.gJq(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 YV:function(a){J.okV(a.gnl(a),this)
 J.okV(a.gv4(),this)
@@ -17974,31 +18027,31 @@
 ex:function(a){J.okV(a.gBb(a),this)
 J.okV(a.gT8(a),this)
 this.xn(a)},
-kb:function(a){J.okV(a.go2(),this)
+zPR:function(a){J.okV(a.gep(),this)
 this.xn(a)},
 RD:function(a){J.okV(a.gdc(),this)
 J.okV(a.gav(),this)
-J.okV(a.geE(),this)
+J.okV(a.gHy(),this)
 this.xn(a)},
-ky:function(a){a.Bb.RR(0,this)
+kz:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
-eS:function(a){a.Bb.RR(0,this)
+pg:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V53;Ny,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gtu:function(a){return a.Ny},
-stu:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
+"^":"V54;oX,t7,fI,Fd,hX,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gtu:function(a){return a.oX},
+stu:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
 gfg:function(a){return a.t7},
 sfg:function(a,b){a.t7=this.ct(a,C.A7,a.t7,b)},
-gGV:function(a){return a.fI},
-sGV:function(a,b){a.fI=this.ct(a,C.vY,a.fI,b)},
+gX7:function(a){return a.fI},
+sX7:function(a,b){a.fI=this.ct(a,C.vY,a.fI,b)},
 gLf:function(a){return a.Fd},
 sLf:function(a,b){a.Fd=this.ct(a,C.IT,a.Fd,b)},
-gMl:function(a){return a.cI},
-sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,b)},
+gJb:function(a){return a.hX},
+sJb:function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},
 gML:function(a){return a.He},
 sML:function(a,b){a.He=this.ct(a,C.kI,a.He,b)},
 gxT:function(a){return a.xo},
@@ -18009,45 +18062,45 @@
 sTj:function(a,b){a.PZ=this.ct(a,C.uG,a.PZ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
-W7:function(a){var z,y
+qV:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
+vr:function(a){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
 else z.scrollIntoView()}},
-qA:[function(a,b,c){this.W7(a)},"$2","giH",4,0,202,203,204],
+pLm:[function(a,b,c){this.vr(a)},"$2","gcL",4,0,202,203,204],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
-if(z!=null){y=W.Ws(this.giH(a))
+if(z!=null){y=W.Ws(this.gcL(a))
 a.Nf=y
 C.S2.OT(y,z,!0)}},
-Lx:function(a){var z=a.Nf
+dQ:function(a){var z=a.Nf
 if(z!=null){z.disconnect()
-a.Nf=null}Z.uL.prototype.Lx.call(this,a)},
+a.Nf=null}Z.uL.prototype.dQ.call(this,a)},
 mN:[function(a,b){this.Um(a)
-this.W7(a)},"$1","goL",2,0,19,59],
-KC:[function(a,b){this.Um(a)},"$1","giB",2,0,19,59],
-Ti:[function(a,b){this.Um(a)},"$1","gP3",2,0,19,59],
+this.vr(a)},"$1","goL",2,0,19,59],
+Yo:[function(a,b){this.Um(a)},"$1","gLe",2,0,19,59],
+Ti:[function(a,b){this.Um(a)},"$1","gRq",2,0,19,59],
 Vj:[function(a,b){this.Um(a)},"$1","gcY",2,0,19,59],
 Um:function(a){var z,y,x
 a.PZ=this.ct(a,C.uG,a.PZ,!1)
 if(a.D6!=null)return
-z=a.Ny
+z=a.oX
 if(z==null)return
-if(J.iS(z)!==!0){a.D6=J.SK(a.Ny).ml(new T.Es(a))
+if(J.iS(z)!==!0){a.D6=J.SK(a.oX).ml(new T.oEe(a))
 return}z=a.Fd
-z=z!=null?a.Ny.q6(z):1
+z=z!=null?a.oX.q6(z):1
 a.xo=this.ct(a,C.nt,a.xo,z)
 z=a.fI
-z=z!=null?a.Ny.q6(z):null
+z=z!=null?a.oX.q6(z):null
 a.He=this.ct(a,C.kI,a.He,z)
-z=a.cI
-y=a.Ny
+z=a.hX
+y=a.oX
 z=z!=null?y.q6(z):J.q8(J.de(y))
 a.ZJ=this.ct(a,C.vs,a.ZJ,z)
-J.Z8(a.Kf)
-for(x=J.bI(a.xo,1);z=J.Wx(x),z.E(x,J.bI(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),x))
+J.U2(a.Kf)
+for(x=J.bI(a.xo,1);z=J.Wx(x),z.E(x,J.bI(a.ZJ,1));x=z.g(x,1))J.dH(a.Kf,J.UQ(J.de(a.oX),x))
 a.PZ=this.ct(a,C.uG,a.PZ,!0)},
 static:{Zz:function(a){var z,y,x,w,v
 z=R.tB([])
@@ -18059,27 +18112,27 @@
 a.t7=null
 a.PZ=!1
 a.Kf=z
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.za.LX(a)
-C.za.XI(a)
+C.vy.LX(a)
+C.vy.XI(a)
 return a}}},
-V53:{
+V54:{
 "^":"uL+Pi;",
 $isd3:true},
-Es:{
+oEe:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.Ny)===!0){z.D6=null
-J.XP(z)}},"$1",null,2,0,null,13,"call"],
+if(J.iS(z.oX)===!0){z.D6=null
+J.TR(z)}},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vr:{
-"^":"V54;X9,pL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V55;X9,pL,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRd:function(a){return a.X9},
 sRd:function(a,b){a.X9=this.ct(a,C.VI,a.X9,b)},
 gO9:function(a){return a.pL},
@@ -18090,8 +18143,8 @@
 a.pL=this.ct(a,C.S4,z,!0)
 z=a.X9.gqr()
 y=a.X9
-if(z==null)J.aT(J.zE(y)).G5(J.zE(a.X9),J.f2(a.X9)).ml(new T.eE(a))
-else J.aT(J.zE(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
+if(z==null)J.wg(J.fx(y)).PI(J.fx(a.X9),J.f2(a.X9)).ml(new T.eE(a))
+else J.wg(J.fx(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
 static:{aed:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18099,7 +18152,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.pL=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -18109,28 +18162,28 @@
 C.FC.LX(a)
 C.FC.XI(a)
 return a}}},
-V54:{
+V55:{
 "^":"uL+Pi;",
 $isd3:true},
 eE:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 b3:{
 "^":"TpZ:12;b",
 $1:[function(a){var z=this.b
-z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["","",,A,{
 "^":"",
 kn:{
-"^":"oEY;jJ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"oEY;jJ,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 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.gTE()},
-fX:[function(a,b){this.at(a,null)},"$1","glD",2,0,19,59],
+return z.gzz()},
+J4:[function(a,b){this.at(a,null)},"$1","gUv",2,0,19,59],
 at:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
 this.ct(a,C.Fh,0,1)}},"$1","gRy",2,0,19,13],
@@ -18151,23 +18204,23 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.jJ=-1
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Wa.LX(a)
-C.Wa.XI(a)
+C.Mh.LX(a)
+C.Mh.XI(a)
 return a}}},
 oEY:{
 "^":"xI+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V55;Uz,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V56;Uz,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtu:function(a){return a.Uz},
 stu:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 Es:function(a){var z
@@ -18176,14 +18229,14 @@
 if(z==null)return
 J.SK(z)},
 pA:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
-static:{TXt:function(a){var z,y,x,w
+Da:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
+static:{Ln:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -18193,34 +18246,33 @@
 C.cJ0.LX(a)
 C.cJ0.XI(a)
 return a}}},
-V55:{
+V56:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,D,{
 "^":"",
-Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","E0",4,0,72],
-dV:function(a){switch(a){case"BoundedType":case"Instance":case"List":case"String":case"Type":case"TypeParameter":case"TypeRef":case"bool":case"double":case"int":case"null":return!0
+Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","Br",4,0,72],
+Ep:function(a){switch(a){case"BoundedType":case"Instance":case"List":case"String":case"Type":case"TypeParameter":case"TypeRef":case"bool":case"double":case"int":case"null":return!0
 default:return!1}},
 rO:function(a){switch(a){case"BoundedType":case"Type":case"TypeParameter":case"TypeRef":return!0
 default:return!1}},
-Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(b==null)return
 z=J.U6(b)
 z=z.t(b,"id")!=null&&z.t(b,"type")!=null
 if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
-y=J.UQ(b,"type")
-z=J.Qe(y)
-if(z.nC(y,"@"))y=z.yn(y,1)
-switch(y){case"Class":z=D.vO
+z=J.U6(b)
+y=z.t(b,"type")
+x=J.Qe(y)
+if(x.nC(y,"@"))y=x.yn(y,1)
+if(z.t(b,"_vmType")!=null){z=z.t(b,"_vmType")
+x=J.Qe(z)
+w=x.nC(z,"@")?x.yn(z,1):z}else w=y
+switch(y){case"Class":z=D.xB
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
 z=D.Kp
-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)
@@ -18230,72 +18282,79 @@
 u.$builtinTypeInfo=[z]
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
-t=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.mT(0,0,null,null),x,w,null,v,u,null,null,a,null,null,null,!1,null,null,null,null,null)
+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.qp(0,0,null,null),new D.qp(0,0,null,null)),new D.Iy(new D.qp(0,0,null,null),new D.qp(0,0,null,null)),new D.qp(0,0,null,null),x,v,null,u,t,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Code":z=[]
 z.$builtinTypeInfo=[D.ta]
 x=[]
 x.$builtinTypeInfo=[D.ta]
-w=D.Q4
-v=[]
-v.$builtinTypeInfo=[w]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[w]
-w=P.KN
-u=D.uA
-s=new V.qC(P.YM(null,null,null,w,u),null,null)
-s.$builtinTypeInfo=[w,u]
-t=new D.kx(null,0,0,0,0,0,z,x,v,s,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,null,!1,null,null,null,null,null)
+v=D.Q4
+u=[]
+u.$builtinTypeInfo=[v]
+u=new Q.wn(null,null,u,null,null)
+u.$builtinTypeInfo=[v]
+v=P.KN
+t=D.uA
+r=new V.qC(P.YM(null,null,null,v,t),null,null)
+r.$builtinTypeInfo=[v,t]
+s=new D.kx(null,0,0,0,0,0,z,x,u,r,"","",null,null,null,!1,!1,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Context":t=new D.lI(null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Context":s=new D.lI(null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Counter":z=D.G9
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-t=new D.YX(!1,null,x,100,null,0,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.YX(!1,null,x,100,null,0,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Error":t=new D.pD(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Error":s=new D.cn(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Function":t=new D.Kp(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Field":s=new D.xB(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+break
+case"Function":s=new D.Kp(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Gauge":z=D.G9
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-t=new D.YX(!1,null,x,100,null,0,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.YX(!1,null,x,100,null,0,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Isolate":z=J.wp(a)
 x=new V.qC(P.YM(null,null,null,null,null),null,null)
 x.$builtinTypeInfo=[null,null]
-w=P.L5(null,null,null,P.qU,D.af)
-v=[]
-v.$builtinTypeInfo=[P.qU]
+v=P.L5(null,null,null,P.qU,D.af)
 u=[]
-u.$builtinTypeInfo=[D.ER]
-s=D.dy
-r=[]
-r.$builtinTypeInfo=[s]
-r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[s]
-s=D.U4
+u.$builtinTypeInfo=[P.qU]
+t=[]
+t.$builtinTypeInfo=[D.ER]
+r=D.dy
 q=[]
-q.$builtinTypeInfo=[s]
+q.$builtinTypeInfo=[r]
 q=new Q.wn(null,null,q,null,null)
-q.$builtinTypeInfo=[s]
-s=P.L5(null,null,null,P.qU,P.Vf)
-s=R.tB(s)
-p=P.qU
-o=D.YX
-n=new V.qC(P.YM(null,null,null,p,o),null,null)
-n.$builtinTypeInfo=[p,o]
-p=P.qU
-o=D.YX
-m=new V.qC(P.YM(null,null,null,p,o),null,null)
-m.$builtinTypeInfo=[p,o]
-t=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,s,new D.Ce(0,0,0,0,0,0,null,null),new D.Ce(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,n,m,null,null,z,null,null,null,!1,null,null,null,null,null)
+q.$builtinTypeInfo=[r]
+r=D.U4
+p=[]
+p.$builtinTypeInfo=[r]
+p=new Q.wn(null,null,p,null,null)
+p.$builtinTypeInfo=[r]
+r=P.L5(null,null,null,P.qU,P.CP)
+r=R.tB(r)
+o=P.qU
+n=D.YX
+m=new V.qC(P.YM(null,null,null,o,n),null,null)
+m.$builtinTypeInfo=[o,n]
+o=P.qU
+n=D.YX
+l=new V.qC(P.YM(null,null,null,o,n),null,null)
+l.$builtinTypeInfo=[o,n]
+s=new D.bv(x,null,!1,!1,!0,!1,v,new D.tL(u,t,null,null,20,0),null,q,null,p,null,null,null,null,null,r,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,m,l,null,null,z,null,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -18303,51 +18362,70 @@
 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
+z=D.dy
 u=[]
 u.$builtinTypeInfo=[z]
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
+z=D.xB
+t=[]
+t.$builtinTypeInfo=[z]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[z]
 z=D.Kp
-s=[]
-s.$builtinTypeInfo=[z]
-s=new Q.wn(null,null,s,null,null)
-s.$builtinTypeInfo=[z]
-t=new D.U4(null,x,w,v,u,s,null,null,a,null,null,null,!1,null,null,null,null,null)
+r=[]
+r.$builtinTypeInfo=[z]
+r=new Q.wn(null,null,r,null,null)
+r.$builtinTypeInfo=[z]
+s=new D.U4(null,x,v,u,t,r,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"ServiceError":t=new D.N7(null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Object":switch(w){case"PcDescriptors":z=D.xb
+x=[]
+x.$builtinTypeInfo=[z]
+x=new Q.wn(null,null,x,null,null)
+x.$builtinTypeInfo=[z]
+s=new D.hn(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
+z=$.oK
+if(z==null)H.qw("created PcDescriptors.")
+else z.$1("created PcDescriptors.")
 break
-case"ServiceEvent":t=new D.Mk(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"LocalVarDescriptors":z=D.br
+x=[]
+x.$builtinTypeInfo=[z]
+x=new Q.wn(null,null,x,null,null)
+x.$builtinTypeInfo=[z]
+s=new D.Mi(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"ServiceException":t=new D.Ix(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"TokenStream":s=new D.Ik(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+break
+default:s=null}break
+case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+break
+case"ServiceEvent":s=new D.Mk(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+break
+case"ServiceException":s=new D.Ix(null,null,null,null,null,a,null,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]
-t=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Socket":t=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-default:if(D.dV(y)||J.xC(y,"Sentinel")){t=new D.uq(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
-break}else{z=new V.qC(P.YM(null,null,null,null,null),null,null)
+default:s=D.Ep(y)||J.xC(y,"Sentinel")?new D.uq(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null):null
+break}if(s==null){z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-t=new D.vO(z,a,null,null,null,!1,null,null,null,null,null)
-break}}t.eC(b)
-return t},
-UW:function(a){if(a.gHh())return
+s=new D.vO(z,a,null,null,null,!1,null,null,null,null,null)}s.eC(b)
+return s},
+vQ:function(a){if(a.gHh())return
 return a},
-bF:function(a){var z
+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},
@@ -18357,7 +18435,7 @@
 else if(!!z.$iswn)D.f3(a,b)},
 Gf:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.XG,y=0;y<z.length;++y){x=z[y]
+for(z=a.xN,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
@@ -18367,39 +18445,39 @@
 else if(v)D.Gf(x,b)}},
 af:{
 "^":"Pi;bN@,GR@",
-gXP:function(){return this.x8},
-gwv:function(a){return J.wp(this.x8)},
-god:function(a){return J.aT(this.x8)},
-gjO:function(a){return this.TU},
+gXP:function(){return this.V0},
+gwv:function(a){return J.wp(this.V0)},
+god:function(a){return J.wg(this.V0)},
+gjO:function(a){return this.r0},
 gt5:function(a){return this.oU},
 gdr:function(){return this.JK},
 glO:function(){return D.rO(this.oU)},
 gFY:function(){return J.xC(this.oU,"bool")},
 gzx:function(){return J.xC(this.oU,"double")},
 gt3:function(){return J.xC(this.oU,"Error")},
-gNs:function(){return D.dV(this.oU)},
-gWL:function(){return J.xC(this.oU,"int")},
+gNs:function(){return D.Ep(this.oU)},
+gSO:function(){return J.xC(this.oU,"int")},
 gK4:function(a){return J.xC(this.oU,"List")},
 gHh:function(){return J.xC(this.oU,"null")},
 gl5:function(){return J.xC(this.oU,"Sentinel")},
 gu7:function(){return J.xC(this.oU,"String")},
-gJE:function(){return J.xC(this.JK,"MirrorReference")},
+gOC:function(){return J.xC(this.JK,"MirrorReference")},
 gl2:function(){return J.xC(this.JK,"WeakProperty")},
 gBF:function(){return!1},
 gXM:function(){return J.xC(this.oU,"Instance")&&!J.xC(this.JK,"MirrorReference")&&!J.xC(this.JK,"WeakProperty")&&!this.gBF()},
-gPj:function(a){return this.x8.YC(this.TU)},
-gox:function(a){return this.qu},
+gPj:function(a){return this.V0.YC(this.r0)},
+gox:function(a){return this.ks},
 gjm:function(){return!1},
 gM8:function(){return!1},
 goc:function(a){return this.gbN()},
 soc:function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},
-gTE:function(){return this.gGR()},
-sTE:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
-xW:function(a){if(this.qu)return P.Ab(this,null)
+gzz:function(){return this.gGR()},
+szz:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
+xW:function(a){if(this.ks)return P.Ab(this,null)
 return this.VD(0)},
 VD:function(a){var z
-if(J.xC(this.TU,""))return P.Ab(this,null)
-if(this.qu&&this.gM8())return P.Ab(this,null)
+if(J.xC(this.r0,""))return P.Ab(this,null)
+if(this.ks&&this.gM8())return P.Ab(this,null)
 z=this.mQ
 if(z==null){z=this.gwv(this).jU(this.gPj(this)).ml(new D.n1(this)).wM(new D.jI(this))
 this.mQ=z}return z},
@@ -18409,13 +18487,13 @@
 x=z.t(a,"type")
 w=J.Qe(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.TU
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.TU=z.t(a,"id")
+w=this.r0
+if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
 this.oU=x
 if(z.NZ(a,"_vmType")===!0){z=z.t(a,"_vmType")
 w=J.Qe(z)
 this.JK=w.nC(z,"@")?w.yn(z,1):z}else this.JK=this.oU
-this.R5(0,a,y)},
+this.bF(0,a,y)},
 YC:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,172,205],
 $isaf:true},
 n1:{
@@ -18425,7 +18503,7 @@
 y=J.Qe(z)
 if(y.nC(z,"@"))z=y.yn(z,1)
 y=this.a
-if(!J.xC(z,y.oU))return D.Nl(y.x8,a)
+if(!J.xC(z,y.oU))return D.Nl(y.gXP(),a)
 y.eC(a)
 return y},"$1",null,2,0,null,206,"call"],
 $isEH:true},
@@ -18435,17 +18513,17 @@
 $isEH:true},
 boh:{
 "^":"a;",
-O5:function(a){J.Me(a,new D.P5(this))},
-lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,208]},
-P5:{
+qe:function(a){J.Me(a,new D.u9(this))},
+lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.TCE(this))},"$0","gDX",0,0,208]},
+u9:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
 z.t(a,"script").lV(z.t(a,"hits"))},"$1",null,2,0,null,209,"call"],
 $isEH:true},
-Rv:{
+TCE:{
 "^":"TpZ:207;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,206,"call"],
+z.qe(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,206,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -18455,27 +18533,27 @@
 god:function(a){return},
 gi2:function(){var z=this.Qi
 return z.gUQ(z)},
-gPj:function(a){return H.d(this.TU)},
+gPj:function(a){return H.d(this.r0)},
 YC:[function(a){return H.d(a)},"$1","gua",2,0,172,205],
 gYe:function(a){return this.Ox},
 gI2:function(){return this.RW},
 gA3:function(){return this.Ts},
 gdW:function(){return this.Va},
-gU6:function(){return this.kU},
-gJW:function(){return this.l7},
+gU6:function(){return this.h7},
+gJW:function(){return this.jA},
 hQ:function(a,b){var z,y,x,w
 z={}
 z.a=null
 try{y=this.hb(a)
 z.a=y
-if(b!=null)J.kW(y,"_data",b)}catch(x){H.Ru(x)
+if(b!=null)J.qQ(y,"_data",b)}catch(x){H.Ru(x)
 N.QM("").YX("Ignoring malformed event message: "+H.d(a))
 return}if(!J.xC(J.UQ(z.a,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
 return}w=J.UQ(J.UQ(z.a,"isolate"),"id")
-this.wD(w).ml(new D.jy(z,this,w))},
+this.wD(w).ml(new D.mT(z,this,w))},
 EM:function(a){return this.hQ(a,null)},
 BC:function(a){var z,y,x,w
-z=$.rc().R4(0,a)
+z=$.r0().R4(0,a)
 if(z==null)return
 y=z.pX
 x=y.input
@@ -18483,9 +18561,9 @@
 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)},
+return C.yo.yn(x,w+y)},
 ZS:function(a){var z,y,x
-z=$.fA().R4(0,a)
+z=$.jN().R4(0,a)
 if(z==null)return""
 y=z.pX
 x=y.index
@@ -18498,42 +18576,42 @@
 if(J.xC(a,""))return P.Ab(null,null)
 z=this.Qi.t(0,a)
 if(z!=null)return P.Ab(z,null)
-return this.VD(0).ml(new D.MZ(this,a))},
+return this.VD(0).ml(new D.wU(this,a))},
 cv:function(a){var z,y,x
 if(J.co(a,"isolates/")){z=this.ZS(a)
 y=this.BC(a)
-return this.wD(z).ml(new D.aEE(this,y))}x=this.uj.t(0,a)
+return this.wD(z).ml(new D.kk(this,y))}x=this.uj.t(0,a)
 if(x!=null)return J.LE(x)
-return this.jU(a).ml(new D.oew(this,a))},
-B5:[function(a,b){return b},"$2","gJ2",4,0,81],
+return this.jU(a).ml(new D.it(this,a))},
+nJ:[function(a,b){return b},"$2","gS6",4,0,81],
 hb:function(a){var z,y,x
 z=null
-try{y=new P.c5(this.gJ2())
-z=P.jc(a,y.gFs())}catch(x){H.Ru(x)
+try{y=new P.Mx(this.gS6())
+z=P.jc(a,y.gJ2())}catch(x){H.Ru(x)
 return}return R.tB(z)},
 OJ:function(a){var z
-if(!D.bF(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
-return P.pz(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
-if(J.xC(z.t(a,"type"),"ServiceError"))return P.pz(D.Nl(this,a),null,null)
-else if(J.xC(z.t(a,"type"),"ServiceException"))return P.pz(D.Nl(this,a),null,null)
+if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.t5(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
+if(J.xC(z.t(a,"type"),"ServiceError"))return P.t5(D.Nl(this,a),null,null)
+else if(J.xC(z.t(a,"type"),"ServiceException"))return P.t5(D.Nl(this,a),null,null)
 return P.Ab(a,null)},
 jU:function(a){return this.z6(0,a).ml(new D.zA(this,a)).pU(new D.tm(this),new D.mR()).pU(new D.hc(this),new D.pa())},
-R5:function(a,b,c){var z,y
+bF:function(a,b,c){var z,y
 if(c)return
-this.qu=!0
+this.ks=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
 y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.US,this.GY,y)
+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)
+this.jA=F.Wi(this,C.GI,this.jA,y)
 y=z.t(b,"assertsEnabled")
 this.Ts=F.Wi(this,C.ET,this.Ts,y)
 y=z.t(b,"pid")
-this.kU=F.Wi(this,C.uI,this.kU,y)
+this.h7=F.Wi(this,C.uI,this.h7,y)
 y=z.t(b,"typeChecksEnabled")
 this.Va=F.Wi(this,C.J2,this.Va,y)
 this.y8(z.t(b,"isolates"))},
@@ -18546,7 +18624,7 @@
 if(u!=null)y.u(0,v,u)
 else{u=D.Nl(this,w)
 y.u(0,v,u)
-N.QM("").To("New isolate '"+H.d(u.TU)+"'")}}y.aN(0,new D.Yu())
+N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Yu())
 this.Qi=y},
 Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
 this.GR=this.ct(this,C.KS,this.GR,"vm")
@@ -18557,7 +18635,7 @@
 O1w:{
 "^":"xm+Pi;",
 $isd3:true},
-jy:{
+mT:{
 "^":"TpZ:12;a,b,c",
 $1:[function(a){var z,y
 if(a==null)N.QM("").YX("Ignoring event with unknown isolate id: "+H.d(this.c))
@@ -18566,12 +18644,12 @@
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(z)}},"$1",null,2,0,null,210,"call"],
 $isEH:true},
-MZ:{
+wU:{
 "^":"TpZ:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
 return this.a.Qi.t(0,this.b)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-aEE:{
+kk:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z
 if(a==null)return this.a
@@ -18579,7 +18657,7 @@
 if(z==null)return J.LE(a)
 else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
-oew:{
+it:{
 "^":"TpZ:207;c,d",
 $1:[function(a){var z,y
 z=this.c
@@ -18596,8 +18674,8 @@
 $1:[function(a){var z,y,x
 z=this.a
 y=z.hb(a)
-x=$.ax
-if(x!=null)x.ab(0,"Received response for "+H.d(this.b),y)
+x=$.hm
+if(x!=null)x.AS(0,"Received response for "+H.d(this.b),y)
 return z.OJ(y)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 tm:{
@@ -18605,7 +18683,7 @@
 $1:[function(a){var z=this.c.G2
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)
-return P.pz(a,null,null)},"$1",null,2,0,null,23,"call"],
+return P.t5(a,null,null)},"$1",null,2,0,null,23,"call"],
 $isEH:true},
 mR:{
 "^":"TpZ:12;",
@@ -18616,7 +18694,7 @@
 $1:[function(a){var z=this.d.Li
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)
-return P.pz(a,null,null)},"$1",null,2,0,null,90,"call"],
+return P.t5(a,null,null)},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 pa:{
 "^":"TpZ:12;",
@@ -18635,7 +18713,7 @@
 v=z[x]
 if(typeof v!=="number")return H.s(v)
 this.jf=w+v}},
-pg:function(a,b){var z,y,x,w,v,u,t
+dS: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])
@@ -18643,7 +18721,7 @@
 t=this.jf
 if(typeof u!=="number")return H.s(u)
 this.jf=t+u}},
-k5:[function(a,b){var z,y,x,w,v,u
+q9:[function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
 y=this.XE
 x=y.length
@@ -18658,13 +18736,13 @@
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,Fw<,u1,Ob,Eq,kL",
+"^":"a;fJ<,Fw<,u1,Ob,Eq,kL",
 gvh:function(){return this.u1},
 Qv:function(a,b){var z,y,x,w,v,u
 this.u1=a
 z=J.U6(b)
 y=z.t(b,"counters")
-x=this.af
+x=this.fJ
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.kL=J.q8(z.t(b,"counters"))
 for(z=this.Eq,x=this.Fw,w=0;w<z;++w){v=this.kL
@@ -18686,23 +18764,23 @@
 z=Array(z)
 z.fixed$length=init
 u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.pg(y,this.Ob.XE)
-this.Ob.k5(0,y)
+u.dS(y,this.Ob.XE)
+this.Ob.q9(0,y)
 z=this.Fw
 z.push(u)
 if(z.length>this.Eq)C.Nm.W4(z,0)}},
-Ce:{
-"^":"Pi;zd,ob,j8,yp,Og,hu,Vg,fn",
-gSU:function(){return this.zd},
-gkV:function(){return this.ob},
+eK:{
+"^":"Pi;Ev,ob,j8,yp,Og,hu,Vg,ij",
+gSU:function(){return this.Ev},
+gbZ:function(){return this.ob},
 gMX:function(){return this.j8},
 gYk:function(){return this.yp},
 gpy:function(){return this.Og},
-gqZ:function(){return this.hu},
+gUH:function(){return this.hu},
 eC:function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"used")
-this.zd=F.Wi(this,C.LP,this.zd,y)
+this.Ev=F.Wi(this,C.LP,this.Ev,y)
 y=z.t(a,"capacity")
 this.ob=F.Wi(this,C.bV,this.ob,y)
 y=z.t(a,"external")
@@ -18714,28 +18792,28 @@
 z=z.t(a,"avgCollectionPeriodMillis")
 this.hu=F.Wi(this,C.BE,this.hu,z)}},
 bv:{
-"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,Q2H,yv,qo<,n5,l9,iD<,hz,pG<,Sn<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gwv:function(a){return this.x8},
+"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,h0,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,SF,Y8,UY<,xQ<,Q2H,yv,qo<,yA,Ac,iD<,hz,pG<,Sn<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gwv:function(a){return this.V0},
 god:function(a){return this},
 gXE:function(a){return this.V3},
 sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.TU)},
+gPj:function(a){return"/"+H.d(this.r0)},
 gBP:function(a){return this.Jr},
-gGL:function(){return this.EY},
+gLd:function(){return this.EY},
 gaj:function(){return this.eU},
 gn0:function(){return this.yP},
-YC:[function(a){return"/"+H.d(this.TU)+"/"+H.d(a)},"$1","gua",2,0,172,205],
-N3:function(a){var z,y,x,w
+YC:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gua",2,0,172,205],
+f9:function(a){var z,y,x,w
 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.I1()
-this.nN(a,z)
+this.Id()
+this.qx(a,z)
 w=y.t(a,"exclusive_trie")
 if(w!=null)this.qo=this.Jm(w,z)},
-I1:function(){var z=this.uj
-z.gUQ(z).aN(0,new D.TV())},
-nN:function(a,b){var z,y,x,w
+Id:function(){var z=this.uj
+z.gUQ(z).aN(0,new D.S0())},
+qx:function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
@@ -18746,17 +18824,17 @@
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","gLG",2,0,213,214],
+if(!!w.$isdy)z.push(w.xW(x))}return P.hz(z,!1)},"$1","gLG",2,0,213,214],
 lKe:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
-this.Wm=F.Wi(this,C.jo,this.Wm,null)
+this.h0=F.Wi(this,C.as,this.h0,null)
 for(y=J.mY(a);y.G();){x=y.gl()
 if(x.gAY()==null)z.h(0,x)
-if(J.xC(x.gTE(),"Object")&&J.xC(x.geh(),!1)){w=this.Wm
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
+if(J.xC(x.gzz(),"Object")&&J.xC(x.geh(),!1)){w=this.h0
+if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.as,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gHB",2,0,215,216],
+this.nq(this,w)}this.h0=x}}return P.Ab(this.h0,null)},"$1","gHB",2,0,215,216],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -18768,25 +18846,25 @@
 return x},
 cv:function(a){var z=this.uj.t(0,a)
 if(z!=null)return J.LE(z)
-return this.x8.jU("/"+H.d(this.TU)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.Wm},
+return this.V0.jU("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gDZ:function(){return this.h0},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
-gvU:function(){return this.tW},
+gpd:function(){return this.tW},
 gkw:function(){return this.zb},
 goc:function(a){return this.KT},
 soc:function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},
-gTE:function(){return this.f5},
-sTE:function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},
+gzz:function(){return this.f5},
+szz:function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},
 gIT:function(){return this.i9},
-gw2:function(){return this.cL},
-sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
+gw2:function(){return this.SF},
+sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
-Bs:function(a){var z=J.U6(a)
+WU:function(a){var z=J.U6(a)
 this.UY.eC(z.t(a,"new"))
 this.xQ.eC(z.t(a,"old"))},
-R5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+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)
@@ -18795,7 +18873,7 @@
 y=z.t(b,"name")
 this.f5=F.Wi(this,C.KS,this.f5,y)
 if(c)return
-this.qu=!0
+this.ks=!0
 this.yP=F.Wi(this,C.DY,this.yP,!1)
 this.Xb()
 D.kT(b,this)
@@ -18803,7 +18881,7 @@
 return}y=z.t(b,"rootLib")
 this.v9=F.Wi(this,C.eN,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
-this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
+this.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)
@@ -18825,13 +18903,13 @@
 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)
+J.qQ(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))
+J.qQ(this.V3,s.t(w,t),C.CD.Sy(J.X9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
+J.Me(z.t(b,"timers"),new D.dn(q))
 y=this.Y8
 s=J.w1(y)
 s.u(y,"total",q.t(0,"time_total_runtime"))
@@ -18839,7 +18917,7 @@
 s.u(y,"gc",0)
 s.u(y,"init",J.WB(J.WB(J.WB(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
 s.u(y,"dart",q.t(0,"time_dart_execution"))
-this.Bs(z.t(b,"heaps"))
+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.iA,s,!0)
@@ -18856,37 +18934,37 @@
 y=this.tW
 y.V1(y)
 y.FV(0,z.t(b,"libraries"))
-y.GT(y,D.E0())},
-xB:function(){return this.x8.jU("/"+H.d(this.TU)+"/profile/tag").ml(new D.O5(this))},
-Jm:function(a,b){this.n5=0
-this.l9=a
+y.GT(y,D.Br())},
+m7:function(){return this.V0.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.O5(this))},
+Jm:function(a,b){this.yA=0
+this.Ac=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.ci(b)},
-ci:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.l9
-y=this.n5
+return this.LB(b)},
+LB:function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.Ac
+y=this.yA
 if(typeof y!=="number")return y.g()
-this.n5=y+1
+this.yA=y+1
 x=J.UQ(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
-y=this.l9
-z=this.n5
+y=this.Ac
+z=this.yA
 if(typeof z!=="number")return z.g()
-this.n5=z+1
+this.yA=z+1
 v=J.UQ(y,z)
 z=[]
-z.$builtinTypeInfo=[D.D5]
-u=new D.D5(w,v,z,0)
-y=this.l9
-t=this.n5
+z.$builtinTypeInfo=[D.TH]
+u=new D.TH(w,v,z,0)
+y=this.Ac
+t=this.yA
 if(typeof t!=="number")return t.g()
-this.n5=t+1
+this.yA=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.ci(a)
+for(;r<s;++r){q=this.LB(a)
 z.push(q)
 y=u.Jv
 t=q.Av
@@ -18917,16 +18995,16 @@
 Xb:function(){var z=this.hz
 if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).wM(new D.Cm(this))
 this.hz=z}return z},
-G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.ad(this,a,b))},
+PI:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.JL(this,a,b))},
 Xu:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
-WJ:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,208],
+zd:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,208],
 QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,208],
-Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,208],
-Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,208],
-h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gZp",0,0,208],
-WO:function(a,b){return this.cv(a).ml(new D.oq(b))},
-VT:function(){return this.WO("metrics",this.pG).ml(new D.y1(this))},
-bu:[function(a){return"Isolate("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
+Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.wX(this))},"$0","gLc",0,0,208],
+PJ:[function(a){return this.cv("debug/resume?step=over").ml(new D.Vd(this))},"$0","gqF",0,0,208],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.pW(this))},"$0","gZp",0,0,208],
+yB:function(a,b){return this.cv(a).ml(new D.oq(b))},
+VT:function(){return this.yB("metrics",this.pG).ml(new D.y1(this))},
+bu:[function(a){return"Isolate("+H.d(this.r0)+")"},"$0","gCR",0,0,73],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
@@ -18934,11 +19012,11 @@
 bvc:{
 "^":"PKX+Pi;",
 $isd3:true},
-TV:{
+S0:{
 "^":"TpZ:12;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.kr,a.xM,0)
+$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.pn=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.rF=F.Wi(a,C.uU,a.rF,"")
 C.Nm.sB(a.VS,0)
@@ -18957,7 +19035,7 @@
 "^":"TpZ:76;c",
 $0:function(){return this.c},
 $isEH:true},
-Qq:{
+dn:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
 this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,217,"call"],
@@ -18983,50 +19061,50 @@
 "^":"TpZ:76;b",
 $0:[function(){this.b.hz=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-ad:{
+JL:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(!!J.x(a).$ispD)J.UQ(J.de(this.b),J.bI(this.c,1)).sj9(!1)
+$1:[function(a){if(!!J.x(a).$iscn)J.UQ(J.de(this.b),J.bI(this.c,1)).sj9(!1)
 return this.a.Xb()},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 fw:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z,y
-if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 z=this.a
 y=z.Jr
-if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.VD(0)
+if(y!=null&&y.gYZ()!=null&&J.xC(J.UQ(z.Jr.gYZ(),"id"),J.UQ(this.b,"id")))return z.VD(0)
 else return z.Xb()},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 G4:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 LO:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-qD:{
+wX:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-A6:{
+Vd:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-xK:{
+pW:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 oq:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x
 z=J.x(a)
-if(!!z.$ispD){N.QM("").YX(a.LD)
+if(!!z.$iscn){N.QM("").YX(a.LD)
 return}y=this.a
 y.V1(0)
 for(z=J.mY(z.t(a,"members"));z.G();){x=z.gl()
@@ -19035,47 +19113,47 @@
 y1:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.WO("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
+return z.yB("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vO:{
-"^":"af;RF,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gjm:function(){return(J.xC(this.oU,"Class")||J.xC(this.oU,"Function")||J.xC(this.oU,"Field"))&&!J.co(this.TU,$.RQ)},
+"^":"af;RF,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gjm:function(){return(J.xC(this.oU,"Class")||J.xC(this.oU,"Function")||J.xC(this.oU,"Field"))&&!J.co(this.r0,$.RQ)},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x
-this.qu=!c
+bF:function(a,b,c){var z,y,x
+this.ks=!c
 z=this.RF
 z.V1(0)
 z.FV(0,b)
-y=z.LL
+y=z.tf
 x=y.t(0,"name")
 this.bN=this.ct(0,C.YS,this.bN,x)
 y=y.NZ(0,"vmName")?y.t(0,"vmName"):this.bN
 this.GR=this.ct(0,C.KS,this.GR,y)
-D.kT(z,this.x8)},
+D.kT(z,this.V0)},
 FV:function(a,b){return this.RF.FV(0,b)},
 V1:function(a){return this.RF.V1(0)},
-NZ:function(a,b){return this.RF.LL.NZ(0,b)},
-aN:function(a,b){return this.RF.LL.aN(0,b)},
+NZ:function(a,b){return this.RF.tf.NZ(0,b)},
+aN:function(a,b){return this.RF.tf.aN(0,b)},
 Rz:function(a,b){return this.RF.Rz(0,b)},
-t:function(a,b){return this.RF.LL.t(0,b)},
+t:function(a,b){return this.RF.tf.t(0,b)},
 u:function(a,b,c){this.RF.u(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.LL
+gl0:function(a){var z=this.RF.tf
 return z.gB(z)===0},
-gor:function(a){var z=this.RF.LL
+gor:function(a){var z=this.RF.tf
 return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.LL
+gvc:function(a){var z=this.RF.tf
 return z.gvc(z)},
-gUQ:function(a){var z=this.RF.LL
+gUQ:function(a){var z=this.RF.tf
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.LL
+gB:function(a){var z=this.RF.tf
 return z.gB(z)},
 HC:[function(a){var z=this.RF
 return z.HC(z)},"$0","gDx",0,0,131],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-w37:[function(a){return},"$0","gcm",0,0,17],
+Tr:[function(a){return},"$0","gcm",0,0,17],
 dt:[function(a){this.RF.Vg=null
 return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
@@ -19085,7 +19163,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-bu:[function(a){return"ServiceMap("+P.vW(this.RF)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"ServiceMap("+H.d(this.RF)+")"},"$0","gCR",0,0,73],
 $isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
@@ -19093,19 +19171,19 @@
 $asT8:function(){return[null,null]},
 $isd3:true,
 static:{"^":"RQ"}},
-pD:{
-"^":"wVq;I0,LD,jo,Ne,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+cn:{
+"^":"wVq;I0,LD,jo,Ne,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-R5:function(a,b,c){var z,y,x
+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.x8
+y=this.V0
 x=D.Nl(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
 z=D.Nl(y,z.t(b,"stacktrace"))
@@ -19115,16 +19193,16 @@
 this.bN=z
 this.GR=this.ct(this,C.KS,this.GR,z)},
 bu:[function(a){return"DartError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
-$ispD:true},
+$iscn:true},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"dZL;I0,LD,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"dZL;I0,LD,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
-R5:function(a,b,c){var z,y
-this.qu=!0
+bF:function(a,b,c){var z,y
+this.ks=!0
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -19140,11 +19218,11 @@
 "^":"af+Pi;",
 $isd3:true},
 Ix:{
-"^":"w8F;I0,LD,IV,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w8F;I0,LD,IV,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gn9:function(a){return this.IV},
-R5:function(a,b,c){var z,y
+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)
@@ -19156,20 +19234,21 @@
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
 this.GR=this.ct(this,C.KS,this.GR,z)},
+bu:[function(a){return"ServiceException("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
 $isIx:true},
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
 Mk:{
-"^":"V4b;eq,HQ,jo,ZK,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"V4b;eq,NH,jo,ZK,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfG:function(a){return this.eq},
-gQ1:function(){return this.HQ},
+gYZ:function(){return this.NH},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
 gRn:function(a){return this.ZK},
-R5:function(a,b,c){var z,y
-this.qu=!0
-D.kT(b,this.x8)
+bF:function(a,b,c){var z,y
+this.ks=!0
+D.kT(b,this.V0)
 z=J.U6(b)
 y=z.t(b,"eventType")
 y=F.Wi(this,C.qR,this.eq,y)
@@ -19179,7 +19258,7 @@
 this.bN=y
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(z.t(b,"breakpoint")!=null){y=z.t(b,"breakpoint")
-this.HQ=F.Wi(this,C.hR,this.HQ,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
+this.NH=F.Wi(this,C.hR,this.NH,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
 this.jo=F.Wi(this,C.ne,this.jo,y)}if(z.t(b,"_data")!=null){z=z.t(b,"_data")
 this.ZK=F.Wi(this,C.ee,this.ZK,z)}},
 bu:[function(a){var z,y
@@ -19191,50 +19270,48 @@
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gO3:function(a){return this.dj},
 gjm:function(){return!0},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x,w,v
+bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"url")
 x=F.Wi(this,C.Fh,this.dj,y)
 this.dj=x
 if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
 w=J.U6(y)
-v=w.cn(y,"/")
-if(typeof v!=="number")return v.g()
-x=w.yn(y,v+1)}y=z.t(b,"name")
+x=w.yn(y,w.cn(y,"/")+1)}y=z.t(b,"name")
 y=this.ct(this,C.YS,this.bN,y)
 this.bN=y
 if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.x8))
+this.ks=!0
+D.kT(b,J.wg(this.V0))
 y=this.Bm
 y.V1(y)
-w=J.dF(z.t(b,"imports")).br(0)
-H.ig(w,D.E0())
+w=J.Ij(z.t(b,"imports")).br(0)
+H.ig(w,D.Br())
 y.FV(0,w)
 y=this.XR
 y.V1(y)
-w=J.dF(z.t(b,"scripts")).br(0)
-H.ig(w,D.E0())
+w=J.Ij(z.t(b,"scripts")).br(0)
+H.ig(w,D.Br())
 y.FV(0,w)
 y=this.DD
 y.V1(y)
 y.FV(0,z.t(b,"classes"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=this.Z3
 y.V1(y)
 y.FV(0,z.t(b,"variables"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
-y.GT(y,D.E0())},
+y.GT(y,D.Br())},
 bu:[function(a){return"Library("+H.d(this.dj)+")"},"$0","gCR",0,0,73],
 $isU4:true},
 T5W:{
@@ -19242,11 +19319,11 @@
 rG9:{
 "^":"T5W+Pi;",
 $isd3:true},
-mT:{
-"^":"Pi;wf,wY,Vg,fn",
+qp:{
+"^":"Pi;wf,wY,Vg,ij",
 gWt:function(a){return this.wf},
 sWt:function(a,b){this.wf=F.Wi(this,C.yB,this.wf,b)},
-gfj:function(){return this.wY}},
+gET:function(){return this.wY}},
 Iy:{
 "^":"a;EJ<,l<",
 eC:function(a){var z,y,x
@@ -19263,16 +19340,16 @@
 x.wY=F.Wi(x,C.hN,x.wY,y)},
 static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,eH,dN,yv,UY<,xQ<,dQ,tJ<,mu<,k9,p2<,LT<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,qG,dN,yv,UY<,xQ<,vU,tJ<,mu<,k9,p2<,up<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gVM:function(){return this.Lh},
-gRs:function(){return this.GQ},
+gRh:function(){return this.GQ},
 geh:function(){return this.J1},
-gVF:function(){return this.eH},
-sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
+gVF:function(){return this.qG},
+sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gkc:function(a){return this.yv},
@@ -19291,15 +19368,15 @@
 sAY:function(a){this.k9=F.Wi(this,C.FZ,this.k9,a)},
 gjm:function(){return!0},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x,w
+bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.x8))
+this.ks=!0
+D.kT(b,J.wg(this.V0))
 if(!!J.x(z.t(b,"library")).$isU4){y=z.t(b,"library")
 this.Gz=F.Wi(this,C.EV,this.Gz,y)}else this.Gz=F.Wi(this,C.EV,this.Gz,null)
 y=z.t(b,"script")
@@ -19315,21 +19392,21 @@
 y=z.t(b,"implemented")
 this.E8=F.Wi(this,C.Ih,this.E8,y)
 y=z.t(b,"tokenPos")
-this.eH=F.Wi(this,C.dA,this.eH,y)
+this.qG=F.Wi(this,C.dA,this.qG,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=this.LT
+y=this.up
 y.V1(y)
 y.FV(0,z.t(b,"subclasses"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=this.tJ
 y.V1(y)
 y.FV(0,z.t(b,"fields"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
-y.GT(y,D.E0())
+y.GT(y,D.Br())
 y=z.t(b,"super")
 y=F.Wi(this,C.FZ,this.k9,y)
 this.k9=y
@@ -19340,16 +19417,16 @@
 if(x!=null){z=J.U6(x)
 this.UY.eC(z.t(x,"new"))
 this.xQ.eC(z.t(x,"old"))
-y=this.dQ
+y=this.vU
 w=z.t(x,"promotedInstances")
 y.wf=F.Wi(y,C.yB,y.wf,w)
 z=z.t(x,"promotedBytes")
 y.wY=F.Wi(y,C.hN,y.wY,z)}},
-u2:function(a){var z=this.LT
+u2:function(a){var z=this.up
 if(z.tg(z,a))return
 z.h(0,a)
-z.GT(z,D.E0())},
-cv:function(a){return J.aT(this.x8).cv(J.WB(this.TU,"/"+H.d(a)))},
+z.GT(z,D.Br())},
+cv:function(a){return J.wg(this.V0).cv(J.WB(this.r0,"/"+H.d(a)))},
 bu:[function(a){return"Class("+H.d(this.GR)+")"},"$0","gCR",0,0,73],
 $isdy:true},
 ZzQ:{
@@ -19358,25 +19435,25 @@
 "^":"ZzQ+Pi;",
 $isd3:true},
 uq:{
-"^":"Zqa;df,MD,lA,fQ,ni,Iv,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"Zqa;df,MD,lA,fQ,ni,Xl,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gyT:function(a){return this.MD},
+gky:function(a){return this.MD},
 gPE:function(){return this.lA},
 gSS:function(){return this.fQ},
 gwz:function(){return this.ni},
 swz:function(a){this.ni=F.Wi(this,C.aw,this.ni,a)},
-gu5:function(){return this.Iv},
-su5:function(a){this.Iv=F.Wi(this,C.mM,this.Iv,a)},
+gu5:function(){return this.Xl},
+su5:function(a){this.Xl=F.Wi(this,C.mM,this.Xl,a)},
 goc:function(a){return this.di},
 soc:function(a,b){this.di=F.Wi(this,C.YS,this.di,b)},
 gB:function(a){return this.cM},
 sB:function(a,b){this.cM=F.Wi(this,C.Wn,this.cM,b)},
-gCY:function(){return this.F6},
-sCY:function(a){this.F6=F.Wi(this,C.hx,this.F6,a)},
+gQR:function(){return this.F6},
+sQR:function(a){this.F6=F.Wi(this,C.hx,this.F6,a)},
 gtJ:function(){return this.oI},
 stJ:function(a){this.oI=F.Wi(this,C.fV,this.oI,a)},
-gbA:function(){return this.dG},
+gDm:function(){return this.dG},
 gP9:function(a){return this.Rf},
 sP9:function(a,b){this.Rf=F.Wi(this,C.mw,this.Rf,b)},
 gCM:function(){return this.TG},
@@ -19386,8 +19463,8 @@
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 gBF:function(){return this.ni!=null},
-R5:function(a,b,c){var z,y
-D.kT(b,J.aT(this.x8))
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.V0))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19400,7 +19477,7 @@
 y=z.t(b,"closureFunc")
 this.ni=F.Wi(this,C.aw,this.ni,y)
 y=z.t(b,"closureCtxt")
-this.Iv=F.Wi(this,C.mM,this.Iv,y)
+this.Xl=F.Wi(this,C.mM,this.Xl,y)
 y=z.t(b,"name")
 this.di=F.Wi(this,C.YS,this.di,y)
 y=z.t(b,"length")
@@ -19415,31 +19492,32 @@
 y=z.t(b,"type_class")
 this.F6=F.Wi(this,C.hx,this.F6,y)
 y=z.t(b,"user_name")
-this.z0=F.Wi(this,C.Gy,this.z0,y)
+this.z0=F.Wi(this,C.ct,this.z0,y)
 y=z.t(b,"referent")
 this.TG=F.Wi(this,C.Tc,this.TG,y)
 y=z.t(b,"key")
 this.tk=F.Wi(this,C.z6,this.tk,y)
 z=z.t(b,"value")
 this.FA=F.Wi(this,C.zd,this.FA,z)
-this.qu=!0},
+this.ks=!0},
 bu:[function(a){var z=this.lA
 return"Instance("+H.d(z!=null?z:"a "+H.d(J.DA(this.df)))+")"},"$0","gCR",0,0,73]},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 lI:{
-"^":"D3i;df,MD,Jx,cM,A6,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"D3i;df,MD,Jx,cM,A6,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gyT:function(a){return this.MD},
+gky:function(a){return this.MD},
 gqH:function(){return this.Jx},
 sqH:function(a){this.Jx=F.Wi(this,C.BV,this.Jx,a)},
 gB:function(a){return this.cM},
 sB:function(a,b){this.cM=F.Wi(this,C.Wn,this.cM,b)},
 gZ3:function(){return this.A6},
-R5:function(a,b,c){var z,y
-D.kT(b,J.aT(this.x8))
+sZ3:function(a){this.A6=F.Wi(this,C.xw,this.A6,a)},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.V0))
 z=J.U6(b)
 y=z.t(b,"size")
 this.MD=F.Wi(this,C.da,this.MD,y)
@@ -19452,44 +19530,44 @@
 this.df=F.Wi(this,C.Wt,this.df,y)
 z=z.t(b,"variables")
 this.A6=F.Wi(this,C.xw,this.A6,z)
-this.qu=!0},
+this.ks=!0},
 bu:[function(a){return"Context("+H.d(this.cM)+")"},"$0","gCR",0,0,73]},
 D3i:{
 "^":"af+Pi;",
 $isd3:true},
-ma:{
+yz:{
 "^":"a;Sf",
 bu:[function(a){return this.Sf},"$0","gCR",0,0,76],
-Q2:function(){return C.Nm.tg([$.b1(),$.Nk(),$.zx(),$.dh()],this)},
-static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,dQ,z3,Gh,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.qu()
-case"kClosureFunction":return $.xq()
-case"kGetterFunction":return $.xW()
-case"kSetterFunction":return $.Kw()
+Q2:function(){return C.Nm.tg([$.Dh(),$.Nk(),$.zx(),$.OA()],this)},
+static:{"^":"et,jX,PZ,Bs,G8,xs,ab,Sp,Et,Ll,fJ,bt,dQ,z3,tT,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.xK()
+case"kClosureFunction":return $.HU()
+case"kGetterFunction":return $.rQ()
+case"kSetterFunction":return $.en()
 case"kConstructor":return $.kj()
 case"kImplicitGetter":return $.d9()
 case"kImplicitSetter":return $.AH()
 case"kStaticInitializer":return $.y5()
 case"kMethodExtractor":return $.Ot()
 case"kNoSuchMethodDispatcher":return $.E7()
-case"kInvokeFieldDispatcher":return $.f6()
-case"Collected":return $.b1()
+case"kInvokeFieldDispatcher":return $.bh()
+case"Collected":return $.Dh()
 case"Native":return $.Nk()
 case"Tag":return $.zx()
-case"Reused":return $.dh()}return $.lC()}}},
+case"Reused":return $.OA()}return $.lC()}}},
 Kp:{
-"^":"S6L;Pp,EG,bV,GQ,fd,ar,eH,dN,v5,NM,vf,H7,I0,XN,Ni,kE,Z4,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gEl:function(){return this.Pp},
-sEl:function(a){this.Pp=F.Wi(this,C.YV,this.Pp,a)},
+"^":"S6L;Pp,EG,bV,GQ,fd,ar,qG,dN,v5,NM,vf,H7,I0,XN,Ph,kE,TA,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gP2:function(){return this.Pp},
+sP2:function(a){this.Pp=F.Wi(this,C.YV,this.Pp,a)},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gFo:function(){return this.bV},
-gRs:function(){return this.GQ},
+gRh:function(){return this.GQ},
 geT:function(a){return this.fd},
 seT:function(a,b){this.fd=F.Wi(this,C.nX,this.fd,b)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gVF:function(){return this.eH},
-sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
+gVF:function(){return this.qG},
+sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gtT:function(a){return this.v5},
@@ -19497,19 +19575,19 @@
 gjW:function(){return this.NM},
 sjW:function(a){this.NM=F.Wi(this,C.OU,this.NM,a)},
 gW1:function(){return this.vf},
-gho:function(){return this.H7},
+gxL:function(){return this.H7},
 gfY:function(a){return this.I0},
-guh:function(){return this.XN},
-gUx:function(){return this.Ni},
+gOs:function(){return this.XN},
+gUx:function(){return this.Ph},
 gSu:function(){return this.kE},
-gMA:function(){return this.Z4},
-R5:function(a,b,c){var z,y
+gMA:function(){return this.TA},
+bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
-D.kT(b,J.aT(this.x8))
+D.kT(b,J.wg(this.V0))
 y=z.NZ(b,"owningClass")===!0?z.t(b,"owningClass"):null
 this.Pp=F.Wi(this,C.YV,this.Pp,y)
 y=z.NZ(b,"owningLibrary")===!0?z.t(b,"owningLibrary"):null
@@ -19518,7 +19596,7 @@
 y=F.Wi(this,C.Lc,this.I0,y)
 this.I0=y
 y=y.Q2()
-this.Z4=F.Wi(this,C.a0,this.Z4,!y)
+this.TA=F.Wi(this,C.a0,this.TA,!y)
 if(c)return
 y=z.t(b,"static")
 this.bV=F.Wi(this,C.AT,this.bV,y)
@@ -19529,12 +19607,12 @@
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 y=z.t(b,"tokenPos")
-this.eH=F.Wi(this,C.dA,this.eH,y)
+this.qG=F.Wi(this,C.dA,this.qG,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=D.UW(z.t(b,"code"))
+y=D.vQ(z.t(b,"code"))
 this.v5=F.Wi(this,C.i4,this.v5,y)
-y=D.UW(z.t(b,"unoptimizedCode"))
+y=D.vQ(z.t(b,"unoptimizedCode"))
 this.NM=F.Wi(this,C.OU,this.NM,y)
 y=z.t(b,"optimizable")
 this.vf=F.Wi(this,C.Vl,this.vf,y)
@@ -19547,16 +19625,74 @@
 z=this.fd
 if(z==null){z=this.Pp
 z=z!=null?H.d(J.DA(z))+"."+H.d(this.bN):this.bN
-this.Ni=F.Wi(this,C.AO,this.Ni,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
-this.Ni=F.Wi(this,C.AO,this.Ni,z)}},
+this.Ph=F.Wi(this,C.AO,this.Ph,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
+this.Ph=F.Wi(this,C.AO,this.Ph,z)}},
 $isKp:true},
 wvY:{
 "^":"af+boh;"},
 S6L:{
 "^":"wvY+Pi;",
 $isd3:true},
+xB:{
+"^":"Pqb;kU,Br,bV,f3,GQ,FA,bN:T6@,GR:vS@,ND,lw,jB,ar,qG,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gXP:function(){return this.kU},
+sXP:function(a){this.kU=F.Wi(this,C.Yp,this.kU,a)},
+gOF:function(){return this.Br},
+sOF:function(a){this.Br=F.Wi(this,C.yC,this.Br,a)},
+gFo:function(){return this.bV},
+gV5:function(a){return this.f3},
+gRh:function(){return this.GQ},
+gP:function(a){return this.FA},
+sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
+goc:function(a){return this.T6},
+soc:function(a,b){this.T6=F.Wi(this,C.YS,this.T6,b)},
+gzz:function(){return this.vS},
+szz:function(a){this.vS=F.Wi(this,C.KS,this.vS,a)},
+gRl:function(){return this.ND},
+gSE:function(){return this.lw},
+sSE:function(a){this.lw=F.Wi(this,C.ft,this.lw,a)},
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gVF:function(){return this.qG},
+sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.V0))
+z=J.U6(b)
+y=z.t(b,"name")
+this.T6=F.Wi(this,C.YS,this.T6,y)
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.T6
+this.vS=F.Wi(this,C.KS,this.vS,y)
+y=z.t(b,"owner")
+this.kU=F.Wi(this,C.Yp,this.kU,y)
+y=z.t(b,"declaredType")
+this.Br=F.Wi(this,C.yC,this.Br,y)
+y=z.t(b,"static")
+this.bV=F.Wi(this,C.AT,this.bV,y)
+y=z.t(b,"final")
+this.f3=F.Wi(this,C.dR,this.f3,y)
+y=z.t(b,"const")
+this.GQ=F.Wi(this,C.Nr,this.GQ,y)
+y=z.t(b,"value")
+this.FA=F.Wi(this,C.zd,this.FA,y)
+if(c)return
+y=z.t(b,"guardNullable")
+this.ND=F.Wi(this,C.dr,this.ND,y)
+y=z.t(b,"guardClass")
+this.lw=F.Wi(this,C.ft,this.lw,y)
+y=z.t(b,"guardLength")
+this.jB=F.Wi(this,C.fX,this.jB,y)
+y=z.t(b,"script")
+this.ar=F.Wi(this,C.PX,this.ar,y)
+z=z.t(b,"tokenPos")
+this.qG=F.Wi(this,C.dA,this.qG,z)
+this.ks=!0},
+bu:[function(a){return"Field("+H.d(J.DA(this.kU))+"."+H.d(this.T6)+")"},"$0","gCR",0,0,73],
+$isxB:true},
+Pqb:{
+"^":"af+Pi;",
+$isd3:true},
 c2:{
-"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,fn",
+"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,ij",
 gc1:function(){return this.x9},
 sc1:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
 gqr:function(){return this.Yp},
@@ -19569,7 +19705,7 @@
 jY:function(a,b,c){var z,y,x,w,v,u,t
 z=D.y8(this.a4)
 this.am=F.Wi(this,C.Jf,this.am,!z)
-for(z=this.tu,y=J.mY(J.UQ(J.aT(z.x8).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+for(z=this.tu,y=J.mY(J.UQ(J.wg(z.V0).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
 v=J.U6(w)
 u=J.UQ(v.t(w,"location"),"script")
 t=J.UQ(v.t(w,"location"),"tokenPos")
@@ -19584,17 +19720,17 @@
 z=z.Fr(a,"")
 y=new H.a7(z,z.length,0,null)
 y.$builtinTypeInfo=[H.u3(z,0)]
-for(;y.G();)switch(y.Ff){case"{":case"}":case"(":case")":case";":break
+for(;y.G();)switch(y.lo){case"{":case"}":case"(":case")":case";":break
 default:return!1}return!0},y8:function(a){var z,y,x,w
-z=J.BQ(a,new H.VR("(\\s)+",H.v4("(\\s)+",!1,!0,!1),null,null))
-for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.BQ(y.Ff,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
+z=J.BQ(a,new H.VR("(\\s)+",H.Vq("(\\s)+",!1,!0,!1),null,null))
+for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.BQ(y.lo,new H.VR("(\\b)",H.Vq("(\\b)",!1,!0,!1),null,null))
 w=new H.a7(x,x.length,0,null)
 w.$builtinTypeInfo=[H.u3(x,0)]
-for(;w.G();)if(!D.Fu(w.Ff))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+for(;w.G();)if(!D.Fu(w.lo))return!1}return!0},Yo:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
 z.jY(a,b,c)
 return z}}},
 vx:{
-"^":"vix;Gd>,p3,I0,E4,nE,EG,yc,zD,MO,aQ,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"vix;Gd>,p3,I0,l9,nE,EG,yc,zD,MO,aQ,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
@@ -19602,25 +19738,23 @@
 gM8:function(){return!0},
 rK:function(a){var z,y
 z=J.bI(a,1)
-y=this.Gd.XG
+y=this.Gd.xN
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
 q6:function(a){return this.MO.t(0,a)},
-R5:function(a,b,c){var z,y,x,w
-D.kT(b,J.aT(this.x8))
+bF:function(a,b,c){var z,y,x
+D.kT(b,J.wg(this.V0))
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"name")
 this.zD=y
 x=J.U6(y)
-w=x.cn(y,"/")
-if(typeof w!=="number")return w.g()
-w=x.yn(y,w+1)
-this.yc=w
-this.bN=this.ct(this,C.YS,this.bN,w)
-w=this.zD
-this.GR=this.ct(this,C.KS,this.GR,w)
+y=x.yn(y,x.cn(y,"/")+1)
+this.yc=y
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=this.zD
+this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
 this.Aj(z.t(b,"source"))
 this.YG(z.t(b,"tokenPosTable"))
@@ -19632,9 +19766,9 @@
 z.V1(0)
 y=this.aQ
 y.V1(0)
-this.E4=F.Wi(this,C.Gd,this.E4,null)
-this.nE=F.Wi(this,C.kA,this.nE,null)
-x=P.Ls(null,null,null,null)
+this.l9=F.Wi(this,C.Gd,this.l9,null)
+this.nE=F.Wi(this,C.qa,this.nE,null)
+x=P.fM(null,null,null,null)
 for(w=J.mY(a);w.G();){v=w.gl()
 u=J.U6(v)
 t=u.t(v,0)
@@ -19645,25 +19779,25 @@
 if(!(s<r))break
 q=u.t(v,s)
 p=u.t(v,s+1)
-r=this.E4
+r=this.l9
 if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.E4=q
+this.nq(this,r)}this.l9=q
 r=this.nE
-if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
+if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.qa,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.E4:q
-o=this.E4
+this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.l9:q
+o=this.l9
 if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.Gd,o,r)
 o.$builtinTypeInfo=[null]
-this.nq(this,o)}this.E4=r
+this.nq(this,o)}this.l9=r
 r=J.J5(this.nE,q)?this.nE:q
 o=this.nE
-if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.kA,o,r)
+if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.qa,o,r)
 o.$builtinTypeInfo=[null]
 this.nq(this,o)}this.nE=r}z.u(0,q,t)
 y.u(0,q,p)
-s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.Ff
+s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.lo
 if(!x.tg(0,J.f2(v)))v.sj9(!1)}},
 lV:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
@@ -19676,20 +19810,20 @@
 u=z.t(a,x+1)
 t=y.t(0,v)
 y.u(0,v,t!=null?J.WB(u,t):u)
-x+=2}this.f2()},
+x+=2}this.xz()},
 Aj:function(a){var z,y,x,w
-this.qu=!1
+this.ks=!1
 if(a==null)return
 z=J.BQ(a,"\n")
 if(z.length===0)return
-this.qu=!0
+this.ks=!0
 y=this.Gd
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.zD))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,D.NQ(this,w,z[x]))}this.f2()},
-f2:function(){var z,y,x
-for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.Ff
+y.h(0,D.Yo(this,w,z[x]))}this.xz()},
+xz:function(){var z,y,x
+for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.lo
 x.sc1(y.t(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
@@ -19698,18 +19832,18 @@
 "^":"Vlh+Pi;",
 $isd3:true},
 uA:{
-"^":"a;Yu<,Du<,fF<",
+"^":"a;Yu<,Du<,pn<",
 $isuA:true},
-Z9:{
-"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,up,Vg,fn",
+xb:{
+"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,GL,Vg,ij",
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gmE:function(){return this.up},
+gP3:function(){return this.GL},
 JM:[function(){var z,y
 z=this.p4
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,73],
+return y.bu(z)},"$0","gqE",0,0,73],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -19718,29 +19852,98 @@
 if(y==null)return
 this.ar=F.Wi(this,C.PX,this.ar,a)
 z=J.dY(a.rK(y))
-this.up=F.Wi(this,C.oI,this.up,z)},
-$isZ9:true},
+this.GL=F.Wi(this,C.oI,this.GL,z)},
+$isxb:true},
+hn:{
+"^":"nla;df,MD,uH<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gUP:function(){return this.df},
+sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
+gky:function(a){return this.MD},
+gjm:function(){return!1},
+gM8:function(){return!0},
+bF:function(a,b,c){var z,y,x,w
+if(c)return
+D.kT(b,J.wg(this.V0))
+z=J.U6(b)
+y=z.t(b,"class")
+this.df=F.Wi(this,C.Wt,this.df,y)
+y=z.t(b,"size")
+this.MD=F.Wi(this,C.da,this.MD,y)
+y=this.uH
+y.V1(y)
+for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
+w=J.U6(x)
+y.h(0,new D.xb(H.BU(w.t(x,"pc"),16,null),w.t(x,"deoptId"),w.t(x,"tokenPos"),w.t(x,"tryIndex"),J.iY(w.t(x,"kind")),null,null,null,null))}}},
+nla:{
+"^":"af+Pi;",
+$isd3:true},
+br:{
+"^":"Pi;oc>,vH>,eb,Jb>,ePv,fY>,Vg,ij",
+$isbr:true},
+Mi:{
+"^":"Fba;df,MD,uH<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gUP:function(){return this.df},
+sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
+gky:function(a){return this.MD},
+gjm:function(){return!1},
+gM8:function(){return!0},
+bF:function(a,b,c){var z,y,x,w
+if(c)return
+D.kT(b,J.wg(this.V0))
+z=J.U6(b)
+y=z.t(b,"class")
+this.df=F.Wi(this,C.Wt,this.df,y)
+y=z.t(b,"size")
+this.MD=F.Wi(this,C.da,this.MD,y)
+y=this.uH
+y.V1(y)
+for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
+w=J.U6(x)
+y.h(0,new D.br(w.t(x,"name"),w.t(x,"index"),w.t(x,"beginPos"),w.t(x,"endPos"),w.t(x,"scopeId"),J.iY(w.t(x,"kind")),null,null))}}},
+Fba:{
+"^":"af+Pi;",
+$isd3:true},
+Ik:{
+"^":"laa;df,MD,C9,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+gUP:function(){return this.df},
+sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
+gky:function(a){return this.MD},
+gjm:function(){return!1},
+gM8:function(){return!0},
+bF:function(a,b,c){var z,y
+if(c)return
+D.kT(b,J.wg(this.V0))
+z=J.U6(b)
+y=z.t(b,"class")
+this.df=F.Wi(this,C.Wt,this.df,y)
+y=z.t(b,"size")
+this.MD=F.Wi(this,C.da,this.MD,y)
+z=z.t(b,"privateKey")
+this.C9=F.Wi(this,C.rm,this.C9,z)}},
+laa:{
+"^":"af+Pi;",
+$isd3:true},
 Q4:{
-"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,fn",
-gEB:function(){return this.dh},
+"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,ij",
+gnp:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-gX1:function(){return this.uH.XG.length>0},
-xtx:[function(){var z,y
+ghR:function(){return this.uH.xN.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,73],
 tU:[function(a){var z
 if(a==null)return""
-z=a.gn3().LL.t(0,this.Yu)
+z=a.gn3().tf.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,219,78],
+if(J.xC(z.gpn(),z.gDu()))return""
+return D.Tn(z.gpn(),a.glt())+" ("+H.d(z.gpn())+")"},"$1","gcQ",2,0,219,78],
 P7:[function(a){var z
 if(a==null)return""
-z=a.gn3().LL.t(0,this.Yu)
+z=a.gn3().tf.t(0,this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,219,78],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gAX",2,0,219,78],
 lF:function(){var z,y,x,w
 y=J.BQ(this.u0," ")
 x=y.length
@@ -19757,14 +19960,14 @@
 y=this.lF()
 x=J.x(y)
 if(x.n(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
-return}for(z=a.XG,w=0;w<z.length;++w){v=z[w]
+return}for(z=a.xN,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
 this.nq(this,z)}this.dh=v
 return}}N.QM("").YX("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
+static:{Tn:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"$0","gCR",0,0,73],
@@ -19772,18 +19975,18 @@
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
-else if(z.n(a,"Reused"))return C.yP
-else if(z.n(a,"Tag"))return C.Z7
+else if(z.n(a,"Reused"))return C.AA
+else if(z.n(a,"Tag"))return C.oA
 N.QM("").j2("Unknown code kind "+H.d(a))
 throw H.b(P.a9())}}},
 ta:{
 "^":"a;tT>,Av<",
 $ista:true},
-D5:{
-"^":"a;tT>,Av<,ks>,Jv",
-$isD5:true},
+TH:{
+"^":"a;tT>,Av<,qu>,Jv",
+$isTH:true},
 kx:{
-"^":"Pqb;I0,xM,Du<,fF<,vg,uE,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,oc*,TE@,Mk,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w25;I0,xM,Du<,pn<,vg,QA,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,Mk,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gfY:function(a){return this.I0},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
@@ -19799,16 +20002,16 @@
 gM8:function(){return!0},
 P8:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.Ff.guH(),y=y.gA(y);y.G();)y.Ff.bR(a)},"$1","gH8",2,0,220,221],
-OF:function(){if(this.ar!=null)return
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gH8",2,0,220,221],
+QW:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.uG
 if(z==null)return
-if(J.zE(z)==null){J.SK(this.uG).ml(new D.Em(this))
-return}J.SK(J.zE(this.uG)).ml(this.gH8())},
+if(J.fx(z)==null){J.SK(this.uG).ml(new D.fA(this))
+return}J.SK(J.fx(this.uG)).ml(this.gH8())},
 VD:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.VD.call(this,this)
 return P.Ab(this,null)},
-ui:function(a,b,c){var z,y,x,w,v
+GK:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=0
 while(!0){x=z.gB(b)
@@ -19818,31 +20021,33 @@
 v=H.BU(z.t(b,y+1),null,null)
 if(w>>>0!==w||w>=c.length)return H.e(c,w)
 a.push(new D.ta(c[w],v))
-y+=2}H.ig(a,new D.fx())},
+y+=2}H.ig(a,new D.jm())},
 Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.kr,this.xM,c)
+this.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.pn=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
-this.ui(this.VS,z.t(a,"callers"),b)
-this.ui(this.hw,z.t(a,"callees"),b)
+this.GK(this.VS,z.t(a,"callers"),b)
+this.GK(this.hw,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
 if(y!=null)this.Zk(y)
-z=D.RA(this.fF,this.xM)+" ("+H.d(this.fF)+")"
+z=D.Rd(this.pn,this.xM)+" ("+H.d(this.pn)+")"
 this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.RA(this.Du,this.xM)+" ("+H.d(this.Du)+")"
+z=D.Rd(this.Du,this.xM)+" ("+H.d(this.Du)+")"
 this.rF=F.Wi(this,C.uU,this.rF,z)},
-R5:function(a,b,c){var z,y,x,w,v,u
+bF:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(b)
-this.oc=z.t(b,"name")
-this.TE=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.oc
+y=z.t(b,"name")
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
+this.GR=this.ct(this,C.KS,this.GR,y)
 y=z.t(b,"optimized")!=null&&z.t(b,"optimized")
 this.MH=F.Wi(this,C.pY,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 this.vg=H.BU(z.t(b,"start"),16,null)
-this.uE=H.BU(z.t(b,"end"),16,null)
-y=this.x8
+this.QA=H.BU(z.t(b,"end"),16,null)
+y=this.V0
 x=J.RE(y)
 w=x.god(y).Qn(z.t(b,"function"))
 this.uG=F.Wi(this,C.nf,this.uG,w)
@@ -19852,8 +20057,8 @@
 if(v!=null)this.cr(v)
 u=z.t(b,"descriptors")
 if(u!=null)this.Xd(J.UQ(u,"members"))
-z=this.va.XG
-this.qu=z.length!==0||!J.xC(this.I0,C.l8)
+z=this.va.xN
+this.ks=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.Mk=F.Wi(this,C.zS,this.Mk,z)},
 gUa:function(){return this.Mk},
@@ -19868,22 +20073,22 @@
 v=y.t(a,x+1)
 u=y.t(a,x+2)
 t=!J.xC(y.t(a,x),"")?H.BU(y.t(a,x),null,null):0
-w=D.Z9
+w=D.xb
 s=[]
 s.$builtinTypeInfo=[w]
 s=new Q.wn(null,null,s,null,null)
 s.$builtinTypeInfo=[w]
 z.h(0,new D.Q4(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.Ff.pj(z)},
+x+=3}for(y=z.gA(z);y.G();)y.lo.pj(z)},
 MY:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
 x=z.t(a,"deoptId")
 w=z.t(a,"tokenPos")
 v=z.t(a,"tryIndex")
-u=J.rr(z.t(a,"kind"))
-for(z=this.va,z=z.gA(z);z.G();){t=z.Ff
-if(J.xC(t.gYu(),y)){t.guH().h(0,new D.Z9(y,x,w,v,u,null,null,null,null))
+u=J.iY(z.t(a,"kind"))
+for(z=this.va,z=z.gA(z);z.G();){t=z.lo
+if(J.xC(t.gYu(),y)){t.guH().h(0,new D.xb(y,x,w,v,u,null,null,null,null))
 return}}N.QM("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
 Xd:function(a){var z
 for(z=J.mY(a);z.G();)this.MY(z.gl())},
@@ -19898,29 +20103,29 @@
 y.u(0,v,new D.uA(v,H.BU(z.t(a,x+1),null,null),H.BU(z.t(a,x+2),null,null)))
 x+=3}},
 tg:function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.uE)},
+return z.F(b,this.vg)&&z.C(b,this.QA)},
 gqy:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
-static:{RA:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
-Pqb:{
+static:{Rd:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
+w25:{
 "^":"af+Pi;",
 $isd3:true},
-Em:{
+fA:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
-y=J.zE(z.uG)
+y=J.fx(z.uG)
 if(y==null)return
 J.SK(y).ml(z.gH8())},"$1",null,2,0,null,222,"call"],
 $isEH:true},
-fx:{
+jm:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.bI(b.gAv(),a.gAv())},
 $isEH:true},
 M9x:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"$0","gCR",0,0,73],
-static:{"^":"Cnk,qp,FJy,wr",AR:function(a){var z=J.x(a)
+static:{"^":"Cnk,lTU,FJy,wjk",AR:function(a){var z=J.x(a)
 if(z.n(a,"Listening"))return C.Cn
 else if(z.n(a,"Normal"))return C.lT
 else if(z.n(a,"Pipe"))return C.FJ
@@ -19928,21 +20133,21 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"nla;ip@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w26;V8@,jel,IHj,I0,vu,e5,ho,SI,L7,zw,tO,HO,u8,Wm,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gjm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
-gaB:function(a){return this.vu},
-gm8:function(){return this.DB},
-gaU:function(){return this.XK},
-gaP:function(){return this.FH},
+gA8:function(a){return this.vu},
+gm8:function(){return this.e5},
+gSY:function(){return this.ho},
+gmy:function(){return this.SI},
 gzM:function(){return this.L7},
-gki:function(){return this.zw},
+gq2:function(){return this.zw},
 giP:function(){return this.tO},
-gfJ:function(){return this.HO},
+gbB:function(){return this.HO},
 gNS:function(){return this.u8},
-gzK:function(){return this.EC},
-R5:function(a,b,c){var z,y
+gzK:function(){return this.Wm},
+bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -19951,14 +20156,14 @@
 y=D.AR(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.x8))
+this.ks=!0
+D.kT(b,J.wg(this.V0))
 y=z.t(b,"readClosed")
-this.DB=F.Wi(this,C.I7,this.DB,y)
+this.e5=F.Wi(this,C.I7,this.e5,y)
 y=z.t(b,"writeClosed")
-this.XK=F.Wi(this,C.Uy,this.XK,y)
+this.ho=F.Wi(this,C.Uy,this.ho,y)
 y=z.t(b,"closing")
-this.FH=F.Wi(this,C.To,this.FH,y)
+this.SI=F.Wi(this,C.To,this.SI,y)
 y=z.t(b,"listening")
 this.L7=F.Wi(this,C.cc,this.L7,y)
 y=z.t(b,"protocol")
@@ -19970,37 +20175,37 @@
 y=z.t(b,"remoteAddress")
 this.u8=F.Wi(this,C.dx,this.u8,y)
 y=z.t(b,"remotePort")
-this.EC=F.Wi(this,C.ni,this.EC,y)
+this.Wm=F.Wi(this,C.ni,this.Wm,y)
 y=z.t(b,"fd")
 this.zw=F.Wi(this,C.R3,this.zw,y)
-this.ip=z.t(b,"owner")}},
-nla:{
+this.V8=z.t(b,"owner")}},
+w26:{
 "^":"af+Pi;",
 $isd3:true},
 G9:{
 "^":"a;P>,Fl<",
 $isG9:true},
 YX:{
-"^":"Fba;L5,mw@,Jk<,wE,Qd,FA,zn,LV,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w27;L5,mw@,Jk<,kB,Qd,FA,zn,ay,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 gjm:function(){return!0},
 gM8:function(){return!1},
-ghM:function(){return this.wE},
-shM:function(a){this.wE=a
-this.Hi()},
+ghM:function(){return this.kB},
+shM:function(a){this.kB=a
+this.nW()},
 NT:function(a){this.Jk.h(0,a)
-this.Hi()},
-Hi:function(){var z,y,x
+this.nW()},
+nW:function(){var z,y,x
 z=this.Jk
-y=z.XG.length
-x=this.wE
+y=z.xN.length
+x=this.kB
 if(typeof x!=="number")return H.s(x)
 if(y>x)z.oq(0,0,y-x)},
-gGB:function(){return this.Qd},
+gQZ:function(){return this.Qd},
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 gBp:function(a){return this.zn},
-gA5:function(a){return this.LV},
-R5:function(a,b,c){var z,y
+gA5:function(a){return this.ay},
+bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -20013,19 +20218,19 @@
 y=z.t(b,"min")
 this.zn=F.Wi(this,C.a2,this.zn,y)
 z=z.t(b,"max")
-this.LV=F.Wi(this,C.qi,this.LV,z)},
-bu:[function(a){return"ServiceMetric("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
+this.ay=F.Wi(this,C.qi,this.ay,z)},
+bu:[function(a){return"ServiceMetric("+H.d(this.r0)+")"},"$0","gCR",0,0,73],
 $isYX:true},
-Fba:{
+w27:{
 "^":"af+Pi;",
 $isd3:true},
 W1:{
-"^":"a;Jb<,MT>,Cb",
+"^":"a;fj<,MT>,Cb",
 Gv:function(){var z=this.Cb
 if(z!=null)z.Gv()
 this.Cb=null},
-Y0:[function(a,b){var z,y,x,w
-for(z=this.Jb,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=J.LE(z.Ff)
+Lyg:[function(a,b){var z,y,x,w
+for(z=this.fj,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=J.LE(z.lo)
 y.toString
 x=$.X3
 w=new P.Gc(0,x,null,null,x.cR(new D.r6()),null,P.VH(null,$.X3),null)
@@ -20045,17 +20250,17 @@
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
-if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
+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.Gf(b,this.b)},
 $isEH:true}}],["","",,L,{
 "^":"",
 Z5:{
-"^":"a;eX@,A9<,oc*,w8<",
+"^":"a;FH@,A9<,oc*,w8<",
 gp8:function(){return this.A9!==!0},
-Lt:function(){return P.EF(["lastConnectionTime",this.eX,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
+Lt:function(){return P.EF(["lastConnectionTime",this.FH,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
 UT:function(a){var z=J.U6(a)
-this.eX=z.t(a,"lastConnectionTime")
+this.FH=z.t(a,"lastConnectionTime")
 this.A9=z.t(a,"chrome")
 this.oc=z.t(a,"name")
 z=z.t(a,"networkAddress")
@@ -20065,9 +20270,9 @@
 static:{K9:function(a){var z=new L.Z5(0,!1,null,null)
 z.UT(a)
 return z}}},
-U2:{
-"^":"a;jO>,qT<",
-$isU2:true},
+Z8:{
+"^":"a;jO>,mh<",
+$isZ8:true},
 Uon:{
 "^":"wv;N>",
 gEH:function(){return this.Tn.MM},
@@ -20077,26 +20282,26 @@
 z.Xf(this)}},
 giG:function(a){return this.Fq.MM},
 je:function(a){if(this.Sl)this.Ra.bs.close()
-this.M0()
+this.C8()
 this.FZ()},
 z6:function(a,b){var z,y,x
 if(!this.Sl){this.Sl=!0
 this.Ra.Tc(this.N.gw8(),this.gkQ(),this.gM3(),this.gCW(),this.gNu())}z=C.jn.bu(this.x7++)
 y=P.qU
 y=H.VM(new P.Zf(P.Dt(y)),[y])
-x=new L.U2(b,y)
+x=new L.Z8(b,y)
 if(this.Ra.bs.readyState===1)this.Mf(z,x)
 else this.WE.u(0,z,x)
 return y.MM},
-abp:[function(){this.M0()
+abp:[function(){this.C8()
 this.FZ()},"$0","gNu",0,0,17],
-Xs:[function(){this.M0()
+Xs:[function(){this.C8()
 this.FZ()},"$0","gCW",0,0,17],
-LNZ:[function(){var z,y
+LN:[function(){var z,y
 z=this.N
 y=Date.now()
 new P.iP(y,!1).EK()
-z.seX(y)
+z.sFH(y)
 this.e2()
 y=this.Tn.MM
 if(y.YM===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
@@ -20104,7 +20309,7 @@
 y.Xf(this)}},"$0","gkQ",0,0,17],
 PW:[function(a){var z,y,x,w,v
 if(typeof a!=="string"){this.Ra.OI(a).ml(new L.jF(this))
-return}z=C.xr.iQ(a)
+return}z=C.xr.kV(a)
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
 return}if(this.N.gA9()===!0){y=J.U6(z)
 if(!J.xC(y.t(z,"method"),"Dart.observatoryData"))return
@@ -20114,12 +20319,12 @@
 w=y.t(z,"response")}if(x==null){this.EM(w)
 return}v=this.Td.Rz(0,x)
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
-return}y=v.gqT().MM
+return}y=v.gmh().MM
 if(y.YM!==0)H.vh(P.w("Future already completed"))
 y.Xf(w)},"$1","gM3",2,0,19],
-ck:function(a){a.aN(0,new L.aZ(this))
+ck:function(a){a.aN(0,new L.dV(this))
 a.V1(0)},
-M0:function(){var z=this.Td
+C8:function(){var z=this.Td
 if(z.X5>0){N.QM("").To("Cancelling all pending requests.")
 this.ck(z)}z=this.WE
 if(z.X5>0){N.QM("").To("Cancelling all delayed requests.")
@@ -20139,13 +20344,13 @@
 "^":"TpZ:224;a",
 $1:[function(a){var z,y,x,w,v,u,t
 z=J.RE(a)
-y=z.mt(a,0,C.it)
+y=z.mt(a,0,C.eL)
 x=this.a
 w=z.gbg(a)
 v=z.gVl(a)
 if(typeof v!=="number")return v.g()
 w.toString
-u=x.Ur.Sw(H.z4(w,v+8,y))
+u=x.Ur.WJ(H.GG(w,v+8,y))
 t=C.jn.g(8,y)
 v=z.gbg(a)
 w=z.gVl(a)
@@ -20154,10 +20359,10 @@
 if(typeof z!=="number")return z.W()
 x.hQ(u,J.cm(v,w+t,z-t))},"$1",null,2,0,null,15,"call"],
 $isEH:true},
-aZ:{
+dV:{
 "^":"TpZ:225;a",
 $2:function(a,b){var z,y
-z=b.gqT()
+z=b.gmh()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
 z=z.MM
 if(z.YM!==0)H.vh(P.w("Future already completed"))
@@ -20165,16 +20370,16 @@
 $isEH:true}}],["","",,R,{
 "^":"",
 zM:{
-"^":"V56;S4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V57;S4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkc:function(a){return a.S4},
 skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{qa:function(a){var z,y,x,w
+static:{ZmK:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20184,59 +20389,59 @@
 C.U0.LX(a)
 C.U0.XI(a)
 return a}}},
-V56:{
+V57:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,D,{
 "^":"",
 Rk:{
-"^":"V57;Xc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gja:function(a){return a.Xc},
-sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
+"^":"V58;D1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gja:function(a){return a.D1},
+sja:function(a,b){a.D1=this.ct(a,C.ne,a.D1,b)},
 static:{bZp:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Vd.LX(a)
-C.Vd.XI(a)
+C.kgQ.LX(a)
+C.kgQ.XI(a)
 return a}}},
-V57:{
+V58:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 hA:{
 "^":"a;bs",
-Tc:function(a,b,c,d,e){var z=W.P0(a,null)
+Tc:function(a,b,c,d,e){var z=W.D7(a,null)
 this.bs=z
-z=H.VM(new W.RO(z,C.d6.fA,!1),[null])
+z=H.VM(new W.vG(z,"close",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.lo(e)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.MD.fA,!1),[null])
+z=H.VM(new W.vG(z,"error",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.j3(d)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.JL.fA,!1),[null])
+z=H.VM(new W.vG(z,"open",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.Fz(b)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.ph.fA,!1),[null])
+z=H.VM(new W.vG(z,"message",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.oy(c)),z.el),[H.u3(z,0)]).DN()},
 wR:function(a,b){this.bs.send(b)},
 xO:function(a){this.bs.close()},
 OI:function(a){var z,y
 z=new FileReader()
 z.readAsArrayBuffer(a)
-y=H.VM(new W.RO(z,C.G5.fA,!1),[null])
-return y.gqG(y).ml(new U.OW(z))}},
+y=H.VM(new W.vG(z,"loadend",!1),[null])
+return y.gtH(y).ml(new U.OW(z))}},
 lo:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.$0()},"$1",null,2,0,null,226,"call"],
@@ -20258,13 +20463,13 @@
 $1:[function(a){return J.cm(C.kL.gyG(this.a),0,null)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 KM:{
-"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,Ur,Ra,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,Ur,Ra,Ox,GY,RW,Ts,Va,h7,jA,Li,G2,Rk,uj,Qi,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 $isKM:true},
 dS:{
-"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"wv;eG,iW,S3,yb,Ox,GY,RW,Ts,Va,h7,jA,Li,G2,Rk,uj,Qi,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
 je:function(a){},
 gEH:function(){return this.eG.MM},
-giG:function(a){return this.rp.MM},
+giG:function(a){return this.iW.MM},
 j03:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -20283,16 +20488,16 @@
 y.u(0,"query",H.d(b));++this.yb
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.S3.u(0,z,x)
-J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
+J.bb(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
-ZH:function(){var z=H.VM(new W.RO(window,C.ph.fA,!1),[null])
+ZH:function(){var z=H.VM(new W.vG(window,"message",!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gDi()),z.el),[H.u3(z,0)]).DN()
 z=this.eG.MM
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V58;Ll,Sa,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V59;Ll,Sa,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 gl6:function(a){return a.Sa},
@@ -20302,7 +20507,7 @@
 J.CJ(z,a.Ll)
 return z
 case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.o3(z,a.Ll)
+J.oJ(z,a.Ll)
 return z
 case"Class":z=W.r3("class-view",null)
 J.NZ(z,a.Ll)
@@ -20340,6 +20545,9 @@
 case"HttpServerConnection":z=W.r3("io-http-server-connection-view",null)
 J.i0(z,a.Ll)
 return z
+case"Object":z=W.r3("object-view",null)
+J.h9(z,a.Ll)
+return z
 case"SocketList":z=W.r3("io-socket-list-view",null)
 J.A4(z,a.Ll)
 return z
@@ -20350,7 +20558,7 @@
 J.A4(z,a.Ll)
 return z
 case"WebSocket":z=W.r3("io-web-socket-view",null)
-J.tH(z,a.Ll)
+J.w7(z,a.Ll)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
 J.Rp(z,a.Ll)
@@ -20409,21 +20617,21 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Uv.LX(a)
-C.Uv.XI(a)
+C.Ns.LX(a)
+C.Ns.XI(a)
 return a}}},
-V58:{
+V59:{
 "^":"uL+Pi;",
 $isd3:true},
 Um:{
-"^":"V59;dL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V60;dL,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gBN:function(a){return a.dL},
 sBN:function(a,b){a.dL=this.ct(a,C.nE,a.dL,b)},
 static:{T21:function(a){var z,y,x,w
@@ -20432,7 +20640,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20442,17 +20650,17 @@
 C.Uav.LX(a)
 C.Uav.XI(a)
 return a}}},
-V59:{
+V60:{
 "^":"uL+Pi;",
 $isd3:true},
 VZ:{
-"^":"V60;GW,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V61;GW,C7,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gIr:function(a){return a.GW},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.GW=this.ct(a,C.SR,a.GW,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
+ITt:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
 Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,166],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
@@ -20464,61 +20672,61 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.OX.LX(a)
-C.OX.XI(a)
+C.vmJ.LX(a)
+C.vmJ.XI(a)
 return a}}},
-V60:{
+V61:{
 "^":"uL+Pi;",
 $isd3:true},
 WG:{
-"^":"V61;Jg,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V62;Jg,C7,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Jg},
 sjx:function(a,b){a.Jg=this.ct(a,C.vp,a.Jg,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
+ITt:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
 Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,166],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
 c.$0()},"$2","gus",4,0,230,231,102],
-static:{z0:function(a){var z,y,x,w
+static:{KTC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.DX.LX(a)
-C.DX.XI(a)
+C.dl.LX(a)
+C.dl.XI(a)
 return a}}},
-V61:{
+V62:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"Dsd;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Dsd;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
-gjT:function(a){return a.Pe},
-sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
+gjT:function(a){return a.R1},
+sjT:function(a,b){a.R1=this.ct(a,C.uu,a.R1,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,19,59],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gBj",2,0,19,59],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 z=J.Ds(z)
@@ -20526,19 +20734,19 @@
 return"#"+H.d(z)},
 gJp:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gTE()},
+return z.gzz()},
 goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return J.DA(z)},
-gWw:function(a){return J.FN(this.goc(a))},
+gWw:function(a){return this.goc(a)==null||J.FN(this.goc(a))===!0},
 static:{lKH:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20552,7 +20760,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 f7:{
-"^":"V62;tY,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V63;tY,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
 pY:function(a){var z
@@ -20577,6 +20785,12 @@
 case"Library":z=W.r3("library-ref",null)
 J.PP(z,a.tY)
 return z
+case"Object":z=W.r3("object-ref",null)
+J.PP(z,a.tY)
+return z
+case"Script":z=W.r3("script-ref",null)
+J.PP(z,a.tY)
+return z
 default:if(a.tY.gNs()||a.tY.gl5()){z=W.r3("instance-ref",null)
 J.PP(z,a.tY)
 return z}else{z=W.r3("span",null)
@@ -20590,14 +20804,14 @@
 x=this.pY(a)
 if(x==null){N.QM("").To("Unable to find a ref element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gLe",2,0,12,59],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gBj",2,0,12,59],
 static:{wzV:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20607,19 +20821,38 @@
 C.J9.LX(a)
 C.J9.XI(a)
 return a}}},
-V62:{
+V63:{
 "^":"uL+Pi;",
-$isd3:true}}],["","",,Q,{
+$isd3:true},
+Ce:{
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{FMr:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.Fl(null,null)
+w=P.Fl(null,null)
+a.R1=!1
+a.Iy=[]
+a.OD=!1
+a.kK=!1
+a.ZM=z
+a.ZQ=y
+a.qJ=x
+a.wy=w
+C.ji.LX(a)
+C.ji.XI(a)
+return a}}}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"ImK;kF,IK,bP,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"ImK;kF,IK,bP,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gd4:function(a){return a.kF},
 sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
 sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
-RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+oew:[function(a,b,c,d){var z=J.rp((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
 a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,116,2,232,107],
 static:{AlS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -20627,23 +20860,23 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Yo.LX(a)
-C.Yo.XI(a)
+C.zb.LX(a)
+C.zb.XI(a)
 return a}}},
 ImK:{
 "^":"xc+Pi;",
 $isd3:true}}],["","",,A,{
 "^":"",
 rv:{
-"^":"a;kl,IW,Mg,Yx,ER,Ja,BY,rM",
-xZ:function(a,b){return this.rM.$1(b)},
+"^":"a;kl,IW,Mg,nN,ER,Ja,BY,rM",
+WO:function(a,b){return this.rM.$1(b)},
 bu:[function(a){var z=P.p9("")
 z.KF("(options:")
 z.KF(this.kl?"fields ":"")
@@ -20654,12 +20887,13 @@
 z.KF("annotations: "+H.d(this.BY))
 z.KF(this.rM!=null?"with matcher":"")
 z.KF(")")
-return z.IN},"$0","gCR",0,0,73]},
+z=z.IN
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73]},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
 gZI:function(){return this.fY===C.nU},
-gRS:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.cn},
+gUd:function(){return this.fY===C.BM},
+gUA:function(){return this.fY===C.hU},
 giO:function(a){var z=this.oc
 return z.giO(z)},
 n:function(a,b){if(b==null)return!1
@@ -20672,7 +20906,8 @@
 z.KF(this.Fo?"static ":"")
 z.KF(this.Dv)
 z.KF(")")
-return z.IN},"$0","gCR",0,0,73],
+z=z.IN
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73],
 $isES:true},
 iYn:{
 "^":"a;fY>"}}],["","",,X,{
@@ -20689,17 +20924,17 @@
 ZO:function(a,b){var z,y,x,w,v,u
 z=new H.a7(a,a.length,0,null)
 z.$builtinTypeInfo=[H.u3(a,0)]
-for(;z.G();){y=z.Ff
+for(;z.G();){y=z.lo
 b.length
 x=new H.a7(b,1,0,null)
 x.$builtinTypeInfo=[H.u3(b,0)]
 w=J.x(y)
-for(;x.G();){v=x.Ff
+for(;x.G();){v=x.lo
 if(w.n(y,v))return!0
 if(!!J.x(v).$isLz){u=w.gbx(y)
-u=$.mX().xs(u,v)}else u=!1
+u=$.II().xs(u,v)}else u=!1
 if(u)return!0}}return!1},
-na:function(a){var z,y
+OS:function(a){var z,y
 z=H.G3()
 y=H.KT(z).Zg(a)
 if(y)return 0
@@ -20710,7 +20945,7 @@
 z=H.KT(z,[z,z,z]).Zg(a)
 if(z)return 3
 return 4},
-Zpg:function(a){var z,y
+RI:function(a){var z,y
 z=H.G3()
 y=H.KT(z,[z,z,z]).Zg(a)
 if(y)return 3
@@ -20726,9 +20961,9 @@
 y=b.length
 if(z!==y)return!1
 if(c){x=P.Fl(null,null)
-for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.Ff
+for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.lo
 v=x.t(0,w)
-x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.Ff
+x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.lo
 v=x.t(0,w)
 if(v==null)return!1
 if(v===1)x.Rz(0,w)
@@ -20739,15 +20974,15 @@
 kP:function(){throw H.b(P.eG("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["","",,O,{
 "^":"",
 Oj:{
-"^":"a;II,F8,ZG,of,F3,af<,T4,nX",
-FV:function(a,b){this.II.FV(0,b.gII())
+"^":"a;E4,F8,ZG,YK,t6,fJ<,T4,NI",
+FV:function(a,b){this.E4.FV(0,b.gE4())
 this.F8.FV(0,b.gF8())
 this.ZG.FV(0,b.gZG())
-O.PV(this.of,b.gof())
-O.PV(this.F3,b.gF3())
-this.af.FV(0,b.gaf())
-b.gaf().aN(0,new O.T6(this))},
-IZ:function(a,b,c,d,e,f,g){this.af.aN(0,new O.PO(this))},
+O.PV(this.YK,b.gYK())
+O.PV(this.t6,b.gt6())
+this.fJ.FV(0,b.gfJ())
+b.gfJ().aN(0,new O.W2(this))},
+IZ:function(a,b,c,d,e,f,g){this.fJ.aN(0,new O.PO(this))},
 static:{rH:function(a,b,c,d,e,f,g){var z,y
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -20755,98 +20990,98 @@
 z.IZ(a,b,c,d,e,f,g)
 return z},PV:function(a,b){var z,y
 for(z=b.gvc(b),z=z.gA(z);z.G(),!1;){y=z.gl()
-a.to(0,y,new O.oQ())
+a.to(0,y,new O.D8())
 J.bj(a.t(0,y),b.t(0,y))}}}},
 PO:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-T6:{
+W2:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-oQ:{
+D8:{
 "^":"TpZ:76;",
 $0:function(){return P.Fl(null,null)},
 $isEH:true},
 fH:{
-"^":"a;xV",
-Gp:function(a,b){var z=this.xV.II.t(0,b)
-if(z==null)throw H.b(O.Fm("getter \""+H.d(b)+"\" in "+H.d(a)))
+"^":"a;JE",
+jD:function(a,b){var z=this.JE.E4.t(0,b)
+if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
-Cq:function(a,b,c){var z=this.xV.F8.t(0,b)
-if(z==null)throw H.b(O.Fm("setter \""+H.d(b)+"\" in "+H.d(a)))
+Q1:function(a,b,c){var z=this.JE.F8.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,s
 z=null
-x=this.xV
-if(!!J.x(a).$isLz){w=x.F3.t(0,a)
-z=w==null?null:J.UQ(w,b)}else{v=x.II.t(0,b)
-z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.Fm("method \""+H.d(b)+"\" in "+H.d(a)))
+x=this.JE
+if(!!J.x(a).$isLz){w=x.t6.t(0,a)
+z=w==null?null:J.UQ(w,b)}else{v=x.E4.t(0,b)
+z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){u=X.na(z)
+if(d){u=X.OS(z)
 if(u>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
-c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.Zpg(z)
+c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.RI(z)
 x=t>=0?t:J.q8(c)
 c=X.Na(c,u,x)}}try{x=H.eC(z,c,P.Te(null))
 return x}catch(s){if(!!J.x(H.Ru(s)).$isJS){if(y!=null)P.FL(y)
 throw s}else throw s}}},
 bY:{
-"^":"a;xV",
+"^":"a;JE",
 xs:function(a,b){var z,y,x
 if(J.xC(a,b)||J.xC(b,C.AP))return!0
-for(z=this.xV,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
+for(z=this.JE,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
 if(J.xC(x,b))return!0
-if(x==null){if(!z.nX)return!1
-throw H.b(O.Fm("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
+if(x==null){if(!z.NI)return!1
+throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
 UK:function(a,b){var z=this.NW(a,b)
 return z!=null&&z.gUA()&&z.gFo()!==!0},
 n6:function(a,b){var z,y,x
-z=this.xV
-y=z.of.t(0,a)
-if(y==null){if(!z.nX)return!1
-throw H.b(O.Fm("declarations for "+H.d(a)))}x=J.UQ(y,b)
+z=this.JE
+y=z.YK.t(0,a)
+if(y==null){if(!z.NI)return!1
+throw H.b(O.lA("declarations for "+H.d(a)))}x=J.UQ(y,b)
 return x!=null&&x.gUA()&&x.gFo()===!0},
 CV:function(a,b){var z=this.NW(a,b)
-if(z==null){if(!this.xV.nX)return
-throw H.b(O.Fm("declaration for "+H.d(a)+"."+H.d(b)))}return z},
+if(z==null){if(!this.JE.NI)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.xV
+if(c.Mg){y=this.JE
 x=y.ZG.t(0,b)
-if(x==null){if(y.nX)throw H.b(O.Fm("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.Yx))z=this.Me(0,x,c)}y=this.xV
-w=y.of.t(0,b)
-if(w==null){if(!y.nX)return z
-throw H.b(O.Fm("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
+if(x==null){if(y.NI)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.nN))z=this.Me(0,x,c)}y=this.JE
+w=y.YK.t(0,b)
+if(w==null){if(!y.NI)return z
+throw H.b(O.lA("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
 if(!c.kl&&v.gZI())continue
-if(!c.IW&&v.gRS())continue
-if(c.ER&&J.cL(v)===!0)continue
+if(!c.IW&&v.gUd())continue
+if(c.ER&&J.Z6(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
-if(c.rM!=null&&c.xZ(0,J.DA(v))!==!0)continue
+if(c.rM!=null&&c.WO(0,J.DA(v))!==!0)continue
 u=c.BY
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
 NW:function(a,b){var z,y,x,w,v,u
-for(z=this.xV,y=z.ZG,x=z.of;!J.xC(a,C.AP);a=u){w=x.t(0,a)
+for(z=this.JE,y=z.ZG,x=z.YK;!J.xC(a,C.AP);a=u){w=x.t(0,a)
 if(w!=null){v=J.UQ(w,b)
 if(v!=null)return v}u=y.t(0,a)
-if(u==null){if(!z.nX)return
-throw H.b(O.Fm("superclass of \""+H.d(a)+"\""))}}return}},
+if(u==null){if(!z.NI)return
+throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;xV"},
+"^":"a;JE"},
 tk:{
-"^":"a;GB<",
-bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
-static:{Fm:function(a){return new O.tk(a)}}}}],["","",,K,{
+"^":"a;QZ<",
+bu:[function(a){return"Missing "+this.QZ+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
+static:{lA:function(a){return new O.tk(a)}}}}],["","",,K,{
 "^":"",
 nm:{
-"^":"V63;xP,rs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V64;xP,yl,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
-git:function(a){return a.rs},
-sit:function(a,b){a.rs=this.ct(a,C.B0,a.rs,b)},
+git:function(a){return a.yl},
+sit:function(a,b){a.yl=this.ct(a,C.B0,a.yl,b)},
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-vQ:[function(a,b,c){a.rs=this.ct(a,C.B0,a.rs,b)
+vQ:[function(a,b,c){a.yl=this.ct(a,C.B0,a.yl,b)
 c.$0()},"$2","gus",4,0,230,231,102],
 static:{ant:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -20854,8 +21089,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.rs=!1
-a.f4=[]
+a.yl=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20865,22 +21100,22 @@
 C.dX.LX(a)
 C.dX.XI(a)
 return a}}},
-V63:{
+V64:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,X,{
 "^":"",
 Vu:{
-"^":"V64;Jl,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gtN:function(a){return a.Jl},
-stN:function(a,b){a.Jl=this.ct(a,C.kw,a.Jl,b)},
-pA:[function(a,b){J.LE(a.Jl).wM(b)},"$1","gvC",2,0,19,102],
+"^":"V65;ju,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gtN:function(a){return a.ju},
+stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
+pA:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,19,102],
 static:{lt2:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20890,63 +21125,62 @@
 C.bg3.LX(a)
 C.bg3.XI(a)
 return a}}},
-V64:{
+V65:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,M,{
 "^":"",
-dg:function(a,b){var z,y,x,w,v,u
+iX:function(a,b){var z,y,x,w,v,u
 z=M.pNz(a,b)
 if(z==null)z=new M.XI([],null,null)
-for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
-if(u==null)continue
-if(w==null){w=Array(y.gUN(a).uR.childNodes.length)
+for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
+if(w==null){w=Array(y.gdH(a).uR.childNodes.length)
 w.fixed$length=init}if(v>=w.length)return H.e(w,v)
-w[v]=u}z.ks=w
+w[v]=u}z.qu=w
 return z},
-S0:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.pL(c,a,!1))
-for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.f8(w):null,e,f,g,null)
-if(d.ghK()){M.Xi(z).cl(a)
-if(f!=null)J.D4(M.Xi(z),f)}M.mV(z,d,e,g)
+Ch:function(a,b,c,d,e,f,g,h){var z,y,x,w
+z=b.appendChild(J.Ct(c,a,!1))
+for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.Ch(y,z,c,x?d.f8(w):null,e,f,g,null)
+if(d.ghK()){M.uH(z).rp(a)
+if(f!=null)J.NA(M.uH(z),f)}M.mV(z,d,e,g)
 return z},
-aR:function(a,b){return!!J.x(a).$isUn&&J.xC(b,"text")?"textContent":b},
+b1:function(a,b){return!!J.x(a).$iskJ&&J.xC(b,"text")?"textContent":b},
 xa:function(a){var z
 if(a==null)return
 z=J.UQ(a,"__dartBindable")
-return!!J.x(z).$isAp?z:new M.VB(a)},
+return!!J.x(z).$isAp?z:new M.dP(a)},
 fg:function(a){var z,y,x
-if(!!J.x(a).$isVB)return a.qf
+if(!!J.x(a).$isdP)return a.qf
 z=$.X3
-y=new M.Ra(z)
+y=new M.Vf(z)
 x=new M.aY(z)
-return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.Wb(a)),"deliver",y.$1(new M.SLX(a)),"__dartBindable",a],null,null))},
+return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.eT(a)),"deliver",y.$1(new M.Wb(a)),"__dartBindable",a],null,null))},
 tA:function(a){var z
-for(;z=J.ra5(a),z!=null;a=z);return a},
-cS:function(a,b){var z,y,x,w,v,u
+for(;z=J.cP(a),z!=null;a=z);return a},
+l5: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=$.nR()
+y=$.Uo()
 y.toString
-x=H.vA(a,"expando$values")
-w=x==null?null:H.vA(x,y.V2())
+x=H.of(a,"expando$values")
+w=x==null?null:H.of(x,y.V2())
 y=w==null
-if(!y&&w.gcA()!=null)v=J.yR(w.gcA(),z)
+if(!y&&w.gNK()!=null)v=J.Eh(w.gNK(),z)
 else{u=J.x(a)
-v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
+v=!!u.$isSy||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gXD()
+a=w.gLx()
 if(a==null)return}},
-nk:function(a,b,c){if(c==null)return
-return new M.iT(a,b,c)},
+ah:function(a,b,c){if(c==null)return
+return new M.hg(a,b,c)},
 pNz:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$isUn){y=S.j9(a.textContent,M.nk("text",a,b))
+if(!!z.$iskJ){y=S.iw(a.textContent,M.ah("text",a,b))
 if(y!=null)return new M.XI(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
-return S.j9(z,M.nk(b,a,c))},
+return S.iw(z,M.ah(b,a,c))},
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -20956,18 +21190,18 @@
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
-v=new M.qf(null,null,null,z,null,null)
+v=new M.qfK(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
 v.Z0=z
 x=M.rJ(a,"bind",b)
 v.lC=x
 u=M.rJ(a,"repeat",b)
 v.vJ=u
-if(z!=null&&x==null&&u==null)v.lC=S.j9("{{}}",M.nk("bind",a,b))
+if(z!=null&&x==null&&u==null)v.lC=S.iw("{{}}",M.ah("bind",a,b))
 return v}z=z.a
 return z==null?null:new M.XI(z,null,null)},
 i8:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.cf(0)
+if(b.gqz()){z=b.Bd(0)
 y=z!=null?z.$3(d,c,!0):b.Pn(0).WK(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
 w=x.gB(b)
@@ -20979,23 +21213,23 @@
 while(!0){t=x.gB(b)
 if(typeof t!=="number")return H.s(t)
 if(!(u<t))break
-z=b.cf(u)
+z=b.Bd(u)
 t=z!=null?z.$3(d,c,!1):b.Pn(u).WK(d)
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
-jb:function(a,b,c,d){var z,y,x,w,v,u,t,s
+G5:function(a,b,c,d){var z,y,x,w,v,u,t,s
 if(b.gau())return M.i8(a,b,c,d)
-if(b.gqz()){z=b.cf(0)
+if(b.gqz()){z=b.Bd(0)
 y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.jq1)
 return b.gaW()?y:new Y.cU(y,b.gPf(),null,null,null)}y=new L.nQ(null,!1,[],null,null,null,$.jq1)
-y.vS=[]
+y.z7=[]
 x=J.U6(b)
 w=0
 while(!0){v=x.gB(b)
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{u=b.AX(w)
-z=b.cf(w)
+c$0:{u=b.U0(w)
+z=b.Bd(w)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
 else y.YU(t)
@@ -21005,7 +21239,7 @@
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.RE(b)
 y=z.gCd(b)
-x=!!J.x(a).$isvy?a:M.Xi(a)
+x=!!J.x(a).$ishs?a:M.uH(a)
 w=J.U6(y)
 v=J.RE(x)
 u=0
@@ -21014,78 +21248,78 @@
 if(!(u<t))break
 s=w.t(y,u)
 r=w.t(y,u+1)
-q=v.nR(x,s,M.jb(s,r,a,c),r.gau())
+q=v.nR(x,s,M.G5(s,r,a,c),r.gau())
 if(q!=null&&!0)d.push(q)
 u+=2}v.lL(x)
-if(!z.$isqf)return
-p=M.Xi(a)
+if(!z.$isqfK)return
+p=M.uH(a)
 p.sQk(c)
 o=p.KI(b)
 if(o!=null&&!0)d.push(o)},
-Xi:function(a){var z,y,x,w
-z=$.as()
+uH:function(a){var z,y,x,w
+z=$.rw()
 z.toString
-y=H.vA(a,"expando$values")
-x=y==null?null:H.vA(y,z.V2())
+y=H.of(a,"expando$values")
+x=y==null?null:H.of(y,z.V2())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.bq.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
 else w=!1
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,P.XY(a),null):new M.vy(a,P.XY(a),null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,P.kW(a),null):new M.hs(a,P.kW(a),null)
 z.u(0,a,x)
 return x},
 CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.bq.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
 return z},
-vE:{
+VE:{
 "^":"a;oe",
 op:function(a,b,c){return},
 static:{"^":"ac"}},
 XI:{
-"^":"a;Cd>,ks>,rz>",
+"^":"a;Cd>,qu>,rz>",
 ghK:function(){return!1},
-f8:function(a){var z=this.ks
+f8:function(a){var z=this.qu
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
-qf:{
-"^":"XI;Z0,lC,vJ,Cd,ks,rz",
+qfK:{
+"^":"XI;Z0,lC,vJ,Cd,qu,rz",
 ghK:function(){return!0},
-$isqf:true},
-vy:{
+$isqfK:true},
+hs:{
 "^":"a;KB<,qf,qL?",
 gCd:function(a){var z=J.UQ(this.qf,"bindings_")
 if(z==null)return
 return new M.lb(this.gKB(),z)},
 sCd:function(a,b){var z=this.gCd(this)
-if(z==null){J.kW(this.qf,"bindings_",P.jT(P.Fl(null,null)))
+if(z==null){J.qQ(this.qf,"bindings_",P.jT(P.Fl(null,null)))
 z=this.gCd(this)}z.FV(0,b)},
-nR:function(a,b,c,d){b=M.aR(this.gKB(),b)
+nR:function(a,b,c,d){b=M.b1(this.gKB(),b)
 if(!d&&!!J.x(c).$isAp)c=M.fg(c)
 return M.xa(this.qf.V7("bind",[b,c,d]))},
 lL:function(a){return this.qf.nQ("bindFinished")},
-gmb:function(a){var z=this.qL
+gCn:function(a){var z=this.qL
 if(z!=null);else if(J.Lp(this.gKB())!=null){z=J.Lp(this.gKB())
-z=J.re(!!J.x(z).$isvy?z:M.Xi(z))}else z=null
+z=J.OC(!!J.x(z).$ishs?z:M.uH(z))}else z=null
 return z},
-$isvy:true},
+$ishs:true},
 lb:{
 "^":"ilb;KB<,dn<",
 gvc:function(a){return J.kl(J.UQ($.Xw(),"Object").V7("keys",[this.dn]),new M.Tl(this))},
-t:function(a,b){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
+t:function(a,b){if(!!J.x(this.KB).$iskJ&&J.xC(b,"text"))b="textContent"
 return M.xa(J.UQ(this.dn,b))},
-u:function(a,b,c){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
-J.kW(this.dn,b,M.fg(c))},
+u:function(a,b,c){if(!!J.x(this.KB).$iskJ&&J.xC(b,"text"))b="textContent"
+J.qQ(this.dn,b,M.fg(c))},
 Rz:[function(a,b){var z,y,x
 z=this.KB
-b=M.aR(z,b)
+b=M.b1(z,b)
 y=this.dn
-x=M.xa(J.UQ(y,M.aR(z,b)))
+x=M.xa(J.UQ(y,M.b1(z,b)))
 y.Ji(b)
 return x},"$1","gUS",2,0,233,58],
 V1:function(a){J.Me(this.gvc(this),this.gUS(this))},
@@ -21093,17 +21327,17 @@
 $asT8:function(){return[P.qU,A.Ap]}},
 Tl:{
 "^":"TpZ:12;a",
-$1:[function(a){return!!J.x(this.a.KB).$isUn&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
+$1:[function(a){return!!J.x(this.a.KB).$iskJ&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
 $isEH:true},
-VB:{
+dP:{
 "^":"Ap;qf",
 TR:function(a,b){return this.qf.V7("open",[$.X3.mS(b)])},
 xO:function(a){return this.qf.nQ("close")},
 gP:function(a){return this.qf.nQ("discardChanges")},
 sP:function(a,b){this.qf.V7("setValue",[b])},
 fR:function(){return this.qf.nQ("deliver")},
-$isVB:true},
-Ra:{
+$isdP:true},
+Vf:{
 "^":"TpZ:12;a",
 $1:function(a){return this.a.xi(a,!1)},
 $isEH:true},
@@ -21127,80 +21361,80 @@
 "^":"TpZ:76;f",
 $0:[function(){return J.Vm(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Wb:{
+eT:{
 "^":"TpZ:12;UI",
 $1:[function(a){J.Fc(this.UI,a)
 return a},"$1",null,2,0,null,180,"call"],
 $isEH:true},
-SLX:{
+Wb:{
 "^":"TpZ:76;bK",
 $0:[function(){return this.bK.fR()},"$0",null,0,0,null,"call"],
 $isEH:true},
 qU9:{
-"^":"a;k8>,tA,MC"},
+"^":"a;k8>,tA,ip"},
 DT:{
-"^":"vy;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
+"^":"hs;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
 gKB:function(){return this.KB},
 nR:function(a,b,c,d){var z,y
-if(!J.xC(b,"ref"))return M.vy.prototype.nR.call(this,this,b,c,d)
-z=d?c:J.mu(c,new M.De(this))
+if(!J.xC(b,"ref"))return M.hs.prototype.nR.call(this,this,b,c,d)
+z=d?c:J.mu(c,new M.Aj(this))
 J.Vs(this.KB).dA.setAttribute("ref",z)
 this.NB()
 if(d)return
 if(this.gCd(this)==null)this.sCd(0,P.Fl(null,null))
 y=this.gCd(this)
-J.kW(y.dn,M.aR(y.KB,"ref"),M.fg(c))
+J.qQ(y.dn,M.b1(y.KB,"ref"),M.fg(c))
 return c},
 KI:function(a){var z=this.kr
-if(z!=null)z.la()
+if(z!=null)z.qT()
 if(a.Z0==null&&a.lC==null&&a.vJ==null){z=this.kr
 if(z!=null){z.xO(0)
 this.kr=null}return}z=this.kr
 if(z==null){z=new M.TGm(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
 this.kr=z}z.FE(a,this.Qk)
-J.ZW($.ik(),this.KB,["ref"],!0)
+J.ZW($.TQ(),this.KB,["ref"],!0)
 return this.kr},
-v3:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+eX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(c==null)c=this.Rc
 z=this.XA
-if(z==null){z=this.gPI()
-z=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
+if(z==null){z=this.gws()
+z=J.ti(!!J.x(z).$ishs?z:M.uH(z))
 this.XA=z}y=J.RE(z)
 if(y.gNL(z)==null)return $.zl()
 x=c==null?$.Bu():c
 w=x.oe
 if(w==null){w=H.VM(new P.qo(null),[null])
 x.oe=w}v=w.t(0,z)
-if(v==null){v=M.dg(z,x)
+if(v==null){v=M.iX(z,x)
 x.oe.u(0,z,v)}w=this.dK
-if(w==null){u=J.lu(this.KB)
-w=$.Ou()
+if(w==null){u=J.Do(this.KB)
+w=$.MO()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
-$.Ks().u(0,t,!0)
+$.Tg().u(0,t,!0)
 M.AL(t)
 w.u(0,u,t)}this.dK=t
-w=t}s=J.O2(w)
+w=t}s=J.bs(w)
 w=[]
-r=new M.Fi(w,null,null,null)
-q=$.nR()
-r.XD=this.KB
-r.cA=z
+r=new M.qdK(w,null,null,null)
+q=$.Uo()
+r.Lx=this.KB
+r.NK=z
 q.u(0,s,r)
 p=new M.qU9(b,null,null)
-M.Xi(s).sqL(p)
+M.uH(s).sqL(p)
 for(o=y.gNL(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
 l=z?v.f8(n):null
-k=M.S0(o,s,this.dK,l,b,c,w,null)
-M.Xi(k).sqL(p)
+k=M.Ch(o,s,this.dK,l,b,c,w,null)
+M.uH(k).sqL(p)
 if(m)r.yi=k}p.tA=s.firstChild
-p.MC=s.lastChild
-r.cA=null
-r.XD=null
+p.ip=s.lastChild
+r.NK=null
+r.Lx=null
 return s},
 gk8:function(a){return this.Qk},
-gA0:function(a){return this.Rc},
-sA0:function(a,b){var z
+gG5:function(a){return this.Rc},
+sG5:function(a,b){var z
 if(this.Rc!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
 this.Rc=b
 this.Fe=null
@@ -21210,15 +21444,15 @@
 z.Mv=null}},
 NB:function(){var z,y
 if(this.kr!=null){z=this.XA
-y=this.gPI()
-y=J.f5(!!J.x(y).$isvy?y:M.Xi(y))
+y=this.gws()
+y=J.ti(!!J.x(y).$ishs?y:M.uH(y))
 y=z==null?y==null:z===y
 z=y}else z=!0
 if(z)return
 this.XA=null
 this.kr.Oo(null)
 z=this.kr
-z.OP(z.Tf())},
+z.kY(z.Tf())},
 V1:function(a){var z,y
 this.Qk=null
 this.Rc=null
@@ -21229,62 +21463,62 @@
 y.Oo(null)
 this.kr.xO(0)
 this.kr=null},
-gPI:function(){var z,y
+gws:function(){var z,y
 this.xk()
-z=M.cS(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
+z=M.l5(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
 if(z==null){z=this.Gw
-if(z==null)return this.KB}y=M.Xi(z).gPI()
+if(z==null)return this.KB}y=M.uH(z).gws()
 return y!=null?y:z},
 grz:function(a){var z
 this.xk()
 z=this.Yz
-return z!=null?z:H.Go(this.KB,"$isOH").content},
-cl:function(a){var z,y,x,w,v,u,t
+return z!=null?z:H.Go(this.KB,"$isyY").content},
+rp:function(a){var z,y,x,w,v,u,t
 if(this.CS===!0)return!1
 M.oR()
 M.hb()
 this.CS=!0
-z=!!J.x(this.KB).$isOH
+z=!!J.x(this.KB).$isyY
 y=!z
 if(y){x=this.KB
 w=J.RE(x)
-if(w.gQg(x).dA.hasAttribute("template")===!0&&C.bq.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+if(w.gQg(x).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
 v=M.pZ(this.KB)
-v=!!J.x(v).$isvy?v:M.Xi(v)
+v=!!J.x(v).$ishs?v:M.uH(v)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isOH
+z=!!J.x(v.gKB()).$isyY
 u=!0}else{x=this.KB
 w=J.RE(x)
-if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
+if(w.gq5(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
 w=J.RE(x)
-t=w.gJ8(x).createElement("template",null)
+t=w.gM0(x).createElement("template",null)
 w.gAd(x).insertBefore(t,x)
 t.toString
 new W.E9(t).FV(0,w.gQg(x))
 w.gQg(x).V1(0)
 w.wg(x)
-v=!!J.x(t).$isvy?t:M.Xi(t)
+v=!!J.x(t).$ishs?t:M.uH(t)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isOH}else{v=this
+z=!!J.x(v.gKB()).$isyY}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sYz(J.O2(M.TA(v.gKB())))
+u=!1}if(!z)v.sYz(J.bs(M.TA(v.gKB())))
 if(a!=null)v.sGw(a)
-else if(y)M.O1(v,this.KB,u)
-else M.hM(J.f5(v))
+else if(y)M.KE(v,this.KB,u)
+else M.Af(J.ti(v))
 return!0},
-xk:function(){return this.cl(null)},
+xk:function(){return this.rp(null)},
 $isDT:true,
-static:{"^":"Ub,v2,YO,vU,Xa,joK",TA:function(a){var z,y,x,w
-z=J.lu(a)
+static:{"^":"Ub,Xi,YO,vU,Hg,joK",TA:function(a){var z,y,x,w
+z=J.Do(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.B8().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
 if(w!=null)w.removeChild(x)}$.B8().u(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
-y=z.gJ8(a).createElement("template",null)
+y=z.gM0(a).createElement("template",null)
 z.gAd(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
 switch(w){case"template":v=z.gQg(a).dA
 v.getAttribute(w)
 v.removeAttribute(w)
@@ -21294,27 +21528,27 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},O1:function(a,b,c){var z,y,x,w
-z=J.f5(a)
+break}}return y},KE:function(a,b,c){var z,y,x,w
+z=J.ti(a)
 if(c){J.y2(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gNL(b),w!=null;)x.mx(z,w)},hM:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gNL(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
 z=new M.CE()
-y=J.We(a,$.S1())
+y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
 J.t3(z,H.d($.S1())+" { display: none; }")
 document.head.appendChild(z)},hb:function(){var z,y
-if($.Xa===!0)return
-$.Xa=!0
+if($.Hg===!0)return
+$.Hg=!0
 z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
+if(!!J.x(z).$isyY){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
 if(J.lL(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
-J.dc(z,document.baseURI)
+J.PS(z,document.baseURI)
 J.lL(a).appendChild(z)}}},
-De:{
+Aj:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 J.Vs(z.KB).dA.setAttribute("ref",a)
@@ -21322,26 +21556,26 @@
 $isEH:true},
 CE:{
 "^":"TpZ:19;",
-$1:function(a){if(!M.Xi(a).cl(null))M.hM(J.f5(!!J.x(a).$isvy?a:M.Xi(a)))},
+$1:function(a){if(!M.uH(a).rp(null))M.Af(J.ti(!!J.x(a).$ishs?a:M.uH(a)))},
 $isEH:true},
-DOe:{
+W6o:{
 "^":"TpZ:12;",
 $1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,141,"call"],
 $isEH:true},
-Ufa:{
+YJG:{
 "^":"TpZ:81;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.Xi(J.l2(z.gl())).NB()},"$2",null,4,0,null,183,13,"call"],
+for(z=J.mY(a);z.G();)M.uH(J.l2(z.gl())).NB()},"$2",null,4,0,null,183,13,"call"],
 $isEH:true},
-Raa:{
+DOe:{
 "^":"TpZ:76;",
 $0:function(){var z=document.createDocumentFragment()
-$.nR().u(0,z,new M.Fi([],null,null,null))
+$.Uo().u(0,z,new M.qdK([],null,null,null))
 return z},
 $isEH:true},
-Fi:{
-"^":"a;dn<,yi<,XD<,cA<"},
-iT:{
+qdK:{
+"^":"a;dn<,yi<,Lx<,NK<"},
+hg:{
 "^":"TpZ:12;a,b,c",
 $1:function(a){return this.c.op(a,this.a,this.b)},
 $isEH:true},
@@ -21352,7 +21586,7 @@
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
 else z=!1
 if(z)return
-y=S.j9(b,M.nk(a,this.b,this.c))
+y=S.iw(b,M.ah(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
@@ -21362,11 +21596,11 @@
 z.push(y)}},
 $isEH:true},
 TGm:{
-"^":"Ap;yQ,tM,nH,dO,vx,Up,h6,dz,Gi,vj,lH,AB,z1,iz,Mv",
+"^":"Ap;kb,tM,nH,dO,TE,Up,h6,RS,Gi,vj,lH,AB,z1,iz,Mv",
 ln:function(a){return this.iz.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.h6},
-la:function(){var z,y
+qT:function(){var z,y
 z=this.Up
 y=J.x(z)
 if(!!y.$isAp){y.xO(z)
@@ -21375,14 +21609,14 @@
 if(!!y.$isAp){y.xO(z)
 this.h6=null}},
 FE:function(a,b){var z,y,x,w,v
-this.la()
-z=this.yQ.KB
+this.qT()
+z=this.kb.KB
 y=a.Z0
 x=y!=null
-this.dz=x
+this.RS=x
 this.Gi=a.vJ!=null
 if(x){this.vj=y.au
-w=M.jb("if",y,z,b)
+w=M.G5("if",y,z,b)
 this.Up=w
 y=this.vj===!0
 if(y)x=!(null!=w&&!1!==w)
@@ -21391,11 +21625,11 @@
 return}if(!y)w=H.Go(w,"$isAp").TR(0,this.ge7())}else w=!0
 if(this.Gi===!0){y=a.vJ
 this.lH=y.au
-y=M.jb("repeat",y,z,b)
+y=M.G5("repeat",y,z,b)
 this.h6=y
 v=y}else{y=a.lC
 this.lH=y.au
-y=M.jb("bind",y,z,b)
+y=M.G5("bind",y,z,b)
 this.h6=y
 v=y}if(this.lH!==!0)v=J.mu(v,this.gVN())
 if(!(null!=w&&!1!==w)){this.Oo(null)
@@ -21406,8 +21640,8 @@
 return!(null!=y&&y)?J.Vm(z):z},
 YSS:[function(a){if(!(null!=a&&!1!==a)){this.Oo(null)
 return}this.Ca(this.Tf())},"$1","ge7",2,0,19,235],
-OP:[function(a){var z
-if(this.dz===!0){z=this.Up
+kY:[function(a){var z
+if(this.RS===!0){z=this.Up
 if(this.vj!==!0){H.Go(z,"$isAp")
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Oo([])
 return}}this.Ca(a)},"$1","gVN",2,0,19,20],
@@ -21424,85 +21658,85 @@
 y=y!=null?y:[]
 this.LA(G.jj(y,0,J.q8(y),z,0,z.length))},
 Dk:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.yQ.KB
-z=$.nR()
+if(J.xC(a,-1))return this.kb.KB
+z=$.Uo()
 y=this.tM
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
 x=z.t(0,y[a]).gyi()
 if(x==null)return this.Dk(a-1)
-if(!M.CF(x)||x===this.yQ.KB)return x
-w=M.Xi(x).gkr()
+if(!M.CF(x)||x===this.kb.KB)return x
+w=M.uH(x).gkr()
 if(w==null)return x
 return w.Dk(w.tM.length-1)},
-C8:function(a){var z,y,x,w,v,u,t
+eS:function(a){var z,y,x,w,v,u,t
 z=this.Dk(J.bI(a,1))
 y=this.Dk(a)
-J.ra5(this.yQ.KB)
+J.cP(this.kb.KB)
 x=C.Nm.W4(this.tM,a)
 for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
 if(u==null?y==null:u===y)y=z
 t=u.parentNode
 if(t!=null)t.removeChild(u)
 w.mx(x,u)}return x},
-LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-if(this.vx||J.FN(a)===!0)return
-u=this.yQ
+LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d
+if(this.TE||J.FN(a)===!0)return
+u=this.kb
 t=u.KB
-if(J.ra5(t)==null){this.xO(0)
+if(J.cP(t)==null){this.xO(0)
 return}s=this.nH
-Q.Oi(s,this.dO,a)
+Q.Y5p(s,this.dO,a)
 z=u.Rc
 if(!this.z1){this.z1=!0
-r=J.qy(!!J.x(u.KB).$isDT?u.KB:u)
-if(r!=null){this.iz=r.Mn.CE(t)
+r=J.Ee(!!J.x(u.KB).$isDT?u.KB:u)
+if(r!=null){this.iz=r.xI.CE(t)
 this.Mv=null}}q=P.YM(P.XK(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.Ff
-i=this.C8(J.WB(k.gvH(m),n))
+for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
+i=this.eS(J.WB(k.gvH(m),n))
 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.WB(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
+n-=l}for(p=p.gA(a),o=this.tM;p.G();){m=p.gl()
+for(l=J.RE(m),h=l.gvH(m);J.u6(h,J.WB(l.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
 y=s[h]
 x=q.Rz(0,y)
 if(x==null)try{if(this.iz!=null)y=this.ln(y)
 if(y==null)x=$.zl()
-else x=u.v3(0,y,z)}catch(g){l=H.Ru(g)
-w=l
+else x=u.eX(0,y,z)}catch(g){k=H.Ru(g)
+w=k
 v=new H.oP(g,null)
-l=new P.Gc(0,$.X3,null,null,null,null,null,null)
-l.$builtinTypeInfo=[null]
-new P.Zf(l).$builtinTypeInfo=[null]
-k=w
-if(k==null)H.vh(P.u("Error must not be null"))
-if(l.YM!==0)H.vh(P.w("Future already completed"))
-l.Nk(k,v)
-x=$.zl()}l=x
-f=this.Dk(h-1)
-e=J.ra5(u.KB)
-C.Nm.xe(this.tM,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.Ff)},"$1","gSp",2,0,236,237],
+k=new P.Gc(0,$.X3,null,null,null,null,null,null)
+k.$builtinTypeInfo=[null]
+new P.Zf(k).$builtinTypeInfo=[null]
+f=w
+if(f==null)H.vh(P.u("Error must not be null"))
+if(k.YM!==0)H.vh(P.w("Future already completed"))
+k.Nk(f,v)
+x=$.zl()}k=x
+e=this.Dk(h-1)
+d=J.cP(u.KB)
+C.Nm.aP(o,h,k)
+d.insertBefore(k,J.p7(e))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.lo)},"$1","gSp",2,0,236,237],
 vB:[function(a){var z,y
-z=$.nR()
+z=$.Uo()
 z.toString
-y=H.vA(a,"expando$values")
-for(z=J.mY((y==null?null:H.vA(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,238],
+y=H.of(a,"expando$values")
+for(z=J.mY((y==null?null:H.of(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,238],
 ud:function(){var z=this.AB
 if(z==null)return
 z.Gv()
 this.AB=null},
 xO:function(a){var z
-if(this.vx)return
+if(this.TE)return
 this.ud()
 z=this.tM
 H.bQ(z,this.gJO())
 C.Nm.sB(z,0)
-this.la()
-this.yQ.kr=null
-this.vx=!0}}}],["","",,S,{
+this.qT()
+this.kb.kr=null
+this.TE=!0}}}],["","",,S,{
 "^":"",
 VH2:{
-"^":"a;qN,au<,ll",
+"^":"a;qN,au<,PS",
 gqz:function(){return this.qN.length===5},
 gaW:function(){var z,y
 z=this.qN
@@ -21511,10 +21745,10 @@
 if(J.xC(z[0],"")){if(4>=z.length)return H.e(z,4)
 z=J.xC(z[4],"")}else z=!1}else z=!1
 return z},
-gPf:function(){return this.ll},
+gPf:function(){return this.PS},
 qm:function(a){return this.gPf().$1(a)},
 gB:function(a){return C.jn.BU(this.qN.length,4)},
-AX:function(a){var z,y
+U0:function(a){var z,y
 z=this.qN
 y=a*4+1
 if(y>=z.length)return H.e(z,y)
@@ -21524,7 +21758,7 @@
 y=a*4+2
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-cf:function(a){var z,y
+Bd:function(a){var z,y
 z=this.qN
 y=a*4+3
 if(y>=z.length)return H.e(z,y)
@@ -21548,24 +21782,25 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.IN+=typeof s==="string"?s:H.d(s)}return y.IN},"$1","gYF",2,0,240,241],
-l3:function(a,b){this.ll=this.qN.length===5?this.gSG():this.gYF()},
-static:{"^":"rz5,xN8,t3a,epG,UO,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+y.IN+=typeof s==="string"?s:H.d(s)}z=y.IN
+return z.charCodeAt(0)==0?z:z},"$1","gYF",2,0,240,241],
+l3:function(a,b){this.PS=this.qN.length===5?this.gSG():this.gYF()},
+static:{"^":"rz5,xN8,t3a,epG,UO,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 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)
+s=C.yo.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
+p="}}"}o=t>=0?C.yo.XU(a,p,t+2):-1
 if(o<0){if(w==null)return
-w.push(C.xB.yn(a,v))
+w.push(C.yo.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(C.yo.Nj(a,v,t))
+n=C.yo.DY(C.yo.Nj(a,t+2,o))
 w.push(q)
 u=u&&q
 m=y?null:b.$1(n)
@@ -21599,53 +21834,45 @@
 ez:function(a,b){return this.Ir.$1(b)},
 $islX:true},
 KZ:{
-"^":"d3;RV,NP,Rk*,ro,XY,cU",
+"^":"d3;RV,NP,Rk*,ro,XY,iS",
 Gv:function(){this.RV.Gv()},
-ab:[function(a,b,c){var z=new Z.lX(J.Cl(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
+AS:[function(a,b,c){var z=new Z.lX(J.Ts(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
 z.Ir=Z.d8(c)
-J.bi(this.Rk,z)
-return z},function(a,b){return this.ab(a,b,null)},"ZF","$2$map","$1","gtN",2,3,242,22,243,206],
+J.dH(this.Rk,z)
+return z},function(a,b){return this.AS(a,b,null)},"WL","$2$map","$1","gtN",2,3,242,22,243,206],
 l8:function(){var z=new P.VV(null,null)
-H.Xe()
+H.w4()
 $.Ji=$.xG
 this.NP=z
-z.D5(0)
-this.RV=N.QM("").gSZ().yI(new Z.Ym(this))
+z.wE(0)
+this.RV=N.QM("").gSZ().yI(new Z.QC(this))
 this.NP.CH(0)
-J.Z8(this.Rk)},
-static:{"^":"ax",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
+J.U2(this.Rk)},
+static:{"^":"hm",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
 z.l8()
 return z}}},
-Ym:{
+QC:{
 "^":"TpZ:170;a",
-$1:[function(a){this.a.ZF(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
+$1:[function(a){this.a.WL(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
-GMB:{
-"^":"mW;f9,D1,fO",
-gA:function(a){var z,y
-z=this.D1
-y=this.fO
-if(typeof y!=="number")return H.s(y)
-return new G.vZG(this.f9,z-1,z+y)},
+YZ:{
+"^":"mW;N3,Mn,fO",
+gA:function(a){var z=this.Mn
+return new G.ay(this.N3,z-1,z+this.fO)},
 gB:function(a){return this.fO},
-a0:function(a,b,c){var z,y,x
-z=this.D1
-if(z>this.f9.vF.length)throw H.b(P.N(z))
-y=this.fO
-if(y!=null){if(typeof y!=="number")return y.C()
-x=y<0}else x=!1
-if(x)throw H.b(P.N(y))
-if(typeof y!=="number")return y.g()
-z=y+z
-if(z>this.f9.vF.length)throw H.b(P.N(z))},
+a0:function(a,b,c){var z=this.Mn
+if(z>this.N3.Bx.length)throw H.b(P.N(z))
+if(this.fO<0)throw H.b(P.N(this.fO))
+z=this.fO+z
+if(z>this.N3.Bx.length)throw H.b(P.N(z))},
 $asmW:function(){return[null]},
 $asQV:function(){return[null]}},
-vZG:{
-"^":"a;f9,D1,c0",
-gl:function(){return C.xB.j(this.f9.vF,this.D1)},
-G:function(){return++this.D1<this.c0},
-eR:function(a,b){this.D1+=b}}}],["","",,Z,{
+ay:{
+"^":"a;N3,Mn,c0",
+gl:function(){return C.yo.j(this.N3.Bx,this.Mn)},
+G:function(){return++this.Mn<this.c0},
+eR:function(a,b){this.Mn+=b}}}],["","",,Z,{
 "^":"",
 kb:{
 "^":"a;aH,Rr,O4",
@@ -21654,26 +21881,26 @@
 G:function(){var z,y,x,w,v,u
 this.O4=null
 z=this.aH
-y=++z.D1
+y=++z.Mn
 x=z.c0
 if(y>=x)return!1
-w=z.f9.vF
-v=C.xB.j(w,y)
+w=z.N3.Bx
+v=C.yo.j(w,y)
 if(v>=55296)y=v>57343&&v<=65535
 else y=!0
 if(y)this.O4=v
-else if(v<56320&&++z.D1<x){u=C.xB.j(w,z.D1)
+else if(v<56320&&++z.Mn<x){u=C.yo.j(w,z.Mn)
 if(u>=56320&&u<=57343)this.O4=(v-55296<<10>>>0)+(65536+(u-56320))
-else{if(u>=55296&&u<56320)--z.D1
+else{if(u>=55296&&u<56320)--z.Mn
 this.O4=this.Rr}}else this.O4=this.Rr
 return!0}}}],["","",,U,{
 "^":"",
 LQ:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.vF.length-b
-new G.GMB(a,b,z).a0(a,b,c)
+z=a.Bx.length-b
+new G.YZ(a,b,z).a0(a,b,c)
 z=b+z
 y=b-1
-x=new Z.kb(new G.vZG(a,y,z),d,null)
+x=new Z.kb(new G.ay(a,y,z),d,null)
 w=H.VM(Array(z-y-1),[P.KN])
 for(z=w.length,v=0;x.G();v=u){u=v+1
 y=x.O4
@@ -21686,25 +21913,25 @@
 return t}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V65;GG,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V66;GG,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gN:function(a){return a.GG},
-sN:function(a,b){a.GG=this.ct(a,C.ft,a.GG,b)},
+sN:function(a,b){a.GG=this.ct(a,C.pD,a.GG,b)},
 ghS:function(a){var z=a.GG
 if(z==null)return!1
 return z.gA9()},
 gnI:function(a){var z=$.Kh.Nv
 if(z==null)return!1
 return J.xC(H.Go(z,"$isKM").N,a.GG)},
-xX:[function(a,b,c,d){var z,y,x,w
+f8D:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
-y=z.gEV(b)
+y=z.gAy(b)
 if(typeof y!=="number")return y.D()
-if(y>0||z.gNl(b)===!0||z.gEX(b)===!0||z.gqx(b)===!0||z.gYK(b)===!0)return
-z.e6(b)
+if(y>0||z.gNl(b)===!0||z.gTu(b)===!0||z.gkA(b)===!0||z.gw4(b)===!0)return
+z.TI(b)
 x=$.Kh.Nv
 if(x==null||!J.xC(J.l2(x),a.GG)){z=$.Kh
 y=a.GG
-y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).dA.getAttribute("href")
 $.Kh.Z6.bo(0,w)},"$3","gkD",6,0,171,87,106,186],
@@ -21723,7 +21950,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21733,35 +21960,35 @@
 C.J57.LX(a)
 C.J57.XI(a)
 return a}}},
-V65:{
+V66:{
 "^":"uL+Pi;",
 $isd3:true},
 D2:{
-"^":"V66;ot,YE,E6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V67;ot,KW,E6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gvm:function(a){return a.ot},
 svm:function(a,b){a.ot=this.ct(a,C.uX,a.ot,b)},
-gHL:function(a){return a.YE},
-sHL:function(a,b){a.YE=this.ct(a,C.oE,a.YE,b)},
+gHL:function(a){return a.KW},
+sHL:function(a,b){a.KW=this.ct(a,C.oE,a.KW,b)},
 gFK:function(a){return a.E6},
 sFK:function(a,b){a.E6=this.ct(a,C.am,a.E6,b)},
-yY:function(a){this.iW(a)},
+yY:function(a){this.Wd(a)},
 VP:function(a,b){if(J.co(b,"ws://"))return b
 return"ws://"+H.d(b)+"/ws"},
 nyC:[function(a,b,c,d){var z,y,x
-J.fD(b)
+J.jD(b)
 z=this.VP(a,a.ot)
-d=$.Kh.m2.TP(z)
+d=$.Kh.m2.J8(z)
 y=$.Kh
-x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,116,2,106,107],
-pe:[function(a,b,c,d){J.fD(b)
-this.iW(a)},"$3","gzG",6,0,116,2,106,107],
-iW:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
+$.Kh.Z6.bo(0,"#/vm")},"$3","guZ",6,0,116,2,106,107],
+jLH:[function(a,b,c,d){J.jD(b)
+this.Wd(a)},"$3","gzG",6,0,116,2,106,107],
+Wd:function(a){G.QX(a.KW).ml(new V.Vn(a)).OA(new V.oU(a))},
 Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
-static:{Hr:function(a){var z,y,x,w,v
+static:{n5p:function(a){var z,y,x,w,v
 z=Q.pT(null,L.Z5)
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -21769,9 +21996,9 @@
 w=P.Fl(null,null)
 v=P.Fl(null,null)
 a.ot=""
-a.YE="localhost:9222"
+a.KW="localhost:9222"
 a.E6=z
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
@@ -21782,14 +22009,14 @@
 C.aXh.XI(a)
 C.aXh.Kq(a)
 return a}}},
-V66:{
+V67:{
 "^":"uL+Pi;",
 $isd3:true},
 Vn:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w
 z=this.a
-J.Z8(z.E6)
+J.U2(z.E6)
 if(a==null)return
 y=J.U6(a)
 x=0
@@ -21797,23 +22024,23 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,244,"call"],
+J.dH(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,244,"call"],
 $isEH:true},
 oU:{
 "^":"TpZ:12;b",
-$1:[function(a){J.Z8(this.b.E6)},"$1",null,2,0,null,2,"call"],
+$1:[function(a){J.U2(this.b.E6)},"$1",null,2,0,null,2,"call"],
 $isEH:true}}],["","",,X,{
 "^":"",
 I5:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{yC:function(a){var z,y,x,w
+"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{vC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Pe=!1
-a.f4=[]
+a.R1=!1
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21825,7 +22052,7 @@
 return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V67;uB,lc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V68;uB,lc,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
@@ -21837,17 +22064,17 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.f4=[]
+a.Iy=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Hd.LX(a)
-C.Hd.XI(a)
+C.Tkx.LX(a)
+C.Tkx.XI(a)
 return a}}},
-V67:{
+V68:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
@@ -21855,15 +22082,15 @@
 ;(function(){var z=!0,y
 y=P.KN
 y.$isKN=z
-y.$islf=z
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
-y=P.Vf
-y.$isVf=z
-y.$islf=z
+y=P.CP
+y.$isCP=z
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
 y=W.KV
 y.$isKV=z
@@ -21874,11 +22101,11 @@
 y.$isfRn=z
 y.$asfRn=[P.qU]
 y.$isa=z
-W.QI.$isa=z
-y=P.lf
-y.$islf=z
+W.M5K.$isa=z
+y=P.FK
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
 y=N.Ng
 y.$isfRn=z
@@ -21889,61 +22116,61 @@
 y.$isfRn=z
 y.$asfRn=[P.a6]
 y.$isa=z
-y=W.h4
-y.$ish4=z
-y.$isKV=z
-y.$isa=z
+P.a.$isa=z
+P.Od.$isa=z
 y=P.WO
 y.$isWO=z
 y.$isQV=z
 y.$isa=z
-P.Od.$isa=z
-P.oz.$isa=z
-P.a.$isa=z
 y=A.Ap
 y.$isAp=z
 y.$isa=z
-y=K.Aep
-y.$isAep=z
+P.oz.$isa=z
+y=W.h4
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=K.O1
+y.$isO1=z
 y.$isa=z
 y=U.x06
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.FH
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.uku
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.fp
 y.$isfp=z
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.nu
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.Mm
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
-y=U.c0
-y.$isrx=z
+y=U.c09
+y.$ishw=z
 y.$isa=z
-y=U.noG
-y.$isrx=z
+y=U.Dv
+y.$ishw=z
 y.$isa=z
 y=U.RWc
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.vn
 y.$isvn=z
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
 y=U.x9
-y.$isrx=z
+y.$ishw=z
 y.$isa=z
-y=U.WH
-y.$isWH=z
-y.$isrx=z
+y=U.EO
+y.$isEO=z
+y.$ishw=z
 y.$isa=z
 y=P.IN
 y.$isIN=z
@@ -21955,12 +22182,19 @@
 y=T.yj
 y.$isyj=z
 y.$isa=z
-y=W.Iv
-y.$ish4=z
-y.$isKV=z
+F.d3.$isa=z
+A.XP.$isa=z
+W.O7.$isa=z
+y=P.SQ
+y.$isSQ=z
 y.$isa=z
-y=L.U2
-y.$isU2=z
+G.MQ.$isa=z
+y=D.Mk
+y.$isMk=z
+y.$isaf=z
+y.$isa=z
+y=L.Z8
+y.$isZ8=z
 y.$isa=z
 y=D.af
 y.$isaf=z
@@ -21968,15 +22202,14 @@
 y=D.bv
 y.$isaf=z
 y.$isa=z
+y=G.Zq
+y.$isZq=z
+y.$isyj=z
+y.$isa=z
 D.ta.$isa=z
 D.ER.$isa=z
-y=D.vO
-y.$isvO=z
+y=D.xB
 y.$isaf=z
-y.$isqC=z
-y.$asqC=[null,null]
-y.$isT8=z
-y.$asT8=[null,null]
 y.$isa=z
 y=D.Kp
 y.$isaf=z
@@ -21998,80 +22231,46 @@
 y.$isvx=z
 y.$isaf=z
 y.$isa=z
+D.xb.$isa=z
+D.br.$isa=z
 D.c2.$isa=z
-y=G.Zq
-y.$isZq=z
-y.$isyj=z
-y.$isa=z
-y=W.BI
-y.$isea=z
-y.$isa=z
-y=W.ea
-y.$isea=z
-y.$isa=z
-y=W.cxu
-y.$iscxu=z
-y.$isea=z
-y.$isa=z
-y=P.Ol
+y=P.z5
 y.$isQV=z
 y.$isa=z
-y=P.SQ
-y.$isSQ=z
-y.$isa=z
-y=W.ew7
-y.$isea=z
-y.$isa=z
-D.Z9.$isa=z
-W.fJ.$isa=z
-y=G.Y2
-y.$isY2=z
-y.$isa=z
-y=D.kx
-y.$iskx=z
-y.$isaf=z
-y.$isa=z
-D.D5.$isa=z
-F.d3.$isa=z
-A.So.$isa=z
-y=W.AjY
-y.$isAjY=z
-y.$isea=z
-y.$isa=z
-G.OS.$isa=z
-y=D.Mk
-y.$isMk=z
-y.$isaf=z
-y.$isa=z
-y=W.niR
-y.$isniR=z
-y.$isea=z
-y.$isa=z
 y=Z.lX
 y.$islX=z
 y.$isa=z
 D.W1.$isa=z
-P.A0.$isa=z
-y=W.PGY
-y.$isea=z
+P.A5.$isa=z
+y=G.Y2
+y.$isY2=z
 y.$isa=z
-y=L.Zl
-y.$isZl=z
+y=L.Tv
+y.$isTv=z
 y.$isa=z
 K.PF.$isa=z
+y=W.Iv
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=D.kx
+y.$iskx=z
+y.$isaf=z
+y.$isa=z
+D.TH.$isa=z
 y=N.HV
 y.$isHV=z
 y.$isa=z
-H.yo.$isa=z
+H.HX.$isa=z
 H.IY.$isa=z
 H.aX.$isa=z
 y=W.I0
 y.$ishsw=z
 y.$isKV=z
 y.$isa=z
-Y.qS.$isa=z
-y=U.rx
-y.$isrx=z
+Y.PnY.$isa=z
+y=U.hw
+y.$ishw=z
 y.$isa=z
 y=P.yX
 y.$isyX=z
@@ -22079,38 +22278,50 @@
 y=L.Z5
 y.$isZ5=z
 y.$isa=z
-G.Ni.$isa=z
-y=V.qC
-y.$isqC=z
-y.$isT8=z
+G.c0.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.JBS
+y.$isJBS=z
 y.$isa=z
 y=P.BpP
 y.$isBpP=z
 y.$isa=z
-y=P.V2
-y.$isV2=z
+y=V.qC
+y.$isqC=z
+y.$isT8=z
+y.$isa=z
+y=W.cxu
+y.$iscxu=z
+y.$isea=z
+y.$isa=z
+y=P.Wy
+y.$isWy=z
 y.$isa=z
 y=P.KA
 y.$isKA=z
 y.$isNOT=z
 y.$isyX=z
 y.$isa=z
-y=P.LR
-y.$isLR=z
+y=P.JIw
+y.$isJIw=z
 y.$isKA=z
 y.$isNOT=z
 y.$isyX=z
 y.$isa=z
+y=D.vO
+y.$isvO=z
+y.$isaf=z
+y.$isqC=z
+y.$asqC=[null,null]
+y.$isT8=z
+y.$asT8=[null,null]
+y.$isa=z
 y=D.uq
 y.$isuq=z
 y.$isaf=z
 y.$isa=z
-y=P.e4y
-y.$ise4y=z
-y.$isa=z
-y=P.JBS
-y.$isJBS=z
-y.$isa=z
 y=P.fRn
 y.$isfRn=z
 y.$isa=z
@@ -22129,8 +22340,8 @@
 y=P.EH
 y.$isEH=z
 y.$isa=z
-y=P.wS
-y.$iswS=z
+y=P.cb
+y.$iscb=z
 y.$isa=z
 y=P.b8
 y.$isb8=z
@@ -22138,17 +22349,28 @@
 y=P.NOT
 y.$isNOT=z
 y.$isa=z
-y=P.fIm
-y.$isfIm=z
-y.$isa=z
 y=P.iP
 y.$isiP=z
 y.$isfRn=z
 y.$asfRn=[null]
 y.$isa=z
+y=P.fIm
+y.$isfIm=z
+y.$isa=z
+y=W.v3
+y.$isv3=z
+y.$isea=z
+y.$isa=z
+y=W.ea
+y.$isea=z
+y.$isa=z
 y=O.Hz
 y.$isHz=z
 y.$isa=z
+y=W.niR
+y.$isniR=z
+y.$isea=z
+y.$isa=z
 y=D.wv
 y.$iswv=z
 y.$isaf=z
@@ -22187,13 +22409,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.MZ(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.aN(a)}
+return J.MZ(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
@@ -22202,7 +22424,7 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.MZ(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
 return J.VA7.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
@@ -22210,188 +22432,179 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.MZ(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6L=function(a,b){return J.RE(a).sdl(a,b)}
-J.AC=function(a,b){return J.RE(a).Ky(a,b)}
+J.A6=function(a,b){return J.RE(a).sdl(a,b)}
+J.AE=function(a,b){return J.RE(a).sJb(a,b)}
 J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
+J.AU=function(a){return J.RE(a).gpM(a)}
 J.AW=function(a){return J.RE(a).gnl(a)}
 J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
-J.As=function(a){return J.Wx(a).gVz(a)}
+J.Ag=function(a){return J.RE(a).zd(a)}
+J.Ak=function(a){return J.RE(a).ghy(a)}
 J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
+J.BB=function(a){return J.RE(a).gP9(a)}
 J.BC=function(a,b){return J.RE(a).sja(a,b)}
 J.BL=function(a,b){return J.RE(a).sRd(a,b)}
 J.BQ=function(a,b){return J.Qe(a).Fr(a,b)}
-J.BT=function(a){return J.RE(a).gNG(a)}
+J.BT=function(a){return J.RE(a).goN(a)}
 J.BZ=function(a){return J.RE(a).gnv(a)}
 J.Bj=function(a,b){return J.RE(a).snl(a,b)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
+J.CA=function(a){return J.RE(a).gil(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.CN=function(a){return J.RE(a).gd0(a)}
-J.CP=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.CS=function(a,b){return J.RE(a).sCd(a,b)}
-J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
-J.Cs=function(a){return J.RE(a).gyg(a)}
+J.CNb=function(a){return J.RE(a).gd0(a)}
+J.Co=function(a,b){return J.RE(a).szH(a,b)}
+J.Cr=function(a){return J.RE(a).gEQ(a)}
+J.Cs=function(a){return J.RE(a).gWw(a)}
+J.Ct=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
 J.Cz=function(a,b,c){return J.w1(a).oq(a,b,c)}
-J.D4=function(a,b){return J.RE(a).sA0(a,b)}
-J.D8=function(a){return J.RE(a).gl6(a)}
 J.DA=function(a){return J.RE(a).goc(a)}
-J.DF=function(a,b){return J.RE(a).soc(a,b)}
-J.DG=function(a,b){return J.RE(a).Tk(a,b)}
 J.DP=function(a,b,c){return J.U6(a).XU(a,b,c)}
+J.Dc=function(a){return J.RE(a).gEa(a)}
+J.Do=function(a){return J.RE(a).gM0(a)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
-J.Dv=function(a){return J.Wx(a).zQ(a)}
-J.E3=function(a){return J.RE(a).gRu(a)}
+J.E1=function(a){return J.RE(a).gi0(a)}
 J.EC=function(a,b){return J.RE(a).svm(a,b)}
 J.EE=function(a,b){return J.RE(a).sFF(a,b)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Ed=function(a,b){return J.RE(a).sFK(a,b)}
-J.Eh=function(a,b){return J.Wx(a).O(a,b)}
+J.Ee=function(a){return J.RE(a).gG5(a)}
+J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
 J.Ei=function(a,b){return J.w1(a).uk(a,b)}
 J.Eo=function(a,b){return J.RE(a).sDQ(a,b)}
 J.Er=function(a){return J.RE(a).gu6(a)}
+J.Es=function(a){return J.w1(a).gtH(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.F9=function(a){return J.RE(a).gvm(a)}
 J.FI=function(a,b){return J.RE(a).sih(a,b)}
 J.FN=function(a){return J.U6(a).gl0(a)}
 J.FS=function(a){return J.RE(a).gwp(a)}
+J.FS1=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
 J.FW=function(a,b){return J.Qc(a).iM(a,b)}
 J.Fc=function(a,b){return J.RE(a).sP(a,b)}
 J.Fd=function(a,b,c){return J.w1(a).aM(a,b,c)}
+J.Ff=function(a){return J.RE(a).gLc(a)}
+J.Fi=function(a){return J.RE(a).gnZ(a)}
 J.Fv=function(a,b){return J.RE(a).sFR(a,b)}
 J.Fy=function(a){return J.RE(a).h9(a)}
 J.G7=function(a,b){return J.RE(a).seZ(a,b)}
-J.GF=function(a){return J.RE(a).gz2(a)}
-J.GG=function(a){return J.Qe(a).gNq(a)}
 J.GH=function(a){return J.RE(a).gyW(a)}
-J.GL=function(a){return J.RE(a).gBp(a)}
-J.GW=function(a){return J.RE(a).gVY(a)}
+J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.GZ=function(a,b){return J.RE(a).sph(a,b)}
-J.Gl=function(a){return J.RE(a).ghy(a)}
+J.Gt=function(a){return J.RE(a).gRY(a)}
 J.H1=function(a){return J.RE(a).gLe(a)}
-J.H2=function(a){return J.RE(a).gYi(a)}
-J.H3=function(a,b){return J.RE(a).sZA(a,b)}
+J.H3=function(a){return J.RE(a).gl6(a)}
 J.H4=function(a,b){return J.RE(a).wR(a,b)}
 J.HB=function(a){return J.RE(a).gxT(a)}
-J.HP=function(a){return J.RE(a).gFK(a)}
+J.HL=function(a){return J.RE(a).gvq(a)}
+J.HP=function(a){return J.RE(a).ghf(a)}
+J.HS=function(a){return J.RE(a).guS(a)}
 J.HT=function(a,b){return J.RE(a).sLc(a,b)}
+J.Hd=function(a){return J.RE(a).gLF(a)}
 J.Hf=function(a,b){return J.RE(a).seo(a,b)}
-J.Hg=function(a){return J.RE(a).gP9(a)}
 J.Hh=function(a,b){return J.RE(a).sO9(a,b)}
-J.Hn=function(a,b){return J.RE(a).sxT(a,b)}
-J.Ho=function(a){return J.RE(a).WJ(a)}
+J.Hm=function(a){return J.RE(a).gTK(a)}
+J.Hq=function(a){return J.RE(a).grV(a)}
 J.Hs=function(a){return J.RE(a).goL(a)}
 J.Hy=function(a){return J.RE(a).gZp(a)}
-J.IB=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
-J.II=function(a){return J.w1(a).Jd(a)}
+J.I1=function(a){return J.RE(a).gCF(a)}
 J.IL=function(a){return J.RE(a).goE(a)}
-J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
-J.IR=function(a){return J.RE(a).gkZ(a)}
-J.IX=function(a,b){return J.RE(a).sEu(a,b)}
+J.IR=function(a){return J.RE(a).gYt(a)}
+J.IX=function(a,b){return J.RE(a).sTj(a,b)}
+J.Ij=function(a){return J.w1(a).Oe(a)}
+J.Ip=function(a,b){return J.RE(a).QS(a,b)}
 J.Ir=function(a){return J.RE(a).gyK(a)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J0=function(a,b){return J.RE(a).sR1(a,b)}
-J.J1=function(a,b){return J.RE(a).rW(a,b)}
+J.J1=function(a){return J.RE(a).PJ(a)}
+J.J2g=function(a){return J.RE(a).UV(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.Qe(a).h8(a,b,c)}
+J.JC=function(a){return J.RE(a).gCw(a)}
 J.JG=function(a,b){return J.RE(a).si0(a,b)}
+J.JU=function(a){return J.RE(a).gGc(a)}
 J.JX=function(a){return J.RE(a).gpE(a)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Jj=function(a){return J.RE(a).gWA(a)}
+J.Jh=function(a){return J.RE(a).guh(a)}
 J.Jl=function(a,b){return J.RE(a).sML(a,b)}
-J.Jp=function(a){return J.RE(a).gjl(a)}
-J.Jr=function(a){return J.RE(a).gGV(a)}
-J.Jv=function(a){return J.RE(a).gzG(a)}
-J.K0=function(a){return J.RE(a).gd4(a)}
-J.K2=function(a){return J.RE(a).gtN(a)}
+J.Jp9=function(a){return J.RE(a).gjl(a)}
+J.Jq=function(a){return J.RE(a).gFF(a)}
+J.Jv=function(a){return J.RE(a).gfg(a)}
 J.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.KG=function(a){return J.RE(a).guz(a)}
-J.Kd=function(a){return J.RE(a).gCF(a)}
-J.Kj=function(a){return J.RE(a).gYt(a)}
+J.Kf=function(a){return J.RE(a).gtN(a)}
 J.Kl=function(a){return J.RE(a).gBP(a)}
-J.L1=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
-J.L6=function(a){return J.RE(a).glD(a)}
-J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
+J.Ks=function(a){return J.RE(a).gPe(a)}
+J.Kv=function(a){return J.RE(a).gyZ(a)}
+J.Kw=function(a,b){return J.RE(a).sLF(a,b)}
+J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.L6=function(a){return J.RE(a).gRu(a)}
 J.LE=function(a){return J.RE(a).VD(a)}
+J.LF=function(a){return J.RE(a).gpf(a)}
+J.LL=function(a){return J.RE(a).gFK(a)}
 J.LM=function(a){return J.RE(a).gn9(a)}
-J.LW=function(a,b,c){return J.RE(a).AS(a,b,c)}
-J.LY=function(a){return J.RE(a).gi0(a)}
+J.LY4=function(a){return J.RE(a).gBp(a)}
 J.La=function(a,b){return J.RE(a).sBN(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
-J.Lh=function(a){if(typeof a=="number")return-a
-return J.Wx(a).J(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
-J.M2=function(a){return J.RE(a).gFF(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
 J.MF=function(a,b){return J.RE(a).syK(a,b)}
-J.MI=function(a,b){return J.RE(a).sQR(a,b)}
-J.MQ=function(a){return J.w1(a).grZ(a)}
+J.MI=function(a,b){return J.RE(a).PN(a,b)}
 J.MT=function(a){return J.RE(a).guc(a)}
-J.MU=function(a){return J.RE(a).Fc(a)}
+J.MV=function(a){return J.RE(a).gRq(a)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
-J.Mh=function(a,b){return J.RE(a).sTj(a,b)}
-J.Mp=function(a){return J.w1(a).wg(a)}
-J.Mx=function(a){return J.RE(a).gks(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
-J.NB=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
-J.NC=function(a){return J.RE(a).gHy(a)}
-J.NDJ=function(a){return J.RE(a).gWt(a)}
+J.NA=function(a,b){return J.RE(a).sG5(a,b)}
+J.NC=function(a){return J.RE(a).gNG(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
 J.NH=function(a,b){return J.RE(a).swv(a,b)}
 J.NO=function(a,b){return J.RE(a).soE(a,b)}
-J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
-J.NV=function(a){return J.RE(a).gYe(a)}
+J.NQ=function(a){return J.Wx(a).zQ(a)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-J.Nb=function(a){return J.RE(a).gdH(a)}
-J.Nd=function(a){return J.w1(a).br(a)}
+J.Nb=function(a){return J.RE(a).gt0(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
-J.Nh=function(a,b){return J.RE(a).sz2(a,b)}
 J.Nj=function(a,b,c){return J.Qe(a).Nj(a,b,c)}
-J.Nq=function(a){return J.RE(a).gGc(a)}
-J.O2=function(a){return J.RE(a).JP(a)}
+J.Nx=function(a){return J.RE(a).gMN(a)}
 J.O8=function(a){return J.RE(a).Sd(a)}
-J.OB=function(a){return J.RE(a).gfg(a)}
+J.OC=function(a){return J.RE(a).gCn(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
-J.OT=function(a){return J.RE(a).gXE(a)}
+J.OH=function(a){return J.w1(a).grZ(a)}
+J.OX=function(a){return J.Qe(a).gNq(a)}
 J.Oh=function(a){return J.RE(a).gG1(a)}
-J.Ok=function(a){return J.RE(a).ghU(a)}
+J.Oi=function(a){return J.RE(a).gBo(a)}
+J.Okq=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
+J.P5=function(a){return J.RE(a).gHo(a)}
 J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
 J.PG=function(a){return J.RE(a).gEE(a)}
-J.PK=function(a){return J.RE(a).gQR(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
-J.PR=function(a){return J.RE(a).gA5(a)}
-J.PS=function(a){return J.x(a).gCR(a)}
+J.PQ=function(a){return J.RE(a).gVY(a)}
+J.PS=function(a,b){return J.RE(a).sLU(a,b)}
 J.PW=function(a){return J.RE(a).gVb(a)}
-J.PY=function(a){return J.RE(a).goN(a)}
-J.Pc=function(a,b){return J.RE(a).yU(a,b)}
-J.Pf=function(a){return J.RE(a).gWw(a)}
 J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
 J.Pp=function(a,b){return J.Qe(a).j(a,b)}
 J.Pq=function(a){return J.RE(a).gqF(a)}
-J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
 J.Px=function(a,b){return J.RE(a).swp(a,b)}
-J.Q0=function(a,b){return J.U6(a).OY(a,b)}
+J.Q0=function(a){return J.RE(a).gwh(a)}
 J.Q2=function(a){return J.RE(a).gO3(a)}
+J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
+J.QY=function(a,b,c){return J.U6(a).eM(a,b,c)}
 J.Qd=function(a){return J.RE(a).gRn(a)}
 J.Ql=function(a,b){return J.RE(a).sdu(a,b)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
@@ -22399,85 +22612,79 @@
 J.Qy=function(a,b){return J.RE(a).shf(a,b)}
 J.R1=function(a){return J.RE(a).Fn(a)}
 J.R8=function(a,b){return J.RE(a).sMT(a,b)}
-J.RC=function(a){return J.RE(a).gTA(a)}
-J.RI=function(a){return J.RE(a).gRT(a)}
+J.RH0=function(a){return J.RE(a).gwX(a)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
 J.Rp=function(a,b){return J.RE(a).sod(a,b)}
-J.Rr=function(a){return J.RE(a).ga7(a)}
-J.Ry=function(a){return J.RE(a).gVE(a)}
+J.Rv=function(a){return J.w1(a).wg(a)}
+J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
 J.SK=function(a){return J.RE(a).xW(a)}
 J.SM=function(a){return J.RE(a).gbw(a)}
 J.SO=function(a,b){return J.RE(a).sCF(a,b)}
+J.SS=function(a){return J.RE(a).gQP(a)}
 J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
 J.Sj=function(a,b){return J.RE(a).svC(a,b)}
 J.Sl=function(a){return J.RE(a).gxb(a)}
 J.Sm=function(a,b){return J.RE(a).skZ(a,b)}
-J.Sr=function(a){return J.RE(a).gvq(a)}
 J.T5=function(a,b){return J.RE(a).stT(a,b)}
 J.TG=function(a){return J.RE(a).gFb(a)}
 J.TM=function(a){return J.RE(a).gOd(a)}
-J.TP=function(a,b){return J.RE(a).sGV(a,b)}
-J.TY=function(a){return J.RE(a).gvp(a)}
+J.TP=function(a,b){return J.RE(a).sd0(a,b)}
+J.TR=function(a){return J.RE(a).Um(a)}
 J.TZ=function(a,b){return J.RE(a).sN(a,b)}
-J.Tg=function(a){return J.RE(a).gCI(a)}
-J.Tm=function(a){return J.RE(a).grX(a)}
-J.Ts=function(a){return J.RE(a).gfG(a)}
+J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
 J.Tu=function(a,b){return J.RE(a).sl6(a,b)}
-J.Tv=function(a){return J.RE(a).gB1(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
-J.U8=function(a){return J.RE(a).gEQ(a)}
-J.UA=function(a){return J.RE(a).gP2(a)}
+J.U2=function(a){return J.w1(a).V1(a)}
+J.U8=function(a,b){return J.RE(a).sX7(a,b)}
 J.UE=function(a){return J.w1(a).git(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
-J.UP=function(a){return J.RE(a).gnZ(a)}
 J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
 return J.U6(a).t(a,b)}
-J.UR=function(a){return J.RE(a).Lg(a)}
-J.UT=function(a){return J.RE(a).gDQ(a)}
-J.Ue=function(a){return J.RE(a).gV8(a)}
+J.US=function(a){return J.RE(a).gWt(a)}
+J.UU=function(a,b){return J.RE(a).sng(a,b)}
+J.Ua=function(a){return J.RE(a).gkZ(a)}
+J.Ur=function(a){return J.RE(a).gyX(a)}
 J.Ux=function(a){return J.RE(a).geo(a)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
+J.V2=function(a,b,c){return J.w1(a).aP(a,b,c)}
 J.VA=function(a,b){return J.w1(a).Vr(a,b)}
-J.VU=function(a,b){return J.RE(a).PN(a,b)}
-J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
+J.VB=function(a){return J.RE(a).gRT(a)}
+J.Vj=function(a,b){return J.RE(a).Md(a,b)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.Qe(a).C1(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
-J.W2=function(a){return J.RE(a).gCf(a)}
+J.Vw=function(a,b){return J.U6(a).sB(a,b)}
+J.W2H=function(a){return J.RE(a).gCf(a)}
 J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
-J.WI=function(a,b){return J.RE(a).sLF(a,b)}
+J.WI=function(a,b){return J.RE(a).soc(a,b)}
 J.WT=function(a){return J.RE(a).gFR(a)}
-J.WX=function(a){return J.RE(a).gbJ(a)}
-J.We=function(a,b){return J.RE(a).VG(a,b)}
+J.WX7=function(a){return J.RE(a).gbJ(a)}
 J.Wf=function(a){return J.RE(a).D4(a)}
-J.Wp=function(a){return J.RE(a).gQU(a)}
-J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
-J.X6=function(a){return J.RE(a).gjD(a)}
 J.X7=function(a){return J.RE(a).gcH(a)}
-J.X9=function(a){return J.RE(a).gTK(a)}
+J.X9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).V(a,b)}
+J.XB=function(a){return J.RE(a).gQU(a)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
 J.XHl=function(a){return J.Wx(a).yu(a)}
-J.XP=function(a){return J.RE(a).Um(a)}
+J.Xa=function(a){return J.RE(a).gXc(a)}
 J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xr=function(a){return J.RE(a).gEa(a)}
+J.Xp=function(a){return J.RE(a).gzH(a)}
 J.Xu=function(a,b){return J.RE(a).sFL(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
-J.Y7=function(a){return J.RE(a).gLU(a)}
-J.YG=function(a){return J.RE(a).gQP(a)}
-J.YH=function(a){return J.RE(a).gpM(a)}
+J.YH=function(a){return J.RE(a).gnS(a)}
+J.YN=function(a,b){return J.RE(a).WO(a,b)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
 J.YSV=function(a,b){return J.RE(a).sNJ(a,b)}
-J.Yd=function(a){return J.RE(a).gBV(a)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yq=function(a){return J.RE(a).gph(a)}
+J.Yq=function(a){return J.RE(a).gSR(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a,b){return J.RE(a).sP9(a,b)}
-J.Z8=function(a){return J.w1(a).V1(a)}
+J.Z6=function(a){return J.RE(a).gV5(a)}
+J.ZC=function(a){return J.RE(a).gph(a)}
 J.ZF=function(a){return J.RE(a).gAF(a)}
 J.ZG=function(a,b){return J.w1(a).zV(a,b)}
 J.ZH=function(a){return J.RE(a).gk8(a)}
@@ -22485,186 +22692,193 @@
 J.ZW=function(a,b,c,d){return J.RE(a).MS(a,b,c,d)}
 J.ZZ=function(a,b){return J.Qe(a).yn(a,b)}
 J.Zh=function(a){return J.RE(a).grJ(a)}
+J.Zl=function(a){return J.RE(a).gB1(a)}
 J.Zo=function(a){return J.RE(a).gK4(a)}
 J.Zs=function(a){return J.RE(a).gcY(a)}
-J.a3=function(a){return J.RE(a).gBk(a)}
-J.aA=function(a){return J.RE(a).gzY(a)}
-J.aB=function(a){return J.RE(a).gql(a)}
-J.aT=function(a){return J.RE(a).god(a)}
+J.Zv=function(a){return J.RE(a).grs(a)}
 J.aW=function(a){return J.RE(a).gJp(a)}
-J.an=function(a,b){return J.RE(a).Id(a,b)}
+J.ad=function(a){return J.RE(a).guZ(a)}
 J.au=function(a,b){return J.RE(a).sNG(a,b)}
-J.ay=function(a){return J.RE(a).giB(a)}
 J.b0=function(a,b){return J.RE(a).suc(a,b)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.bH=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
 J.bI=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
-J.bL=function(a){return J.RE(a).ghS(a)}
-J.bS=function(a){return J.RE(a).gUo(a)}
-J.bT=function(a){return J.w1(a).gqG(a)}
-J.bh=function(a){return J.RE(a).geZ(a)}
-J.bi=function(a,b){return J.w1(a).h(a,b)}
+J.bL=function(a){return J.RE(a).gUt(a)}
+J.bb=function(a,b,c){return J.RE(a).X6(a,b,c)}
+J.be=function(a){return J.RE(a).gB3(a)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
+J.bs=function(a){return J.RE(a).JP(a)}
 J.bu=function(a){return J.RE(a).gyw(a)}
-J.c7=function(a){return J.RE(a).guS(a)}
+J.cC=function(a){return J.RE(a).gke(a)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
-J.cL=function(a){return J.RE(a).gV5(a)}
 J.cO=function(a){return J.RE(a).gjx(a)}
+J.cP=function(a){return J.RE(a).gAd(a)}
+J.cS=function(a,b){return J.RE(a).sqF(a,b)}
 J.cV=function(a,b){return J.RE(a).sjT(a,b)}
 J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cj=function(a){return J.RE(a).gMT(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.cm=function(a,b,c){return J.RE(a).kq(a,b,c)}
 J.co=function(a,b){return J.Qe(a).nC(a,b)}
+J.d5=function(a){return J.Wx(a).gKy(a)}
 J.dE=function(a){return J.RE(a).gGs(a)}
-J.dF=function(a){return J.w1(a).zH(a)}
-J.dK=function(a){return J.RE(a).gWk(a)}
+J.dH=function(a,b){return J.w1(a).h(a,b)}
 J.dY=function(a){return J.RE(a).ga4(a)}
-J.dZ=function(a){return J.RE(a).gDX(a)}
-J.dc=function(a,b){return J.RE(a).smH(a,b)}
+J.dd=function(a){return J.RE(a).gqu(a)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a){return J.RE(a).QE(a)}
-J.dj=function(a){return J.RE(a).gyZ(a)}
-J.dv=function(a,b,c){return J.RE(a).v3(a,b,c)}
-J.dw=function(a){return J.RE(a).gMt(a)}
-J.eK=function(a){return J.RE(a).gBN(a)}
+J.dv=function(a){return J.RE(a).gUL(a)}
 J.eS=function(a){return J.RE(a).gjO(a)}
-J.eU=function(a){return J.RE(a).gRh(a)}
 J.eY=function(a){return J.RE(a).gR(a)}
 J.eb=function(a){return J.RE(a).gIb(a)}
 J.ev=function(a){return J.RE(a).gkD(a)}
 J.f2=function(a){return J.RE(a).gRd(a)}
-J.f5=function(a){return J.RE(a).grz(a)}
-J.fD=function(a){return J.RE(a).e6(a)}
-J.fM=function(a){return J.RE(a).gLf(a)}
 J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
+J.fY=function(a){return J.RE(a).gky(a)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
-J.fh=function(a){return J.RE(a).ghf(a)}
 J.fi=function(a){return J.RE(a).gX0(a)}
+J.fm=function(a,b){return J.RE(a).sxr(a,b)}
 J.fv=function(a){return J.RE(a).gZ9(a)}
+J.fx=function(a){return J.RE(a).gtu(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hI=function(a){return J.RE(a).gUQ(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
-J.hn=function(a){return J.RE(a).gEu(a)}
+J.hW=function(a){return J.RE(a).gql(a)}
+J.ho=function(a){return J.RE(a).ghS(a)}
 J.ht=function(a){return J.RE(a).gZ2(a)}
 J.i0=function(a,b){return J.RE(a).sPB(a,b)}
 J.i2=function(a,b){return J.RE(a).sRk(a,b)}
+J.i2U=function(a){return J.RE(a).gCK(a)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
-J.iB=function(a){return J.RE(a).giC(a)}
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iS=function(a){return J.RE(a).gox(a)}
-J.iY=function(a){return J.RE(a).gvc(a)}
-J.id=function(a){return J.RE(a).gR1(a)}
+J.iY=function(a){return J.Qe(a).DY(a)}
+J.iYM=function(a){return J.RE(a).gvc(a)}
+J.iiZ=function(a){return J.RE(a).gfG(a)}
+J.ik=function(a){return J.RE(a).gHt(a)}
 J.io=function(a){return J.RE(a).gja(a)}
+J.iq=function(a){return J.RE(a).gRs(a)}
 J.is=function(a,b){return J.RE(a).snZ(a,b)}
-J.ix=function(a){return J.RE(a).gnI(a)}
-J.j1=function(a){return J.RE(a).gZA(a)}
-J.jB=function(a){return J.RE(a).gpf(a)}
+J.ix=function(a,b){return J.RE(a).sXc(a,b)}
+J.jD=function(a){return J.RE(a).TI(a)}
+J.jE=function(a){return J.RE(a).gA5(a)}
+J.jH=function(a){return J.RE(a).ghN(a)}
+J.jL=function(a){return J.RE(a).gBV(a)}
 J.jOZ=function(a,b){return J.Wx(a).Y(a,b)}
 J.jd=function(a){return J.RE(a).gZm(a)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
-J.jl=function(a){return J.RE(a).gHt(a)}
+J.jg=function(a){return J.RE(a).gEu(a)}
+J.jk=function(a,b,c){return J.RE(a).OP(a,b,c)}
+J.jo=function(a){return J.RE(a).gCI(a)}
 J.jq=function(a,b){return J.RE(a).sZp(a,b)}
+J.ju=function(a,b,c){return J.RE(a).eX(a,b,c)}
+J.jy=function(a,b){return J.RE(a).sPe(a,b)}
+J.jzo=function(a){if(typeof a=="number")return-a
+return J.Wx(a).J(a)}
 J.k0=function(a){return J.RE(a).giZ(a)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
-J.kW=function(a,b,c){if((a.constructor==Array||H.Gp(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
-return J.w1(a).u(a,b,c)}
 J.kX=function(a,b){return J.RE(a).sNb(a,b)}
-J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.kv=function(a){return J.RE(a).gDf(a)}
+J.kv=function(a){return J.RE(a).glp(a)}
 J.l2=function(a){return J.RE(a).gN(a)}
-J.lA=function(a){return J.RE(a).gLc(a)}
+J.lF=function(a,b){return J.RE(a).snS(a,b)}
 J.lL=function(a){return J.RE(a).gQr(a)}
-J.lN=function(a){return J.RE(a).gil(a)}
-J.le=function(a){return J.RE(a).gUt(a)}
-J.lu=function(a){return J.RE(a).gJ8(a)}
+J.lf=function(a,b){return J.Wx(a).O(a,b)}
+J.ls=function(a){return J.RE(a).gnI(a)}
 J.m4=function(a){return J.RE(a).gig(a)}
+J.m8=function(a,b){return J.RE(a).sEu(a,b)}
+J.mB=function(a){return J.RE(a).Zi(a)}
 J.mF=function(a){return J.RE(a).gHn(a)}
+J.mI=function(a,b){return J.RE(a).rW(a,b)}
 J.mN=function(a){return J.RE(a).gRO(a)}
 J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
 return J.Wx(a).i(a,b)}
 J.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
+J.ma=function(a){return J.RE(a).gyG(a)}
+J.mk=function(a){return J.RE(a).gWA(a)}
 J.mu=function(a,b){return J.RE(a).TR(a,b)}
 J.my=function(a,b){return J.RE(a).sQl(a,b)}
 J.mz=function(a,b){return J.RE(a).scH(a,b)}
+J.n8=function(a){return J.RE(a).gUo(a)}
 J.n9=function(a){return J.RE(a).gQq(a)}
 J.nA=function(a,b){return J.RE(a).sPL(a,b)}
+J.nC=function(a,b){return J.RE(a).sCd(a,b)}
+J.nEe=function(a){return J.RE(a).gDf(a)}
 J.nG=function(a){return J.RE(a).gv8(a)}
-J.nN=function(a){return J.RE(a).gTt(a)}
-J.nb=function(a){return J.RE(a).gyX(a)}
+J.nb=function(a,b,c,d,e,f,g,h){return J.RE(a).kN(a,b,c,d,e,f,g,h)}
+J.nl=function(a){return J.RE(a).gDQ(a)}
 J.ns=function(a){return J.RE(a).gjT(a)}
 J.nv=function(a){return J.RE(a).gLW(a)}
-J.o3=function(a,b){return J.RE(a).sjD(a,b)}
-J.o6=function(a){return J.RE(a).Lx(a)}
-J.o8=function(a,b){return J.RE(a).sqF(a,b)}
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
+J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
-J.oO=function(a){return J.RE(a).UV(a)}
-J.of=function(a){return J.RE(a).je(a)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
-J.ol=function(a){return J.RE(a).glp(a)}
-J.on=function(a){return J.RE(a).gtT(a)}
 J.op=function(a){return J.RE(a).gD7(a)}
+J.os=function(a){return J.RE(a).gqA(a)}
 J.p7=function(a){return J.RE(a).guD(a)}
 J.pA=function(a,b){return J.RE(a).sYt(a,b)}
 J.pB=function(a,b){return J.w1(a).sit(a,b)}
 J.pI=function(a){return J.RE(a).gH3(a)}
-J.pL=function(a,b,c){return J.RE(a).d2(a,b,c)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pU=function(a){return J.RE(a).ghN(a)}
-J.pm=function(a){return J.RE(a).gt0(a)}
-J.pq=function(a,b){return J.RE(a).sV8(a,b)}
+J.pU=function(a){return J.RE(a).gYe(a)}
+J.ph=function(a){return J.RE(a).gDX(a)}
+J.pq=function(a,b){return J.RE(a).yU(a,b)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q1=function(a){return J.RE(a).geJ(a)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.ql=function(a){return J.RE(a).gaB(a)}
+J.qA=function(a){return J.w1(a).br(a)}
+J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
+J.qN=function(a){return J.RE(a).giC(a)}
+J.qQ=function(a,b,c){if((a.constructor==Array||H.Gp(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
+return J.w1(a).u(a,b,c)}
+J.qd=function(a,b,c,d){return J.RE(a).aC(a,b,c,d)}
+J.qf=function(a){return J.RE(a).gMl(a)}
+J.ql=function(a){return J.RE(a).gBN(a)}
+J.qq=function(a){return J.RE(a).dQ(a)}
 J.qx=function(a){return J.RE(a).gbe(a)}
-J.qy=function(a){return J.RE(a).gA0(a)}
-J.r0=function(a){return J.RE(a).gi6(a)}
-J.r5=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.rA=function(a,b){return J.RE(a).sbe(a,b)}
 J.rL=function(a,b){return J.RE(a).spE(a,b)}
-J.ra5=function(a){return J.RE(a).gAd(a)}
-J.re=function(a){return J.RE(a).gmb(a)}
-J.rk=function(a){return J.RE(a).gke(a)}
+J.rN=function(a){return J.RE(a).gVE(a)}
+J.rS=function(a){return J.RE(a).gyr(a)}
 J.ro=function(a){return J.RE(a).gOB(a)}
-J.rr=function(a){return J.Qe(a).bS(a)}
-J.rw=function(a){return J.RE(a).gMl(a)}
+J.rp=function(a){return J.RE(a).gd4(a)}
 J.ry=function(a,b){return J.RE(a).stu(a,b)}
 J.t0=function(a){return J.RE(a).gTj(a)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tG=function(a){return J.RE(a).Zi(a)}
-J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tPf=function(a,b){return J.RE(a).X3(a,b)}
-J.tT=function(a,b,c){return J.RE(a).X6(a,b,c)}
+J.tE=function(a,b){return J.RE(a).JX(a,b)}
+J.tX=function(a){return J.RE(a).gtT(a)}
+J.tdY=function(a){return J.RE(a).gng(a)}
+J.ti=function(a){return J.RE(a).grz(a)}
 J.tv=function(a,b){return J.RE(a).sDX(a,b)}
-J.tw=function(a){return J.RE(a).gCK(a)}
+J.tw=function(a){return J.RE(a).je(a)}
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
+J.u5=function(a){return J.RE(a).gA8(a)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uF=function(a,b){return J.w1(a).GT(a,b)}
-J.uH=function(a,b){return J.RE(a).sP2(a,b)}
-J.uN=function(a){return J.RE(a).gHo(a)}
-J.uW=function(a){return J.RE(a).gyG(a)}
-J.uf=function(a){return J.RE(a).gxr(a)}
+J.ufU=function(a){return J.RE(a).gxr(a)}
+J.ug=function(a){return J.x(a).gCR(a)}
 J.ul=function(a){return J.RE(a).gU4(a)}
 J.um=function(a){return J.RE(a).gRk(a)}
-J.un=function(a){return J.RE(a).gRY(a)}
 J.up=function(a){return J.RE(a).gIf(a)}
+J.us=function(a){return J.RE(a).gRN(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.v7=function(a){return J.RE(a).gwX(a)}
+J.v7=function(a){return J.RE(a).Lg(a)}
+J.vE=function(a){return J.RE(a).gMZ(a)}
+J.vF=function(a,b){return J.RE(a).sP9(a,b)}
+J.vI=function(a,b){return J.RE(a).jn(a,b)}
 J.vJ=function(a,b){return J.RE(a).spM(a,b)}
 J.vP=function(a,b){return J.RE(a).sR(a,b)}
+J.vR=function(a,b){return J.RE(a).YP(a,b)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vc=function(a){return J.RE(a).gxD(a)}
@@ -22672,51 +22886,59 @@
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
 J.wJ=function(a,b){return J.RE(a).slp(a,b)}
-J.wK=function(a,b){return J.RE(a).xZ(a,b)}
+J.wS=function(a){return J.RE(a).geZ(a)}
 J.wd=function(a){return J.RE(a).gqw(a)}
-J.we=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
-J.wg=function(a,b){return J.U6(a).sB(a,b)}
+J.wg=function(a){return J.RE(a).god(a)}
 J.wl=function(a,b){return J.RE(a).Ch(a,b)}
 J.wp=function(a){return J.RE(a).gwv(a)}
-J.wt=function(a){return J.RE(a).gP3(a)}
 J.wu=function(a,b){return J.RE(a).sLf(a,b)}
 J.wx=function(a,b){return J.RE(a).Rg(a,b)}
 J.x0=function(a,b){return J.RE(a).sWt(a,b)}
+J.x3=function(a){return J.RE(a).gvp(a)}
 J.xC=function(a,b){if(a==null)return b==null
 if(typeof a!="object")return b!=null&&a===b
 return J.x(a).n(a,b)}
+J.xH=function(a,b){return J.RE(a).sxT(a,b)}
 J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
 J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
 J.xe=function(a){return J.RE(a).gPB(a)}
-J.xo=function(a){return J.RE(a).gJN(a)}
+J.xi=function(a){return J.RE(a).gBj(a)}
+J.xk=function(a){return J.RE(a).gXE(a)}
+J.xlH=function(a){return J.RE(a).gUv(a)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.y3=function(a){return J.RE(a).gFL(a)}
 J.y9=function(a){return J.RE(a).lh(a)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yI=function(a){return J.RE(a).gih(a)}
+J.yI=function(a){return J.RE(a).gLf(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yR=function(a,b){return J.RE(a).XT(a,b)}
+J.yW=function(a){return J.RE(a).gX7(a)}
+J.yb=function(a){return J.RE(a).gWF(a)}
 J.yd=function(a){return J.RE(a).xO(a)}
+J.yf=function(a){return J.RE(a).gzG(a)}
 J.yi=function(a,b){return J.RE(a).sMj(a,b)}
 J.yq=function(a){return J.RE(a).gQl(a)}
-J.yz=function(a){return J.RE(a).gLF(a)}
+J.yr=function(a){return J.RE(a).gJb(a)}
 J.z7Y=function(a,b,c,d,e){return J.RE(a).GM(a,b,c,d,e)}
-J.zE=function(a){return J.RE(a).gtu(a)}
-J.zF=function(a){return J.RE(a).gHL(a)}
+J.zC=function(a){return J.RE(a).gi6(a)}
+J.zD=function(a){return J.RE(a).gEl(a)}
+J.zF=function(a){return J.RE(a).gih(a)}
 J.zH=function(a){return J.RE(a).gt5(a)}
 J.zL=function(a){return J.RE(a).gO9(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
 J.zY=function(a){return J.RE(a).gdu(a)}
+J.za=function(a,b){return J.U6(a).OY(a,b)}
+J.ze=function(a){return J.RE(a).gHL(a)}
 J.zg=function(a,b){return J.w1(a).ad(a,b)}
 J.zj=function(a){return J.RE(a).gvH(a)}
+J.zq=function(a){return J.w1(a).Jd(a)}
 C.Gx=X.hV.prototype
 C.J9=Q.f7.prototype
-C.Gkp=Y.hg.prototype
-C.C8=B.G6.prototype
+C.Gkp=Y.G0.prototype
+C.QD=B.G6.prototype
 C.FC=T.vr.prototype
 C.ic=A.wM.prototype
-C.i3=Q.eW.prototype
+C.YZz=Q.eW.prototype
 C.fe=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
@@ -22724,41 +22946,42 @@
 C.vS=T.uV.prototype
 C.oS=U.NY.prototype
 C.O0=R.JI.prototype
-C.BB=G.Tk.prototype
+C.lG=W.Rb.prototype
+C.vo=G.Tk.prototype
 C.On=F.ZP.prototype
-C.Jh=L.nJ.prototype
-C.lQ=R.Eg.prototype
+C.GhT=L.nJ.prototype
+C.qL=R.Eg.prototype
 C.MC=D.i7.prototype
-C.LTI=A.Gk.prototype
+C.D4=A.Gk.prototype
 C.kL=W.H05.prototype
-C.ls6=X.MJ.prototype
-C.n0=X.J3.prototype
+C.Hb=X.MJ.prototype
+C.N3=X.J3.prototype
 C.Xo=U.DK.prototype
 C.PJ8=N.BS.prototype
 C.Al=O.Vb.prototype
 C.Vc=K.Ly.prototype
-C.W3=W.fJ.prototype
-C.bP=E.WS.prototype
-C.tO=E.H8.prototype
+C.W3=W.O7.prototype
+C.Ug=E.WS.prototype
+C.GII=E.H8.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
-C.VLs=E.U1.prototype
+C.x4=E.U1.prototype
 C.ej=E.qM.prototype
-C.OkI=E.av.prototype
+C.Wa=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
 C.RVQ=E.wN.prototype
 C.wP=E.ds.prototype
-C.Ag=E.Mb.prototype
+C.aj2=E.Mb.prototype
 C.ozm=E.oF.prototype
-C.IXz=E.qh.prototype
+C.wK=E.qh.prototype
 C.rU=E.Q6.prototype
-C.j1o=E.L4.prototype
+C.j1=E.L4.prototype
 C.ag=E.Zn.prototype
-C.Fw=E.uE.prototype
+C.js=E.uE.prototype
 C.UZ=E.n5.prototype
 C.QFk=O.Im.prototype
-C.uRw=B.pR.prototype
+C.hM=B.pR.prototype
 C.yKx=Z.EZ.prototype
 C.aXP=D.Z4.prototype
 C.rCJ=D.Qh.prototype
@@ -22768,45 +22991,48 @@
 C.F2=D.IW.prototype
 C.mb=D.Oz.prototype
 C.OoF=D.St.prototype
-C.hys=L.qk.prototype
+C.Xe=L.qk.prototype
 C.Nm=J.Q.prototype
 C.YI=J.VA7.prototype
 C.jn=J.imn.prototype
-C.jN=J.CDU.prototype
+C.bP=J.CDU.prototype
 C.CD=J.P.prototype
-C.xB=J.O.prototype
+C.yo=J.O.prototype
 C.Du=Z.vj.prototype
 C.xA=A.UK.prototype
 C.Z3=R.LU.prototype
-C.fQ=M.CX.prototype
-C.DX=U.WG.prototype
-C.OX=U.VZ.prototype
+C.MG=M.CX.prototype
+C.dl=U.WG.prototype
+C.vmJ=U.VZ.prototype
 C.Ax=N.I2.prototype
-C.Mw=N.FB.prototype
+C.h1=N.FB.prototype
 C.po=N.qn.prototype
-C.S2=W.x76.prototype
+C.S2=W.H9.prototype
 C.yp=H.eEV.prototype
-C.aV=A.md.prototype
+C.Jm=H.V6a.prototype
+C.kD=A.md.prototype
 C.pl=A.ye.prototype
 C.IG=A.Bm.prototype
 C.nn=A.Ya.prototype
 C.BJj=A.NK.prototype
 C.L8=A.Zx.prototype
 C.J7=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.br=L.qV.prototype
+C.z0=W.BH3.prototype
+C.aD=L.qV.prototype
+C.ji=Q.Ce.prototype
+C.LQi=L.NT.prototype
 C.YpE=V.F1.prototype
-C.mk=Z.uL.prototype
+C.Pfz=Z.uL.prototype
 C.Sx=J.iCW.prototype
-C.GBL=A.xc.prototype
-C.za=T.ov.prototype
-C.Wa=A.kn.prototype
+C.Vk=A.xc.prototype
+C.vy=T.ov.prototype
+C.Mh=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
-C.Vd=D.Rk.prototype
-C.Uv=U.Ti.prototype
+C.kgQ=D.Rk.prototype
+C.Ns=U.Ti.prototype
 C.HRc=Q.xI.prototype
-C.Yo=Q.CY.prototype
+C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
 C.bg3=X.Vu.prototype
 C.OKl=A.G1.prototype
@@ -22815,35 +23041,35 @@
 C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
 C.V8=X.I5.prototype
-C.Hd=U.el.prototype
-C.Ui=W.K5.prototype
+C.Tkx=U.el.prototype
+C.ol=W.K5.prototype
 C.Kn=new H.i6()
-C.x4=new U.WH()
+C.OL=new U.EO()
 C.Ar=new H.MB()
 C.MS=new H.FuS()
 C.Eq=new P.k5C()
 C.qY=new T.WM()
 C.ZB=new P.yRf()
 C.Xh=new P.mgb()
-C.zr=new L.iNc()
+C.aZ=new L.iNc()
 C.NU=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
-C.yP=new D.WAE("Reused")
-C.Z7=new D.WAE("Tag")
+C.AA=new D.WAE("Reused")
+C.oA=new D.WAE("Tag")
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
-C.cn=new A.iYn(2)
+C.hU=new A.iYn(2)
 C.hf=new H.tx("label")
-C.lY=H.Kxv('qU')
+C.Gh=H.Kxv('qU')
 C.B10=new K.vly()
 C.vrd=new A.xn(!1)
 I.uLC=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
 C.ucP=I.uLC([C.B10,C.vrd])
-C.V0=new A.ES(C.hf,C.BM,!1,C.lY,!1,C.ucP)
+C.V0=new A.ES(C.hf,C.BM,!1,C.Gh,!1,C.ucP)
 C.EV=new H.tx("library")
 C.Jny=H.Kxv('U4')
 C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
@@ -22864,11 +23090,11 @@
 C.UL=new H.tx("profileChanged")
 C.yQP=H.Kxv('EH')
 C.xD=I.uLC([])
-C.bG=new A.ES(C.UL,C.cn,!1,C.yQP,!1,C.xD)
+C.bG=new A.ES(C.UL,C.hU,!1,C.yQP,!1,C.xD)
 C.TU=new H.tx("endPosChanged")
-C.Cp=new A.ES(C.TU,C.cn,!1,C.yQP,!1,C.xD)
+C.Cp=new A.ES(C.TU,C.hU,!1,C.yQP,!1,C.xD)
 C.Wm=new H.tx("refChanged")
-C.QW=new A.ES(C.Wm,C.cn,!1,C.yQP,!1,C.xD)
+C.QW=new A.ES(C.Wm,C.hU,!1,C.yQP,!1,C.xD)
 C.UY=new H.tx("result")
 C.SmN=H.Kxv('af')
 C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -22878,7 +23104,7 @@
 C.esx=I.uLC([C.B10,C.J19])
 C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.esx)
 C.zU=new H.tx("uncheckedText")
-C.uT=new A.ES(C.zU,C.BM,!1,C.lY,!1,C.ucP)
+C.uT=new A.ES(C.zU,C.BM,!1,C.Gh,!1,C.ucP)
 C.mr=new H.tx("expanded")
 C.iz=new A.ES(C.mr,C.BM,!1,C.Ow,!1,C.esx)
 C.VI=new H.tx("line")
@@ -22888,7 +23114,7 @@
 C.yw=H.Kxv('KN')
 C.NL=new A.ES(C.IT,C.BM,!1,C.yw,!1,C.ucP)
 C.A7=new H.tx("height")
-C.SD=new A.ES(C.A7,C.BM,!1,C.lY,!1,C.ucP)
+C.SD=new A.ES(C.A7,C.BM,!1,C.Gh,!1,C.ucP)
 C.fn=new H.tx("instance")
 C.Q56=H.Kxv('uq')
 C.Kk=new A.ES(C.fn,C.BM,!1,C.Q56,!1,C.ucP)
@@ -22901,30 +23127,30 @@
 C.jFX=H.Kxv('dy')
 C.dq=new A.ES(C.XA,C.BM,!1,C.jFX,!1,C.ucP)
 C.aH=new H.tx("displayCutoff")
-C.w3=new A.ES(C.aH,C.BM,!1,C.lY,!1,C.esx)
+C.w3=new A.ES(C.aH,C.BM,!1,C.Gh,!1,C.esx)
 C.rB=new H.tx("isolate")
 C.a2p=H.Kxv('bv')
 C.xY=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.esx)
 C.mJ=new H.tx("color")
-C.Qu=new A.ES(C.mJ,C.BM,!1,C.lY,!1,C.ucP)
+C.Qu=new A.ES(C.mJ,C.BM,!1,C.Gh,!1,C.ucP)
 C.bz=new H.tx("isolateChanged")
-C.Bk=new A.ES(C.bz,C.cn,!1,C.yQP,!1,C.xD)
+C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.xD)
 C.CG=new H.tx("posChanged")
-C.Ml=new A.ES(C.CG,C.cn,!1,C.yQP,!1,C.xD)
+C.Ml=new A.ES(C.CG,C.hU,!1,C.yQP,!1,C.xD)
 C.yh=new H.tx("error")
 C.oUD=H.Kxv('N7')
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
 C.Gs=new H.tx("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.lY,!1,C.esx)
+C.iO=new A.ES(C.Gs,C.BM,!1,C.Gh,!1,C.esx)
 C.oj=new H.tx("httpServer")
 C.GT=new A.ES(C.oj,C.BM,!1,C.MR,!1,C.ucP)
 C.td=new H.tx("object")
 C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
-C.ft=new H.tx("target")
+C.pD=new H.tx("target")
 C.NBK=H.Kxv('Z5')
-C.Gz=new A.ES(C.ft,C.BM,!1,C.NBK,!1,C.ucP)
+C.Gz=new A.ES(C.pD,C.BM,!1,C.NBK,!1,C.ucP)
 C.TW=new H.tx("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.lY,!1,C.esx)
+C.H0=new A.ES(C.TW,C.BM,!1,C.Gh,!1,C.esx)
 C.vp=new H.tx("list")
 C.Rz=new A.ES(C.vp,C.BM,!1,C.hAX,!1,C.ucP)
 C.uO=new H.tx("inboundReferences")
@@ -22932,14 +23158,16 @@
 C.B0=new H.tx("expand")
 C.iH=new A.ES(C.B0,C.BM,!1,C.Ow,!1,C.ucP)
 C.ba=new H.tx("pollPeriodChanged")
-C.kQ=new A.ES(C.ba,C.cn,!1,C.yQP,!1,C.xD)
+C.kQ=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.xD)
 C.Rs=new H.tx("currentPosChanged")
-C.EW=new A.ES(C.Rs,C.cn,!1,C.yQP,!1,C.xD)
+C.EW=new A.ES(C.Rs,C.hU,!1,C.yQP,!1,C.xD)
 C.zz=new H.tx("timeSpan")
-C.lS=new A.ES(C.zz,C.BM,!1,C.lY,!1,C.esx)
+C.lS=new A.ES(C.zz,C.BM,!1,C.Gh,!1,C.esx)
 C.EP=new H.tx("page")
-C.wIp=H.Kxv('JM')
-C.db=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.ucP)
+C.VW=H.Kxv('JM')
+C.db=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.ucP)
+C.CZi=H.Kxv('cn')
+C.tO=new A.ES(C.yh,C.BM,!1,C.CZi,!1,C.ucP)
 C.kw=new H.tx("trace")
 C.oC=new A.ES(C.kw,C.BM,!1,C.MR,!1,C.ucP)
 C.Ys=new H.tx("pad")
@@ -22947,12 +23175,15 @@
 C.nr=new H.tx("context")
 C.cL5=H.Kxv('lI')
 C.BO=new A.ES(C.nr,C.BM,!1,C.cL5,!1,C.ucP)
+C.WQ=new H.tx("field")
+C.n8S=H.Kxv('xB')
+C.on=new A.ES(C.WQ,C.BM,!1,C.n8S,!1,C.ucP)
 C.qX=new H.tx("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.cn,!1,C.yQP,!1,C.xD)
+C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.xD)
 C.UX=new H.tx("msg")
 C.Pt=new A.ES(C.UX,C.BM,!1,C.MR,!1,C.ucP)
 C.rP=new H.tx("mapChanged")
-C.Nt=new A.ES(C.rP,C.cn,!1,C.yQP,!1,C.xD)
+C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.xD)
 C.kB=new H.tx("metric")
 C.nq=new A.ES(C.kB,C.BM,!1,C.cdY,!1,C.ucP)
 C.nf=new H.tx("function")
@@ -22962,7 +23193,7 @@
 C.Mda=H.Kxv('Ix')
 C.bp=new A.ES(C.ne,C.BM,!1,C.Mda,!1,C.ucP)
 C.kV=new H.tx("link")
-C.vz=new A.ES(C.kV,C.BM,!1,C.lY,!1,C.ucP)
+C.vz=new A.ES(C.kV,C.BM,!1,C.Gh,!1,C.ucP)
 C.Ve=new H.tx("socket")
 C.Xmq=H.Kxv('WP')
 C.X4=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.ucP)
@@ -22973,14 +23204,14 @@
 C.vY=new H.tx("currentPos")
 C.ZS=new A.ES(C.vY,C.BM,!1,C.yw,!1,C.ucP)
 C.p8=new H.tx("event")
-C.Kp2=H.Kxv('Mk')
-C.uc=new A.ES(C.p8,C.BM,!1,C.Kp2,!1,C.ucP)
+C.x8=H.Kxv('Mk')
+C.uc=new A.ES(C.p8,C.BM,!1,C.x8,!1,C.ucP)
 C.YD=new H.tx("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.lY,!1,C.esx)
+C.fP=new A.ES(C.YD,C.BM,!1,C.Gh,!1,C.esx)
 C.Aa=new H.tx("results")
 C.k5=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.esx)
 C.t6=new H.tx("mapAsString")
-C.b6=new A.ES(C.t6,C.BM,!1,C.lY,!1,C.esx)
+C.b6=new A.ES(C.t6,C.BM,!1,C.Gh,!1,C.esx)
 C.qs=new H.tx("io")
 C.MN=new A.ES(C.qs,C.BM,!1,C.MR,!1,C.ucP)
 C.QH=new H.tx("fragmentation")
@@ -22994,37 +23225,34 @@
 C.Wj=new H.tx("process")
 C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR,!1,C.ucP)
 C.LH=new H.tx("metricChanged")
-C.oB=new A.ES(C.LH,C.cn,!1,C.yQP,!1,C.xD)
+C.oB=new A.ES(C.LH,C.hU,!1,C.yQP,!1,C.xD)
 C.He=new H.tx("hideTagsChecked")
 C.fz=new A.ES(C.He,C.BM,!1,C.Ow,!1,C.esx)
 C.eh=new H.tx("lineMode")
-C.jO=new A.ES(C.eh,C.BM,!1,C.lY,!1,C.esx)
+C.jO=new A.ES(C.eh,C.BM,!1,C.Gh,!1,C.esx)
 C.PM=new H.tx("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.lY,!1,C.esx)
+C.jv=new A.ES(C.PM,C.BM,!1,C.Gh,!1,C.esx)
 C.Zi=new H.tx("lastAccumulatorReset")
-C.xx=new A.ES(C.Zi,C.BM,!1,C.lY,!1,C.esx)
+C.xx=new A.ES(C.Zi,C.BM,!1,C.Gh,!1,C.esx)
 C.lH=new H.tx("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.lY,!1,C.ucP)
+C.dG=new A.ES(C.lH,C.BM,!1,C.Gh,!1,C.ucP)
 C.VK=new H.tx("devtools")
 C.lW=new A.ES(C.VK,C.BM,!1,C.Ow,!1,C.ucP)
-C.AV=new H.tx("callback")
-C.QiO=H.Kxv('Sa')
-C.fr=new A.ES(C.AV,C.BM,!1,C.QiO,!1,C.ucP)
 C.vs=new H.tx("endLine")
 C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.esx)
 C.li=new H.tx("startPosChanged")
-C.Tz=new A.ES(C.li,C.cn,!1,C.yQP,!1,C.xD)
+C.Tz=new A.ES(C.li,C.hU,!1,C.yQP,!1,C.xD)
 C.ox=new H.tx("countersChanged")
-C.Rh=new A.ES(C.ox,C.cn,!1,C.yQP,!1,C.xD)
+C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.xD)
 C.XM=new H.tx("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR,!1,C.ucP)
-C.GO=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.esx)
+C.GO=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.esx)
 C.bJ=new H.tx("counters")
 C.UI=new A.ES(C.bJ,C.BM,!1,C.SXK,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.lY,!1,C.esx)
+C.h3=new A.ES(C.bE,C.BM,!1,C.Gh,!1,C.esx)
 C.N8=new H.tx("scriptChanged")
-C.qE=new A.ES(C.N8,C.cn,!1,C.yQP,!1,C.xD)
+C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.xD)
 C.YT=new H.tx("expr")
 C.wG=H.Kxv('dynamic')
 C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
@@ -23033,42 +23261,42 @@
 C.jU=new H.tx("file")
 C.bw=new A.ES(C.jU,C.BM,!1,C.MR,!1,C.ucP)
 C.xS=new H.tx("tagSelectorChanged")
-C.hd=new A.ES(C.xS,C.cn,!1,C.yQP,!1,C.xD)
+C.hd=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.xD)
 C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
 C.uu=new H.tx("internal")
 C.NJ=new A.ES(C.uu,C.BM,!1,C.Ow,!1,C.ucP)
 C.YE=new H.tx("webSocket")
 C.Wl=new A.ES(C.YE,C.BM,!1,C.MR,!1,C.ucP)
 C.Dj=new H.tx("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.lY,!1,C.esx)
+C.Ay=new A.ES(C.Dj,C.BM,!1,C.Gh,!1,C.esx)
 C.Gr=new H.tx("endPos")
 C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
 C.RJ=new H.tx("vm")
-C.n8S=H.Kxv('wv')
-C.BP=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.ucP)
+C.U0P=H.Kxv('wv')
+C.BP=new A.ES(C.RJ,C.BM,!1,C.U0P,!1,C.ucP)
 C.uX=new H.tx("standaloneVmAddress")
-C.Eb=new A.ES(C.uX,C.BM,!1,C.lY,!1,C.ucP)
+C.Eb=new A.ES(C.uX,C.BM,!1,C.Gh,!1,C.ucP)
 C.PX=new H.tx("script")
-C.KB=H.Kxv('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
+C.iF=H.Kxv('vx')
+C.jz=new A.ES(C.PX,C.BM,!1,C.iF,!1,C.ucP)
 C.Gn=new H.tx("objectChanged")
-C.az=new A.ES(C.Gn,C.cn,!1,C.yQP,!1,C.xD)
+C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.xD)
 C.o0=new A.ES(C.vp,C.BM,!1,C.MR,!1,C.ucP)
 C.i4=new H.tx("code")
-C.nqy=H.Kxv('kx')
-C.aJ=new A.ES(C.i4,C.BM,!1,C.nqy,!1,C.ucP)
+C.pM=H.Kxv('kx')
+C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
 C.nE=new H.tx("tracer")
 C.Tbd=H.Kxv('KZ')
 C.FM=new A.ES(C.nE,C.BM,!1,C.Tbd,!1,C.ucP)
 C.kI=new H.tx("currentLine")
 C.Bf=new A.ES(C.kI,C.BM,!1,C.yw,!1,C.esx)
 C.kG=new H.tx("classTable")
-C.rX=H.Kxv('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.rX,!1,C.esx)
+C.m7I=H.Kxv('UC')
+C.Pr=new A.ES(C.kG,C.BM,!1,C.m7I,!1,C.esx)
 C.uk=new H.tx("last")
 C.rY=new A.ES(C.uk,C.BM,!1,C.Ow,!1,C.ucP)
 C.TN=new H.tx("lastServiceGC")
-C.Gj=new A.ES(C.TN,C.BM,!1,C.lY,!1,C.esx)
+C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.esx)
 C.OO=new H.tx("flag")
 C.Cf=new A.ES(C.OO,C.BM,!1,C.SXK,!1,C.ucP)
 C.S4=new H.tx("busy")
@@ -23078,21 +23306,22 @@
 C.am=new H.tx("chromeTargets")
 C.JD=new A.ES(C.am,C.BM,!1,C.Gsc,!1,C.esx)
 C.oE=new H.tx("chromiumAddress")
-C.r2=new A.ES(C.oE,C.BM,!1,C.lY,!1,C.ucP)
-C.WQ=new H.tx("field")
-C.ah=new A.ES(C.WQ,C.BM,!1,C.MR,!1,C.ucP)
+C.r2=new A.ES(C.oE,C.BM,!1,C.Gh,!1,C.ucP)
+C.AV=new H.tx("callback")
+C.Fyq=H.Kxv('Sa')
+C.k1=new A.ES(C.AV,C.BM,!1,C.Fyq,!1,C.ucP)
 C.r1=new H.tx("expandChanged")
-C.nP=new A.ES(C.r1,C.cn,!1,C.yQP,!1,C.xD)
+C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.xD)
 C.Mc=new H.tx("flagList")
 C.f0=new A.ES(C.Mc,C.BM,!1,C.MR,!1,C.ucP)
 C.rE=new H.tx("frame")
 C.B7=new A.ES(C.rE,C.BM,!1,C.SXK,!1,C.ucP)
 C.cg=new H.tx("anchor")
-C.ll=new A.ES(C.cg,C.BM,!1,C.lY,!1,C.ucP)
+C.ll=new A.ES(C.cg,C.BM,!1,C.Gh,!1,C.ucP)
 C.ngm=I.uLC([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.nqy,!1,C.ngm)
+C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ngm)
 C.mi=new H.tx("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.lY,!1,C.esx)
+C.yV=new A.ES(C.mi,C.BM,!1,C.Gh,!1,C.esx)
 C.tW=new H.tx("pos")
 C.It=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.ucP)
 C.TO=new A.ES(C.kY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -23100,25 +23329,12 @@
 C.Df=new A.ES(C.uG,C.BM,!1,C.Ow,!1,C.esx)
 C.IBq=H.Kxv('T8')
 C.xR=new A.ES(C.SR,C.BM,!1,C.IBq,!1,C.ucP)
-C.oqo=H.Kxv('pD')
-C.Ul=new A.ES(C.yh,C.BM,!1,C.oqo,!1,C.ucP)
 C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
 C.vb=new H.tx("profile")
 C.Mq=new A.ES(C.vb,C.BM,!1,C.MR,!1,C.ucP)
 C.KK=new A.ES(C.uO,C.BM,!1,C.Gsc,!1,C.esx)
 C.ny=new P.a6(0)
-C.it=new P.moY(!1)
-C.d6=H.VM(new W.FkO("close"),[W.BI])
-C.iw=H.VM(new W.FkO("disconnect"),[W.PGY])
-C.JN=H.VM(new W.FkO("error"),[W.ew7])
-C.MD=H.VM(new W.FkO("error"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.ew7])
-C.G5=H.VM(new W.FkO("loadend"),[W.ew7])
-C.ph=H.VM(new W.FkO("message"),[W.cxu])
-C.Whw=H.VM(new W.FkO("mousedown"),[W.AjY])
-C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
-C.JL=H.VM(new W.FkO("open"),[W.ea])
-C.yf=H.VM(new W.FkO("popstate"),[W.niR])
+C.eL=new P.moY(!1)
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -23251,16 +23467,16 @@
   hooks.prototypeForTag = prototypeForTagFixed;
 }
 C.xr=new P.byg(null,null)
-C.A3=new P.c5(null)
-C.cb=new P.ojF(null,null)
+C.A3=new P.Mx(null)
+C.Sr=new P.ojF(null,null)
 C.EkO=new N.Ng("FINER",400)
-C.t4=new N.Ng("FINE",500)
+C.R5=new N.Ng("FINE",500)
 C.IF=new N.Ng("INFO",800)
-C.oOA=new N.Ng("OFF",2000)
+C.oO=new N.Ng("OFF",2000)
 C.cd=new N.Ng("SEVERE",1000)
 C.nT=new N.Ng("WARNING",900)
 C.Gb=H.VM(I.uLC([127,2047,65535,1114111]),[P.KN])
-C.Q5=I.uLC([1,6])
+C.jb=I.uLC([1,6])
 C.rz=I.uLC([0,0,32776,33792,1,10240,0,0])
 C.SY=new H.tx("keys")
 C.l4=new H.tx("values")
@@ -23270,22 +23486,22 @@
 C.WK=I.uLC([C.SY,C.l4,C.Wn,C.ai,C.nZ])
 C.o5=I.uLC([0,0,65490,45055,65535,34815,65534,18431])
 C.fW=H.VM(I.uLC(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.qq=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
-C.Fa=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
+C.mKy=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
+C.yD=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
 C.fJ3=H.Kxv('iv')
-C.bfK=I.uLC([C.fJ3])
+C.fo=I.uLC([C.fJ3])
 C.ip=I.uLC(["==","!=","<=",">=","||","&&"])
 C.jY=I.uLC(["as","in","this"])
 C.jx=I.uLC([0,0,32722,12287,65534,34815,65534,18431])
-C.QC=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.Jp=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.uLC([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.B2=I.uLC([0,0,24576,1023,65534,34815,65534,18431])
 C.aa=I.uLC([0,0,32754,11263,65534,34815,65534,18431])
 C.ZJ=I.uLC([0,0,65490,12287,65535,34815,65534,18431])
-C.yk=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
-C.iq=I.uLC([40,41,91,93,123,125])
+C.jr=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
+C.ML=I.uLC([40,41,91,93,123,125])
 C.zao=I.uLC(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.bq=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
+C.lY=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
 C.Vgv=I.uLC(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.yt=new H.LPe(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
 C.rW=I.uLC(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
@@ -23293,17 +23509,17 @@
 C.kKi=I.uLC(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.w0=new H.LPe(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
 C.MEG=I.uLC(["enumerate"])
-C.mB=new H.LPe(1,{enumerate:K.FLA()},C.MEG)
+C.c7=new H.LPe(1,{enumerate:K.HZg()},C.MEG)
 C.tq=H.Kxv('Bo')
 C.uwj=H.Kxv('wA')
 C.wE=I.uLC([C.uwj])
 C.Tb=new A.rv(!1,!1,!0,C.tq,!1,!0,C.wE,null)
 C.eQn=H.Kxv('Yj')
 C.Qnw=I.uLC([C.eQn])
-C.m8=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
+C.jJ=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
 C.jUO=H.Kxv('xn')
-C.erP=I.uLC([C.jUO])
-C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.erP,null)
+C.qv=I.uLC([C.jUO])
+C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.qv,null)
 C.wj=new D.M9x("Internal")
 C.Cn=new D.M9x("Listening")
 C.lT=new D.M9x("Normal")
@@ -23311,7 +23527,7 @@
 C.BE=new H.tx("averageCollectionPeriodInMillis")
 C.IH=new H.tx("address")
 C.j2=new H.tx("app")
-C.US=new H.tx("architecture")
+C.ke=new H.tx("architecture")
 C.Wq=new H.tx("asStringLiteral")
 C.ET=new H.tx("assertsEnabled")
 C.WC=new H.tx("bpt")
@@ -23337,6 +23553,7 @@
 C.RG=new H.tx("currentPage")
 C.hJ=new H.tx("dartMetrics")
 C.ee=new H.tx("data")
+C.yC=new H.tx("declaredType")
 C.Lw=new H.tx("deleteVm")
 C.eR=new H.tx("deoptimizations")
 C.LS=new H.tx("description")
@@ -23374,6 +23591,9 @@
 C.RY=new H.tx("getTabs")
 C.d4=new H.tx("goto")
 C.cF=new H.tx("gotoLink")
+C.ft=new H.tx("guardClass")
+C.fX=new H.tx("guardLength")
+C.dr=new H.tx("guardNullable")
 C.SI=new H.tx("hasDescriptors")
 C.zS=new H.tx("hasDisassembly")
 C.YA=new H.tx("hasNoAllocations")
@@ -23403,6 +23623,7 @@
 C.Yg=new H.tx("isDartCode")
 C.bR=new H.tx("isDouble")
 C.ob=new H.tx("isError")
+C.dR=new H.tx("isFinal")
 C.WV=new H.tx("isFinalized")
 C.Ih=new H.tx("isImplemented")
 C.MY=new H.tx("isInlinable")
@@ -23424,7 +23645,7 @@
 C.b5=new H.tx("jumpTarget")
 C.z6=new H.tx("key")
 C.Lc=new H.tx("kind")
-C.kA=new H.tx("lastTokenPos")
+C.qa=new H.tx("lastTokenPos")
 C.GI=new H.tx("lastUpdate")
 C.ur=new H.tx("lib")
 C.VN=new H.tx("libraries")
@@ -23445,9 +23666,10 @@
 C.BJ=new H.tx("newSpace")
 C.OV=new H.tx("noSuchMethod")
 C.c6=new H.tx("notifications")
-C.jo=new H.tx("objectClass")
+C.as=new H.tx("objectClass")
 C.zO=new H.tx("objectPool")
 C.vg=new H.tx("oldSpace")
+C.Yp=new H.tx("owner")
 C.YV=new H.tx("owningClass")
 C.If=new H.tx("owningLibrary")
 C.zm=new H.tx("padding")
@@ -23458,6 +23680,7 @@
 C.yG=new H.tx("pauseEvent")
 C.uI=new H.tx("pid")
 C.Jf=new H.tx("possibleBpt")
+C.rm=new H.tx("privateKey")
 C.AY=new H.tx("protocol")
 C.AO=new H.tx("qualifiedName")
 C.Xd=new H.tx("reachable")
@@ -23468,7 +23691,7 @@
 C.KX=new H.tx("refreshCoverage")
 C.ja=new H.tx("refreshGC")
 C.mn=new H.tx("refreshRateChange")
-C.SE=new H.tx("registerCallback")
+C.L9=new H.tx("registerCallback")
 C.ir=new H.tx("relativeLink")
 C.dx=new H.tx("remoteAddress")
 C.ni=new H.tx("remotePort")
@@ -23514,7 +23737,7 @@
 C.dA=new H.tx("tokenPos")
 C.bc=new H.tx("topFrame")
 C.h5=new H.tx("totalCollectionTimeInSeconds")
-C.kr=new H.tx("totalSamplesInProfile")
+C.Kj=new H.tx("totalSamplesInProfile")
 C.ep=new H.tx("tree")
 C.hB=new H.tx("type")
 C.J2=new H.tx("typeChecksEnabled")
@@ -23525,7 +23748,7 @@
 C.Fh=new H.tx("url")
 C.yv=new H.tx("usageCounter")
 C.LP=new H.tx("used")
-C.Gy=new H.tx("userName")
+C.ct=new H.tx("userName")
 C.jh=new H.tx("v")
 C.zd=new H.tx("value")
 C.Db=new H.tx("valueAsString")
@@ -23535,6 +23758,7 @@
 C.zn=new H.tx("version")
 C.Sk=new H.tx("vmMetrics")
 C.KS=new H.tx("vmName")
+C.MA=new H.tx("vmType")
 C.Uy=new H.tx("writeClosed")
 C.hP=H.Kxv('uz')
 C.Qb=H.Kxv('J3')
@@ -23543,15 +23767,15 @@
 C.Dl=H.Kxv('F1')
 C.mK=H.Kxv('Mb')
 C.UJ=H.Kxv('oa')
-C.uh=H.Kxv('aI')
+C.E0=H.Kxv('aI')
 C.Y3=H.Kxv('CY')
 C.QJ=H.Kxv('WG')
-C.Bc=H.Kxv('Hl')
-C.kq=H.Kxv('Nn')
+C.ra=H.Kxv('Nn')
 C.j4=H.Kxv('IW')
 C.Ke=H.Kxv('EZ')
 C.Vx=H.Kxv('MJ')
 C.Vh=H.Kxv('Pz')
+C.HC=H.Kxv('F0')
 C.rR=H.Kxv('wN')
 C.kt=H.Kxv('Um')
 C.yS=H.Kxv('G6')
@@ -23572,20 +23796,21 @@
 C.dD=H.Kxv('av')
 C.FA=H.Kxv('Ya')
 C.PFz=H.Kxv('yyN')
+C.T1=H.Kxv('Wy')
 C.Th=H.Kxv('fI')
-C.cz=H.Kxv('Vf')
 C.tU=H.Kxv('L4')
+C.yT=H.Kxv('FK')
 C.cK=H.Kxv('I5')
 C.jA=H.Kxv('Eg')
 C.K4=H.Kxv('hV')
 C.Mt=H.Kxv('hu')
-C.laj=H.Kxv('ZX')
+C.qB=H.Kxv('ZX')
+C.CR=H.Kxv('CP')
 C.ca=H.Kxv('Z4')
 C.pJ=H.Kxv('Q6')
 C.Yy=H.Kxv('uE')
-C.WU=H.Kxv('lf')
-C.nC=H.Kxv('cQ')
 C.M5=H.Kxv('yc')
+C.kA=H.Kxv('G0')
 C.Yxm=H.Kxv('Pg')
 C.il=H.Kxv('xI')
 C.lp=H.Kxv('LU')
@@ -23594,9 +23819,12 @@
 C.EG=H.Kxv('Oz')
 C.nw=H.Kxv('eo')
 C.OG=H.Kxv('eW')
+C.hD=H.Kxv('lM')
 C.km=H.Kxv('fl')
 C.jV=H.Kxv('rF')
 C.rC=H.Kxv('qV')
+C.OZ=H.Kxv('Ce')
+C.Ho=H.Kxv('zt')
 C.Tq=H.Kxv('vj')
 C.ou=H.Kxv('ak')
 C.JW=H.Kxv('Ww')
@@ -23609,27 +23837,25 @@
 C.FG=H.Kxv('qh')
 C.bC=H.Kxv('D2')
 C.Nw=H.Kxv('vr')
+C.kq=H.Kxv('NT')
 C.a8=H.Kxv('Zx')
-C.YZ=H.Kxv('zt')
 C.NR=H.Kxv('nm')
 C.Fn=H.Kxv('qn')
 C.DD=H.Kxv('Zn')
-C.nj=H.Kxv('hg')
+C.Ev=H.Kxv('Un')
 C.qF=H.Kxv('mO')
-C.JA3=H.Kxv('b0B')
 C.Ey=H.Kxv('wM')
 C.pF=H.Kxv('WS')
 C.qZ=H.Kxv('DE')
 C.jw=H.Kxv('xc')
 C.NW=H.Kxv('ye')
+C.jRi=H.Kxv('we')
 C.pi=H.Kxv('FB')
 C.Xv=H.Kxv('n5')
 C.KO=H.Kxv('ZP')
-C.nW=H.Kxv('V2')
 C.he=H.Kxv('qM')
 C.Wz=H.Kxv('pR')
 C.tc=H.Kxv('Ma')
-C.Wr=H.Kxv('m9')
 C.Io=H.Kxv('Qh')
 C.Qt=H.Kxv('NK')
 C.wk=H.Kxv('nJ')
@@ -23644,7 +23870,7 @@
 C.Az=H.Kxv('Gk')
 C.GX=H.Kxv('c8')
 C.R9=H.Kxv('f7')
-C.QP=H.Kxv('vi')
+C.J0=H.Kxv('vi')
 C.tQ=H.Kxv('Vu')
 C.X8=H.Kxv('Ti')
 C.Lg=H.Kxv('JI')
@@ -23655,28 +23881,28 @@
 C.oT=H.Kxv('VY')
 C.jK=H.Kxv('el')
 C.xM=new P.u5F(!1)
-C.NA=new P.Uf(C.NU,P.RN())
-C.Xk=new P.Uf(C.NU,P.Dk())
-C.F6=new P.Uf(C.NU,P.H9())
-C.Rt=new P.Uf(C.NU,P.wLZ())
-C.Sq=new P.Uf(C.NU,P.zci())
-C.mc=new P.Uf(C.NU,P.OjX())
-C.uo=new P.Uf(C.NU,P.uy1())
-C.pj=new P.Uf(C.NU,P.W7())
-C.lk=new P.Uf(C.NU,P.qKH())
-C.Gu=new P.Uf(C.NU,P.xd())
-C.Yl=new P.Uf(C.NU,P.MM())
-C.Zc=new P.Uf(C.NU,P.yA())
-C.zb=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
+C.rj=new P.Ls(C.NU,P.Uwa())
+C.Xk=new P.Ls(C.NU,P.Dk())
+C.pm=new P.Ls(C.NU,P.zi())
+C.Rt=new P.Ls(C.NU,P.wLZ())
+C.Sq=new P.Ls(C.NU,P.zci())
+C.mc=new P.Ls(C.NU,P.xN())
+C.uo=new P.Ls(C.NU,P.uy1())
+C.pj=new P.Ls(C.NU,P.u3Q())
+C.lk=new P.Ls(C.NU,P.qKH())
+C.Gu=new P.Ls(C.NU,P.xd())
+C.Yl=new P.Ls(C.NU,P.MM())
+C.Zc=new P.Ls(C.NU,P.yA())
+C.Qq=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
 $.VzC=null
-$.kz=1
+$.v0=1
 $.z7="$cachedFunction"
 $.Mr="$cachedInvocation"
 $.xG=null
 $.hG=null
 $.OK=0
-$.mJs=null
+$.bf=null
 $.P4=null
 $.lcs=!1
 $.NF=null
@@ -23701,112 +23927,113 @@
 $.RL=!1
 $.DR=C.IF
 $.xO=0
-$.Nc=0
+$.dL=0
 $.Oo=null
 $.Td=!1
 $.jq1=0
-$.ljh=1
-$.ls=2
+$.ng=1
+$.H2=2
 $.rf=null
 $.ok=!1
-$.HE=!1
+$.DG=!1
 $.M6=null
 $.UG=!0
 $.RQ="objects/"
 $.vU=null
-$.Xa=null
-$.ax=null
-$.AuW=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.Br},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.Zgg},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.z0},C.j4,D.IW,{created:D.dmb},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.KU},C.Sb,A.kn,{created:A.Thl},C.kH,U.NY,{created:U.q5n},C.IZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.fm},C.uC,O.Im,{created:O.eka},C.PT,M.CX,{created:M.SPd},C.iD,O.Vb,{created:O.teo},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.yC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.bUN},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.YtF},C.rC,L.qV,{created:L.P5f},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.TH},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.qa},C.Mz,Z.uL,{created:Z.ew},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.Hr},C.Nw,T.vr,{created:T.aed},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.kf},C.nj,Y.hg,{created:Y.Ifw},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.oaJ},C.NW,A.ye,{created:A.mBQ},C.pi,N.FB,{created:N.kUw},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Wz,B.pR,{created:B.luW},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.aMd},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.tQ,X.Vu,{created:X.lt2},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
+$.Hg=null
+$.hm=null
+$.uv=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.PU},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.Zgg},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.KTC},C.j4,D.IW,{created:D.v8},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.wZ7},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.KU},C.Sb,A.kn,{created:A.Thl},C.kH,U.NY,{created:U.ui},C.IZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.Qje},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.FeK},C.uC,O.Im,{created:O.eka},C.PT,M.CX,{created:M.ec},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.CM},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.P5Z},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.Ln},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.kA,Y.G0,{created:Y.zE},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.Le},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.zf},C.rC,L.qV,{created:L.P5f},C.OZ,Q.Ce,{created:Q.FMr},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.zB},C.JW,A.Ww,{created:A.wC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.Mz,Z.uL,{created:Z.LD},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.n5p},C.Nw,T.vr,{created:T.aed},C.kq,L.NT,{created:L.di},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.n0},C.qF,E.mO,{created:E.V6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.yk},C.NW,A.ye,{created:A.mBQ},C.jRi,H.we,{"":H.m6},C.pi,N.FB,{created:N.kUw},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.TEI},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.kR},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.aMd},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.tQ,X.Vu,{created:X.lt2},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
 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($,"workerIds","Fa","cz",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($,"notClosurePattern","xq","bN",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
 I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"undefinedCallPattern","GK","BN",function(){return H.cM(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Y9",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"nullPropertyPattern","BX","W6",function(){return H.cM(H.Mj(null))})
 I.$lazy($,"nullLiteralPropertyPattern","tt","PB",function(){return H.cM(function(){try{null.$method$}catch(z){return z.message}}())})
 I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.cM(H.Mj(void 0))})
 I.$lazy($,"undefinedLiteralPropertyPattern","Ai","qK",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_matcher","lZ","NP",function(){return new H.VR("isolates/.*/metrics",H.v4("isolates/.*/metrics",!1,!0,!1),null,null)})
-I.$lazy($,"_isolateMatcher","AX","qL",function(){return new H.VR("isolates/.*/",H.v4("isolates/.*/",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","lZ","NP",function(){return new H.VR("isolates/.*/metrics",H.Vq("isolates/.*/metrics",!1,!0,!1),null,null)})
+I.$lazy($,"_isolateMatcher","M2","Il",function(){return new H.VR("isolates/.*/",H.Vq("isolates/.*/",!1,!0,!1),null,null)})
 I.$lazy($,"POLL_PERIODS","Bw","c3",function(){return[8000,4000,2000,1000,100]})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","Mn","zp",function(){return P.xg()})
-I.$lazy($,"_rootMap","ln","OL",function(){return P.YM(null,null,null,null,null)})
+I.$lazy($,"_rootMap","ln","wb",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
 I.$lazy($,"context","Lt","Xw",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","Os","Qg",function(){return[0,0,0,255]})
+I.$lazy($,"_pageSeparationColor","dg","vl",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.TJ)})
-I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","HS","ptP",function(){return new L.vH([])})
-I.$lazy($,"_identRegExp","pVY","cx",function(){return new L.lPa().$0()})
-I.$lazy($,"_logger","y7Y","YLt",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","zC","fX",function(){return P.L5(null,null,null,P.qU,L.Zl)})
-I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.Mo(null,C.qY),null)})
+I.$lazy($,"_logger","y7","aT",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","l7","O3",function(){return new L.vH([])})
+I.$lazy($,"_identRegExp","fZ","cD",function(){return new L.MdQ().$0()})
+I.$lazy($,"_logger","y7Y","Nd",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
+I.$lazy($,"_polymerSyntax","Kb","Cl",function(){return new A.Li(T.GF(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.Lz)})
-I.$lazy($,"_declarations","Hq","w3G",function(){return P.L5(null,null,null,P.qU,A.So)})
-I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
+I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_hasShadowDomPolyfill","PR","oo",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
 I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","pe","Is",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.rv(!1,!1,!0,C.tq,!1,!0,null,A.hU())})
-I.$lazy($,"_ATTRIBUTES_REGEX","TS","FF",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"_sheetLog","pe","eU",function(){return N.QM("polymer.stylesheet")})
+I.$lazy($,"_changedMethodQueryOptions","cq","or",function(){return new A.rv(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
+I.$lazy($,"_ATTRIBUTES_REGEX","TS","FF",function(){return new H.VR("\\s|,",H.Vq("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Xw(),"Platform")})
-I.$lazy($,"bindPattern","ZA","VCp",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_Polymer","kz","uj",function(){return J.UQ($.Xw(),"Polymer")})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.Vq("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_onReady","T8g","j6",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","fo","vo",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","Lu",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_watchLog","p5","REM",function(){return N.QM("polymer.watch")})
-I.$lazy($,"_readyLog","nS","lg",function(){return N.QM("polymer.ready")})
-I.$lazy($,"_PolymerGestures","Jm","tNi",function(){return J.UQ($.Xw(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","f8","Dw",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","FZ4","h2",function(){return P.EF([C.lY,new Z.lP(),C.GX,new Z.wJY(),C.Yc,new Z.zOQ(),C.Ow,new Z.W6o(),C.yw,new Z.MdQ(),C.cz,new Z.YJG()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"!",new K.w11()],null,null)})
+I.$lazy($,"_observeLog","DZ","a3",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_eventsLog","PK","xW",function(){return N.QM("polymer.events")})
+I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_bindLog","xz","aQ",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_watchLog","p5","Is",function(){return N.QM("polymer.watch")})
+I.$lazy($,"_readyLog","nS","Fs",function(){return N.QM("polymer.ready")})
+I.$lazy($,"_PolymerGestures","Yd","Op",function(){return J.UQ($.Xw(),"PolymerGestures")})
+I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
+I.$lazy($,"_typeHandlers","lq","RO",function(){return P.EF([C.Gh,new Z.DO(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.Ow,new Z.Ra(),C.yw,new Z.wJY(),C.CR,new Z.zOQ()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"*",new K.w11(),"/",new K.w12(),"%",new K.w13(),"==",new K.w14(),"!=",new K.w15(),"===",new K.w16(),"!==",new K.w17(),">",new K.w18(),">=",new K.w19(),"<",new K.w20(),"<=",new K.w21(),"||",new K.w22(),"&&",new K.w23(),"|",new K.w24()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","oQ","EU",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"!",new K.Raa()],null,null)})
 I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","vf","fA",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"kRegularFunction","Ij","qu",function(){return new D.ma("function")})
-I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.ma("closure function")})
-I.$lazy($,"kGetterFunction","F0","xW",function(){return new D.ma("getter function")})
-I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.ma("setter function")})
-I.$lazy($,"kConstructor","G8","kj",function(){return new D.ma("constructor")})
-I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.ma("implicit getter function")})
-I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.ma("implicit setter function")})
-I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.ma("static initializer")})
-I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.ma("method extractor")})
-I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.ma("noSuchMethod dispatcher")})
-I.$lazy($,"kInvokeFieldDispatcher","HU","f6",function(){return new D.ma("invoke field dispatcher")})
-I.$lazy($,"kCollected","bt","b1",function(){return new D.ma("Collected")})
-I.$lazy($,"kNative","dQ","Nk",function(){return new D.ma("Native")})
-I.$lazy($,"kTag","z3","zx",function(){return new D.ma("Tag")})
-I.$lazy($,"kReused","Gh","dh",function(){return new D.ma("Reused")})
-I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.ma("UNKNOWN")})
+I.$lazy($,"_currentIsolateMatcher","vf","jN",function(){return new H.VR("isolates/\\d+",H.Vq("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","r0",function(){return new H.VR("isolates/\\d+/",H.Vq("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"kRegularFunction","et","xK",function(){return new D.yz("function")})
+I.$lazy($,"kClosureFunction","jX","HU",function(){return new D.yz("closure function")})
+I.$lazy($,"kGetterFunction","PZ","rQ",function(){return new D.yz("getter function")})
+I.$lazy($,"kSetterFunction","Bs","en",function(){return new D.yz("setter function")})
+I.$lazy($,"kConstructor","G8","kj",function(){return new D.yz("constructor")})
+I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.yz("implicit getter function")})
+I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.yz("implicit setter function")})
+I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.yz("static initializer")})
+I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.yz("method extractor")})
+I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.yz("noSuchMethod dispatcher")})
+I.$lazy($,"kInvokeFieldDispatcher","fJ","bh",function(){return new D.yz("invoke field dispatcher")})
+I.$lazy($,"kCollected","bt","Dh",function(){return new D.yz("Collected")})
+I.$lazy($,"kNative","dQ","Nk",function(){return new D.yz("Native")})
+I.$lazy($,"kTag","z3","zx",function(){return new D.yz("Tag")})
+I.$lazy($,"kReused","tT","OA",function(){return new D.yz("Reused")})
+I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.yz("UNKNOWN")})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
-I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
+I.$lazy($,"typeInspector","Yv","II",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","vu",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.vE(null)})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
 I.$lazy($,"_contentsOwner","Ub","B8",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","v2","Ou",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.xB.g("template, ",J.ZG(J.kl(C.bq.gvc(C.bq),new M.DOe()),", "))})
-I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.Ufa())})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Raa().$0()})
-I.$lazy($,"_instanceExtension","nB","nR",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_expando","fF","as",function(){return H.VM(new P.qo("template_binding"),[null])})
+I.$lazy($,"_ownerStagingDocument","Xi","MO",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.yo.g("template, ",J.ZG(J.kl(C.lY.gvc(C.lY),new M.W6o()),", "))})
+I.$lazy($,"_templateObserver","joK","TQ",function(){return W.Ws(new M.YJG())})
+I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.DOe().$0()})
+I.$lazy($,"_instanceExtension","lET","Uo",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_isStagingDocument","Fg","Tg",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"a1",ret:P.lf},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"T9",void:true},{func:"LP",void:true,args:[{func:"T9",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"HQr",ret:{func:"ny"},args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"qs",ret:{func:"l4",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},{func:"tD",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"T9",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"JX",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"qa",ret:P.SQ,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"DW",ret:U.rx,args:[P.qU]},{func:"ZU",args:[U.rx,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"I6a",ret:P.qU},"invocation","fractionDigits",{func:"ny"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"lrq",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.Ix]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.SQ,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.niR]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"jB",args:[D.uq]},{func:"Np8",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"ux",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"aG",void:true,args:[P.EH]},{func:"lJL",args:[{func:"T9",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"yV",args:[null],opt:[null]},{func:"Wy",ret:P.SQ},"ignored","convert","element",{func:"K5",args:[P.SQ]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.Vf,args:[P.qU]},{func:"cd",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"bB",void:true,args:[W.AjY]},{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"T5",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"Ig",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.Vf]},"time",{func:"FJ",ret:P.qU,args:[P.qU],opt:[P.SQ]},"wasTruncated",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Zl,null]},"model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"zi",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.SQ]},{func:"qj",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.rx,U.rx]},{func:"Qc",args:[U.rx]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"K7",void:true,args:[[P.WO,P.KN]]},"counters",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"ze",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.U2]},{func:"Riv",args:[P.V2]},{func:"T3G",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"S0",void:true,args:[P.SQ,null]},"exp","details",{func:"D2",ret:A.Ap,args:[P.qU]},"ref","ifValue",{func:"PzC",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
+init.metadata=["object","sender","e",{func:"rb",args:[P.qU]},{func:"Za",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"qt",void:true},{func:"n9F",void:true,args:[{func:"qt",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"HQr",ret:{func:"ny"},args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"qs",ret:{func:"aB",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},{func:"tD",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"qt",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"pe",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"qa",ret:P.SQ,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"DW",ret:U.hw,args:[P.qU]},{func:"ZU",args:[U.hw,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"mb",ret:P.qU},"invocation","fractionDigits",{func:"ny"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"HF",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"F3",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.Ix]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.SQ,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.niR]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"le",args:[D.uq]},{func:"jM",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"ff",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"hF",void:true,args:[P.EH]},{func:"jF",args:[{func:"qt",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"Hp",args:[null],opt:[null]},{func:"cA",ret:P.SQ},"ignored","convert","element",{func:"K5",args:[P.SQ]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"nY",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"QO",void:true,args:[W.v3]},{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"rb",args:[P.qU]}]},{func:"T5",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.v3,null,W.h4]},{func:"zs",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"FJ",ret:P.qU,args:[P.qU],opt:[P.SQ]},"wasTruncated",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Tv,null]},"model","node","oneTime",{func:"zI",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"zi",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.SQ]},{func:"qj",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.hw,U.hw]},{func:"mM9",args:[U.hw]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"K7",void:true,args:[[P.WO,P.KN]]},"counters",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"RC",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.Z8]},{func:"Riv",args:[P.Wy]},{func:"Kg",args:[P.qU,L.Z8]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"K8",void:true,args:[P.SQ,null]},"exp","details",{func:"kn",ret:A.Ap,args:[P.qU]},"ref","ifValue",{func:"PzC",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -23941,7 +24168,7 @@
 a[c]=y
 a[d]=function(){var w=$[c]
 try{if(w===y){$[c]=x
-try{w=$[c]=e()}finally{if(w===y)if($[c]===x)$[c]=null}}else{if(w===x)H.eQK(b)}return w}finally{$[d]=function(){return this[c]}}}}
+try{w=$[c]=e()}finally{if(w===y)$[c]=null}}else{if(w===x)H.eQK(b)}return w}finally{$[d]=function(){return this[c]}}}}
 I.$finishIsolateConstructor=function(a){var y=a.p
 function Isolate(){var x=Object.prototype.hasOwnProperty
 for(var w in y)if(x.call(y,w))this[w]=y[w]
@@ -23967,5 +24194,5 @@
 return}if(document.currentScript){a(document.currentScript)
 return}var z=document.scripts
 function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.jk(),b)},[])}else{(function(b){H.wW(E.jk(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.V7A(),b)},[])}else{(function(b){H.wW(E.V7A(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/elements.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/elements.html
index a096870..e54546b 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/elements.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/elements.html
@@ -26,6 +26,8 @@
 <link rel="import" href="src/elements/library_view.html">
 <link rel="import" href="src/elements/metrics.html">
 <link rel="import" href="src/elements/nav_bar.html">
+<link rel="import" href="src/elements/object_common.html">
+<link rel="import" href="src/elements/object_view.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/script_inset.html">
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_view.html
index d1fbf97..f8af57d 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_view.html
@@ -108,8 +108,8 @@
                   <field-ref ref="{{ field }}"></field-ref>
                 </div>
                 <div class="memberValue">
-                  <template if="{{ field['value'] != null }}">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                  <template if="{{ field.value != null }}">
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </template>
                 </div>
               </div>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_ref.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_ref.html
index ab1de8e..bc74935 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_ref.html
@@ -7,15 +7,15 @@
   <template>
   <link rel="stylesheet" href="css/shared.css">
     <span>
-      <template if="{{ ref['static'] }}">static</template>
-      <template if="{{ ref['final'] }}">final</template>
-      <template if="{{ ref['const'] }}">const</template>
-      <template if="{{ (ref['declaredType'].name == 'dynamic' &&
-                        !ref['final'] && !ref['const']) }}">
+      <template if="{{ ref.isStatic] }}">static</template>
+      <template if="{{ ref.isFinal }}">final</template>
+      <template if="{{ ref.isConst }}">const</template>
+      <template if="{{ (ref.declaredType.name == 'dynamic' &&
+                        !ref.isFinal && !ref.isConst) }}">
         var
       </template>
-      <template if="{{ (ref['declaredType'].name != 'dynamic') }}">
-        <instance-ref ref="{{ ref['declaredType'] }}"></instance-ref>
+      <template if="{{ (ref.declaredType.name != 'dynamic') }}">
+        <instance-ref ref="{{ ref.declaredType }}"></instance-ref>
       </template>
       <a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a>
     </span>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_view.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_view.html
index a7df2a6..e73e292 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_view.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_view.html
@@ -12,12 +12,12 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
-      <template if="{{ field['owner'].type == 'Class' }}">
+      <template if="{{ field.owner.type == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ field.owner }}"></class-nav-menu>
       </template>
-      <template if="{{ field['owner'].type == 'Library' }}">
-        <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
+      <template if="{{ field.owner.type == 'Library' }}">
+        <library-nav-menu library="{{ field.owner }}"></library-nav-menu>
       </template>
       <nav-menu link="{{ field.link }}" anchor="{{ field.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -26,15 +26,15 @@
 
     <div class="content">
       <h1>
-        <template if="{{ field['static'] }}">static</template>
-        <template if="{{ field['final'] }}">final</template>
-        <template if="{{ field['const'] }}">const</template>
-        <template if="{{ (field['declaredType'].name == 'dynamic' &&
-                         !field['final'] && !field['const']) }}">
+        <template if="{{ field.isStatic }}">static</template>
+        <template if="{{ field.isFinal }}">final</template>
+        <template if="{{ field.isConst }}">const</template>
+        <template if="{{ (field.declaredType.name == 'dynamic' &&
+                         !field.isFinal && !field.isConst) }}">
           var
         </template>
-        <template if="{{ (field['declaredType'].name != 'dynamic') }}">
-          {{ field['declaredType'].name }}
+        <template if="{{ (field.declaredType.name != 'dynamic') }}">
+          {{ field.declaredType.name }}
         </template>
         {{ field.name }}
       </h1>
@@ -42,49 +42,49 @@
         <div class="memberItem">
           <div class="memberName">owner</div>
           <div class="memberValue">
-            <template if="{{ field['owner'].type == 'Class' }}">
-              <class-ref ref="{{ field['owner'] }}"></class-ref>
+            <template if="{{ field.owner.type == 'Class' }}">
+              <class-ref ref="{{ field.owner }}"></class-ref>
             </template>
-            <template if="{{ field['owner'].type != 'Class' }}">
-              <library-ref ref="{{ field['owner'] }}"></library-ref>
+            <template if="{{ field.owner.type != 'Class' }}">
+              <library-ref ref="{{ field.owner }}"></library-ref>
             </template>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ field['script'] }}"></script-ref>
+            <script-ref ref="{{ field.script }}"></script-ref>
           </div>
         </div>
-        <template if="{{ !field['static'] }}">
+        <template if="{{ !field.isStatic }}">
           <div class="memberItem"
                title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
             <div class="memberName">observed types</div>
             <div class="memberValue">
-              <template if="{{ field['guardClass'] == 'dynamic' }}">
+              <template if="{{ field.guardClass == 'dynamic' }}">
                 various
               </template>
-              <template if="{{ field['guardClass'] == 'unknown' }}">
+              <template if="{{ field.guardClass == 'unknown' }}">
                 none
               </template>
-              <template if="{{ field['guardClass'] != 'unknown' &&
-                            field['guardClass'] != 'dynamic' }}">
-                <class-ref ref="{{ field['guardClass'] }}"></class-ref>
-                <template if="{{ field['guardNullable'] }}">
+              <template if="{{ field.guardClass != 'unknown' &&
+                            field.guardClass != 'dynamic' }}">
+                <class-ref ref="{{ field.guardClass }}"></class-ref>
+                <template if="{{ field.guardNullable }}">
                   &mdash; null observed
                 </template>
-                <template if="{{ !field['guardNullable'] }}">
+                <template if="{{ !field.guardNullable }}">
                   &mdash; null not observed
                 </template>
               </template>
             </div>
           </div>
         </template>
-        <template if="{{ field['value'] != null }}">
+        <template if="{{ field.value != null }}">
           <div class="memberItem">
             <div class="memberName">static value</div>
             <div class="memberValue">
-              <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+              <any-service-ref ref="{{ field.value }}"></any-service-ref>
             </div>
           </div>
         </template>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_view.html
index 6a97bea..b9dbb9b 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_view.html
@@ -149,7 +149,7 @@
                     <field-ref ref="{{ field['decl'] }}"></field-ref>
                   </div>
                   <div class="memberValue">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </div>
                 </div>
               </template>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/library_view.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/library_view.html
index c8aba4e..750e93e 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/library_view.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/library_view.html
@@ -103,8 +103,8 @@
                   <field-ref ref="{{ field }}"></field-ref>
                 </div>
                 <div class="memberValue">
-                  <template if="{{ field['value'] != null }}">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                  <template if="{{ field.value != null }}">
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </template>
                 </div>
               </div>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/nav_bar.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/nav_bar.html
index a515004..99d776f 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/nav_bar.html
@@ -343,6 +343,13 @@
         <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
       </div>
     </template>
+    <template if="{{ event.eventType == 'VMDisconnected' }}">
+      <div class="item">
+        Disconnected from VM
+        <br><br>
+        <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
+      </div>
+    </template>
   </template>
 </polymer-element>
 
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/object_common.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/object_common.html
index 63c78a1..ea2fb87 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/object_common.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/object_common.html
@@ -21,10 +21,19 @@
         </div>
       </div>
 
-      <div class="memberItem" title="Space for this object in memory">
-        <div class="memberName">size</div>
-        <div class="memberValue">{{ object.size | formatSize }}</div>
-      </div>
+      <template if="{{ object.size != null }}">
+        <div class="memberItem" title="Space for this object in memory">
+          <div class="memberName">size</div>
+          <div class="memberValue">{{ object.size | formatSize }}</div>
+        </div>
+      </template>
+
+      <template if="{{ object.size == null }}">
+        <div class="memberItem" title="Space for this object in memory">
+          <div class="memberName">size</div>
+          <div class="memberValue">0</div>
+        </div>
+      </template>
 
       <div class="memberItem" title="Space that would be reclaimed if references to this object were replaced with null">
         <div class="memberName">retained size</div>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/object_view.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/object_view.html
new file mode 100644
index 0000000..bec4a53
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/object_view.html
@@ -0,0 +1,32 @@
+<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="field_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="inbound_reference.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="object_common.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="eval_link.html">
+
+<polymer-element name="object-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ object.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="object" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
+    </nav-bar>
+
+    <div class="content">
+      <object-common object="{{ object }}"></object-common>
+    </div>
+
+    <hr>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="object_view.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/service_ref.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/service_ref.html
index 3b4b930..097e90c 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/service_ref.html
@@ -7,4 +7,15 @@
 <polymer-element name="any-service-ref" extends="observatory-element">
 </polymer-element>
 
+<polymer-element name="object-ref" extends="service-ref">
+  <template><link rel="stylesheet" href="css/shared.css">
+    <template if="{{ nameIsEmpty }}">
+      <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.vmType }}</em></a>
+    </template>
+    <template if="{{ !nameIsEmpty }}">
+      <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ name }}</em></a>
+    </template>
+  </template>
+</polymer-element>
+
 <script type="application/dart" src="service_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/build.log b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/build.log
index 703f18d..01302a8 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/build.log
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/build.log
@@ -1,34 +1,35 @@
 BUILD LOG
 ---------
-Build Time: 2014-08-12T15:26:59
+Build Time: 2014-09-10T09:11:24
 
 NODEJS INFORMATION
 ==================
 nodejs: v0.10.29
-chai: 1.9.1
 grunt: 0.4.5
-grunt-audit: 0.0.3
+chai: 1.9.1
 grunt-concat-sourcemap: 0.4.3
-grunt-contrib-concat: 0.5.0
-grunt-contrib-uglify: 0.4.1
-grunt-contrib-yuidoc: 0.5.2
+grunt-audit: 0.0.3
+grunt-contrib-concat: 0.4.0
+grunt-contrib-uglify: 0.5.1
 grunt-karma: 0.8.3
 grunt-string-replace: 0.2.7
-karma: 0.12.21
+karma: 0.12.23
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
 karma-ie-launcher: 0.1.5
-karma-mocha: 0.1.7
+karma-mocha: 0.1.9
 karma-safari-launcher: 0.1.1
 karma-script-launcher: 0.1.0
 mocha: 1.21.4
 
 REPO REVISIONS
 ==============
-polymer-expressions: 92f860ef9ff871e4b51fc5da38b2b76ba13ebdbe
-polymer-gestures: a21142376f0c8a9541a2919d3f77ca557d13afe9
-polymer-dev: 5d00e4b0252e443e2ed6d5c4a04a568e72ef3b25
+polymer-expressions: 30afaf9fffe647bbe53e67f4ac12596acaca77ca
+polymer-gestures: 3534e23ccc0f50ee24e47fd915579a5ebc770a76
+polymer-dev: d66a86eac545ff8115f781ec6b1466024f49c0c0
+HTMLImports: d0c8d08f23ed407288bcac385e19747a3fbeba96
+TemplateBinding: 41e95ea0e4b45543a29ea5240cd4f0defc7208c1
 
 BUILD HASHES
 ============
-build/polymer.js: 23408455239101d17426ef7448361730103cb2cf
\ No newline at end of file
+build/polymer.js: 5eb34c0f8e6abe9984a5a2811c022fca4d1098b6
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/layout.html b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/layout.html
index 46dec0a..55d4d2f 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/layout.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/layout.html
@@ -1,278 +1,286 @@
-<!--
-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
--->
-<style shim-shadowdom>
-/*******************************
-          Flex Layout
-*******************************/
-
-html /deep/ [layout][horizontal], html /deep/ [layout][vertical] {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-
-html /deep/ [layout][horizontal][inline], html /deep/ [layout][vertical][inline] {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-}
-
-html /deep/ [layout][horizontal] {
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-}
-
-html /deep/ [layout][horizontal][reverse] {
-  -ms-flex-direction: row-reverse;
-  -webkit-flex-direction: row-reverse;
-  flex-direction: row-reverse;
-}
-
-html /deep/ [layout][vertical] {
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-}
-
-html /deep/ [layout][vertical][reverse] {
-  -ms-flex-direction: column-reverse;
-  -webkit-flex-direction: column-reverse;
-  flex-direction: column-reverse;
-}
-
-html /deep/ [layout][wrap] {
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-}
-
-html /deep/ [layout][wrap-reverse] {
-  -ms-flex-wrap: wrap-reverse;
-  -webkit-flex-wrap: wrap-reverse;
-  flex-wrap: wrap-reverse;
-}
-
-html /deep/ [flex] {
-  -ms-flex: 1;
-  -webkit-flex: 1;
-  flex: 1;
-}
-
-html /deep/ [flex][auto] {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-}
-
-html /deep/ [flex][none] {
-  -ms-flex: none;
-  -webkit-flex: none;
-  flex: none;
-}
-
-html /deep/ [flex][one] {
-  -ms-flex: 1;
-  -webkit-flex: 1;
-  flex: 1;
-}
-
-html /deep/ [flex][two] {
-  -ms-flex: 2;
-  -webkit-flex: 2;
-  flex: 2;
-}
-
-html /deep/ [flex][three] {
-  -ms-flex: 3;
-  -webkit-flex: 3;
-  flex: 3;
-}
-
-html /deep/ [flex][four] {
-  -ms-flex: 4;
-  -webkit-flex: 4;
-  flex: 4;
-}
-
-html /deep/ [flex][five] {
-  -ms-flex: 5;
-  -webkit-flex: 5;
-  flex: 5;
-}
-
-html /deep/ [flex][six] {
-  -ms-flex: 6;
-  -webkit-flex: 6;
-  flex: 6;
-}
-
-html /deep/ [flex][seven] {
-  -ms-flex: 7;
-  -webkit-flex: 7;
-  flex: 7;
-}
-
-html /deep/ [flex][eight] {
-  -ms-flex: 8;
-  -webkit-flex: 8;
-  flex: 8;
-}
-
-html /deep/ [flex][nine] {
-  -ms-flex: 9;
-  -webkit-flex: 9;
-  flex: 9;
-}
-
-html /deep/ [flex][ten] {
-  -ms-flex: 10;
-  -webkit-flex: 10;
-  flex: 10;
-}
-
-html /deep/ [flex][eleven] {
-  -ms-flex: 11;
-  -webkit-flex: 11;
-  flex: 11;
-}
-
-html /deep/ [flex][twelve] {
-  -ms-flex: 12;
-  -webkit-flex: 12;
-  flex: 12;
-}
-
-/* alignment in cross axis */
-
-html /deep/ [layout][start] {
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-
-html /deep/ [layout][center], html /deep/ [layout][center-center] {
-  -ms-flex-align: center;
-  -webkit-align-items: center;
-  align-items: center;
-}
-
-html /deep/ [layout][end] {
-  -ms-flex-align: end;
-  -webkit-align-items: flex-end;
-  align-items: flex-end;
-}
-
-/* alignment in main axis */
-
-html /deep/ [layout][start-justified] {
-  -ms-flex-pack: start;
-  -webkit-justify-content: flex-start;
-  justify-content: flex-start;
-}
-
-html /deep/ [layout][center-justified], html /deep/ [layout][center-center] {
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-}
-
-html /deep/ [layout][end-justified] {
-  -ms-flex-pack: end;
-  -webkit-justify-content: flex-end;
-  justify-content: flex-end;
-}
-
-html /deep/ [layout][around-justified] {
-  -ms-flex-pack: around;
-  -webkit-justify-content: space-around;
-  justify-content: space-around;
-}
-
-html /deep/ [layout][justified] {
-  -ms-flex-pack: justify;
-  -webkit-justify-content: space-between;
-  justify-content: space-between;
-}
-
-/* self alignment */
-
-html /deep/ [self-start] {
-  -ms-align-self: flex-start;
-  -webkit-align-self: flex-start;
-  align-self: flex-start;
-}
-
-html /deep/ [self-center] {
-  -ms-align-self: center;
-  -webkit-align-self: center;
-  align-self: center;
-}
-
-html /deep/ [self-end] {
-  -ms-align-self: flex-end;
-  -webkit-align-self: flex-end;
-  align-self: flex-end;
-}
-
-html /deep/ [self-stretch] {
-  -ms-align-self: stretch;
-  -webkit-align-self: stretch;
-  align-self: stretch;
-}
-
-/*******************************
-          Other Layout
-*******************************/
-
-html /deep/ [block] {
-  display: block;
-}
-
-/* ie support for hidden */
-html /deep/ [hidden] {
-  display: none !important;
-}
-
-html /deep/ [relative] {
-  position: relative;
-}
-
-html /deep/ [fit] {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-body[fullbleed] {
-  margin: 0;
-  height: 100vh;
-}
-
-/*******************************
-            Other
-*******************************/
-
-html /deep/ [segment], html /deep/ segment {
-  display: block;
-  position: relative;
-  -webkit-box-sizing: border-box;
-  -ms-box-sizing: border-box;
-  box-sizing: border-box;
-  margin: 1em 0.5em;
-  padding: 1em;
-  background-color: white;
-  -webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
-  box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
-  border-radius: 5px 5px 5px 5px;
-}
-
+<!--

+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

+-->

+<style shim-shadowdom>

+/*******************************

+          Flex Layout

+*******************************/

+

+html /deep/ [layout][horizontal], html /deep/ [layout][vertical] {

+  display: -ms-flexbox;

+  display: -webkit-flex;

+  display: flex;

+}

+

+html /deep/ [layout][horizontal][inline], html /deep/ [layout][vertical][inline] {

+  display: -ms-inline-flexbox;

+  display: -webkit-inline-flex;

+  display: inline-flex;

+}

+

+html /deep/ [layout][horizontal] {

+  -ms-flex-direction: row;

+  -webkit-flex-direction: row;

+  flex-direction: row;

+}

+

+html /deep/ [layout][horizontal][reverse] {

+  -ms-flex-direction: row-reverse;

+  -webkit-flex-direction: row-reverse;

+  flex-direction: row-reverse;

+}

+

+html /deep/ [layout][vertical] {

+  -ms-flex-direction: column;

+  -webkit-flex-direction: column;

+  flex-direction: column;

+}

+

+html /deep/ [layout][vertical][reverse] {

+  -ms-flex-direction: column-reverse;

+  -webkit-flex-direction: column-reverse;

+  flex-direction: column-reverse;

+}

+

+html /deep/ [layout][wrap] {

+  -ms-flex-wrap: wrap;

+  -webkit-flex-wrap: wrap;

+  flex-wrap: wrap;

+}

+

+html /deep/ [layout][wrap-reverse] {

+  -ms-flex-wrap: wrap-reverse;

+  -webkit-flex-wrap: wrap-reverse;

+  flex-wrap: wrap-reverse;

+}

+

+html /deep/ [flex] {

+  -ms-flex: 1 1 0.000000001px;

+  -webkit-flex: 1;

+  flex: 1;

+  -webkit-flex-basis: 0.000000001px;

+  flex-basis: 0.000000001px;

+}

+

+html /deep/ [vertical][layout] > [flex][auto-vertical], html /deep/ [vertical][layout]::shadow [flex][auto-vertical] {

+  -ms-flex: 1 1 auto;

+  -webkit-flex-basis: auto;

+  flex-basis: auto;

+}

+

+html /deep/ [flex][auto] {

+  -ms-flex: 1 1 auto;

+  -webkit-flex-basis: auto;

+  flex-basis: auto;

+}

+

+html /deep/ [flex][none] {

+  -ms-flex: none;

+  -webkit-flex: none;

+  flex: none;

+}

+

+html /deep/ [flex][one] {

+  -ms-flex: 1;

+  -webkit-flex: 1;

+  flex: 1;

+}

+

+html /deep/ [flex][two] {

+  -ms-flex: 2;

+  -webkit-flex: 2;

+  flex: 2;

+}

+

+html /deep/ [flex][three] {

+  -ms-flex: 3;

+  -webkit-flex: 3;

+  flex: 3;

+}

+

+html /deep/ [flex][four] {

+  -ms-flex: 4;

+  -webkit-flex: 4;

+  flex: 4;

+}

+

+html /deep/ [flex][five] {

+  -ms-flex: 5;

+  -webkit-flex: 5;

+  flex: 5;

+}

+

+html /deep/ [flex][six] {

+  -ms-flex: 6;

+  -webkit-flex: 6;

+  flex: 6;

+}

+

+html /deep/ [flex][seven] {

+  -ms-flex: 7;

+  -webkit-flex: 7;

+  flex: 7;

+}

+

+html /deep/ [flex][eight] {

+  -ms-flex: 8;

+  -webkit-flex: 8;

+  flex: 8;

+}

+

+html /deep/ [flex][nine] {

+  -ms-flex: 9;

+  -webkit-flex: 9;

+  flex: 9;

+}

+

+html /deep/ [flex][ten] {

+  -ms-flex: 10;

+  -webkit-flex: 10;

+  flex: 10;

+}

+

+html /deep/ [flex][eleven] {

+  -ms-flex: 11;

+  -webkit-flex: 11;

+  flex: 11;

+}

+

+html /deep/ [flex][twelve] {

+  -ms-flex: 12;

+  -webkit-flex: 12;

+  flex: 12;

+}

+

+/* alignment in cross axis */

+

+html /deep/ [layout][start] {

+  -ms-flex-align: start;

+  -webkit-align-items: flex-start;

+  align-items: flex-start;

+}

+

+html /deep/ [layout][center], html /deep/ [layout][center-center] {

+  -ms-flex-align: center;

+  -webkit-align-items: center;

+  align-items: center;

+}

+

+html /deep/ [layout][end] {

+  -ms-flex-align: end;

+  -webkit-align-items: flex-end;

+  align-items: flex-end;

+}

+

+/* alignment in main axis */

+

+html /deep/ [layout][start-justified] {

+  -ms-flex-pack: start;

+  -webkit-justify-content: flex-start;

+  justify-content: flex-start;

+}

+

+html /deep/ [layout][center-justified], html /deep/ [layout][center-center] {

+  -ms-flex-pack: center;

+  -webkit-justify-content: center;

+  justify-content: center;

+}

+

+html /deep/ [layout][end-justified] {

+  -ms-flex-pack: end;

+  -webkit-justify-content: flex-end;

+  justify-content: flex-end;

+}

+

+html /deep/ [layout][around-justified] {

+  -ms-flex-pack: distribute;

+  -webkit-justify-content: space-around;

+  justify-content: space-around;

+}

+

+html /deep/ [layout][justified] {

+  -ms-flex-pack: justify;

+  -webkit-justify-content: space-between;

+  justify-content: space-between;

+}

+

+/* self alignment */

+

+html /deep/ [self-start] {

+  -ms-align-self: flex-start;

+  -webkit-align-self: flex-start;

+  align-self: flex-start;

+}

+

+html /deep/ [self-center] {

+  -ms-align-self: center;

+  -webkit-align-self: center;

+  align-self: center;

+}

+

+html /deep/ [self-end] {

+  -ms-align-self: flex-end;

+  -webkit-align-self: flex-end;

+  align-self: flex-end;

+}

+

+html /deep/ [self-stretch] {

+  -ms-align-self: stretch;

+  -webkit-align-self: stretch;

+  align-self: stretch;

+}

+

+/*******************************

+          Other Layout

+*******************************/

+

+html /deep/ [block] {

+  display: block;

+}

+

+/* ie support for hidden */

+html /deep/ [hidden] {

+  display: none !important;

+}

+

+html /deep/ [relative] {

+  position: relative;

+}

+

+html /deep/ [fit] {

+  position: absolute;

+  top: 0;

+  right: 0;

+  bottom: 0;

+  left: 0;

+}

+

+body[fullbleed] {

+  margin: 0;

+  height: 100vh;

+}

+

+/*******************************

+            Other

+*******************************/

+

+html /deep/ [segment], html /deep/ segment {

+  display: block;

+  position: relative;

+  -webkit-box-sizing: border-box;

+  -ms-box-sizing: border-box;

+  box-sizing: border-box;

+  margin: 1em 0.5em;

+  padding: 1em;

+  background-color: white;

+  -webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);

+  box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);

+  border-radius: 5px 5px 5px 5px;

+}

+

 </style>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.js b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.js
index ce50ae2..93b9670 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.js
@@ -7,8 +7,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.5-5d00e4b
-window.PolymerGestures={},function(a){var b=!1,c=document.createElement("meta");if(c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findTouchAction:function(a){var c;if(b&&a.path){for(var d=a.path,e=0;e<d.length;e++)if(c=d[e],c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action")}else for(c=a.target;c;){if(c.hasAttribute("touch-action"))return c.getAttribute("touch-action");c=c.parentNode||c.host}return"auto"},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"html /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f="string"==typeof document.head.style.touchAction,g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b=["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={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],dependencyMap:{down:{listeners:0,index:-1},up:{listeners:0,index:-1}},gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){var c=Object.create(null);c.listeners=0,c.index=this.gestures.length;for(var d,e=0;e<b.exposes.length;e++)d=b.exposes[e].toLowerCase(),this.dependencyMap[d]=c;this.gestures.push(b)},register:function(a,b){for(var c,d=this.eventSourceList.length,e=0;d>e&&(c=this.eventSourceList[e]);e++)c.register.call(c,a,b)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.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){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){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),g=0;g<b.length;g++)e=b[g],f[e]=a[e]||c[g],("target"===e||"relatedTarget"===e)&&d&&f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement);return f.preventDefault=function(){a.preventDefault()},f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b=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],c.enabled&&d&&d.call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};f.boundHandler=f.eventHandler.bind(f),f.boundGestureTrigger=f.gestureTrigger.bind(f),a.dispatcher=f,a.activateGesture=function(a,b){var c=b.toLowerCase(),d=f.dependencyMap[c];if(d){var e=f.gestures[d.index];if(0===d.listeners&&e&&(e.enabled=!0),d.listeners++,a._pgListeners||(f.register(a),a._pgListeners=0),e){var g,h=e.defaultActions&&e.defaultActions[c];switch(a.nodeType){case Node.ELEMENT_NODE:g=a;break;case Node.DOCUMENT_FRAGMENT_NODE:g=a.host;break;default:g=null}h&&g&&!g.hasAttribute("touch-action")&&g.setAttribute("touch-action",h)}a._pgListeners++}return Boolean(d)},a.addEventListener=function(b,c,d,e){d&&(a.activateGesture(b,c),b.addEventListener(c,d,e))},a.deactivateGesture=function(a,b){var c=b.toLowerCase(),d=f.dependencyMap[c];if(d){if(d.listeners>0&&d.listeners--,0===d.listeners){var e=f.gestures[d.index];e&&(e.enabled=!1)}a._pgListeners>0&&a._pgListeners--,0===a._pgListeners&&f.unregister(a)}return Boolean(d)},a.removeEventListener=function(b,c,d,e){d&&(a.deactivateGesture(b,c),b.removeEventListener(c,d,e))}}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],exposes:["down","up","move"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.findTarget(d),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d){var e=this.prepareEvent(a);e.target=d,0===e.buttons?(b.cancel(e),this.cleanupMouse()):b.move(e)}}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=(a.targetFinding.allShadows.bind(a.targetFinding),b.pointermap),d=(Array.prototype.map.call.bind(Array.prototype.map),2500),e=200,f=20,g=!1,h={events:["touchstart","touchmove","touchend","touchcancel"],exposes:["down","up","move"],register:function(a,c){c||b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y"},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return b===c.EMITTER?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":"XY"},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===c.pointers()||1===c.pointers()&&c.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,e)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,d){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var e={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:this.currentTouchEvent.target};return a.findTarget(e)}return a.findTarget(b)}return c.get(d)},touchToPointer:function(a){var c=this.currentTouchEvent,d=b.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(c.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE,d._source="touch";var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,c.preventDefault()},d},processTouches:function(a,b){var d=a.changedTouches;this.currentTouchEvent=a;for(var e,f,g=0;g<d.length;g++)e=d[g],f=this.touchToPointer(e),"touchstart"===a.type&&c.set(f.pointerId,f.target),c.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findTouchAction(b),e=this.touchActionToScrollType(d);if("none"===e)c=!1;else if("XY"===e)c=!0;else{var f=b.changedTouches[0],g=e,h="Y"===e?"X":"Y",i=Math.abs(f["client"+g]-this.firstXY[g]),j=Math.abs(f["client"+h]-this.firstXY[h]);c=i>=j}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(c.pointers()>=b.length){var d=[];c.forEach(function(a,c){if(1!==c&&!this.findTouch(b,c-2)){var e=a;d.push(e)}},this),d.forEach(function(a){this.cancel(a),c.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){b.down(a)},touchmove:function(a){if(g)a.cancelable&&this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=f&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){b.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(c){c.relatedTarget=a.findTarget(c),b.up(c)},cancel:function(a){b.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){c["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,e=b.changedTouches[0];if(this.isPrimaryTouch(e)){var f={x:e.clientX,y:e.clientY};c.push(f);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,f);setTimeout(g,d)}}};a.touchEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){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.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.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){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.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.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher,c=window.navigator;if(window.PointerEvent)b.registerSource("pointer",a.pointerEvents);else if(c.msPointerEnabled)b.registerSource("ms",a.msEvents);else if(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart){b.registerSource("touch",a.touchEvents);var d=c.userAgent.match("Safari")&&!c.userAgent.match("Chrome");d&&document.body.addEventListener("touchstart",function(){})}b.register(document,!0)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],exposes:["trackstart","track","trackx","tracky","trackend"],defaultActions:{track:"none",trackx:"pan-y",tracky:"pan-x"},WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);if(g.x)e.xDirection=this.clampDir(g.x);else if("trackx"===a)return;if(g.y)e.yDirection=this.clampDir(g.y);else if("tracky"===a)return;var h={bubbles:!0,cancelable:!0,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"};"tracky"!==a&&(h.x=b.x,h.dx=f.x,h.ddx=g.x,h.clientX=b.clientX,h.pageX=b.pageX,h.screenX=b.screenX,h.xDirection=e.xDirection),"trackx"!==a&&(h.dy=f.y,h.ddy=g.y,h.y=b.y,h.clientY=b.clientY,h.pageY=b.pageY,h.screenY=b.screenY,h.yDirection=e.yDirection);var i=c.makeGestureEvent(a,h);e.downTarget.dispatchEvent(i)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(!b.tracking){var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,b.lastMoveEvent=b.downEvent,this.fireTrack("trackstart",a,b))}b.tracking&&(this.fireTrack("track",a,b),this.fireTrack("trackx",a,b),this.fireTrack("tracky",a,b)),b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],exposes:["hold","holdpulse","release"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],exposes:["tap"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;
-if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);switch(b=i(b),c=i(c),a){case"||":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)||c(a,d,e)};case"&&":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)&&c(a,d,e)}}return function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),this.dynamicDeps=!0,function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.3.5-5d00e4b"},"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){return a}function c(a,b){var c=typeof b;return b instanceof Date&&(c="date"),d[c](a,b)}var d={string:b,undefined:b,date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=c}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=null===b||void 0===b?{}:b,g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];PolymerGestures.addEventListener(this,c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d,a.addEventListener=PolymerGestures.addEventListener,a.removeEventListener=PolymerGestures.removeEventListener}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,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||this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},window.ShadowDOMPolyfill),e="element",f="controller",g={STYLE_SCOPE_ATTRIBUTE:e,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(f),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,e){if(b=b||this.findStyleScope(),e=e||"",b){d&&(a=c(a,b.host));var g=this.element.cssTextToScopeStyle(a,f);Polymer.applyStyleToScope(g,b),this.styleCacheForScope(b)[this.localName+e]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);return c[b]},styleCacheForScope:function(a){if(d){var b=a.host?a.host.localName:a.localName;return h[b]||(h[b]={})}return a._scopeStyles=a._scopeStyles||{}}},h={};a.api.instance.styles=g}(Polymer),function(a){function b(a,b){if(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),i&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",j=document.head.querySelectorAll(g);j.length&&(f=j[j.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return q?q.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i=window.ShadowDOMPolyfill,j="style",k="@import",l="link[rel=stylesheet]",m="global",n="polymer-scope",o={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(l),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(j),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(k)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(l),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(j+"["+n+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(n)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(m);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+n+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},p=HTMLElement.prototype,q=p.matches||p.matchesSelector||p.webkitMatchesSelector||p.mozMatchesSelector;a.api.declaration.styles=o,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return PolymerGestures.addEventListener(d,c,h),f?void 0:{open:g,discardChanges:g,close:function(){PolymerGestures.removeEventListener(d,c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c];d&&void 0!==d.reflect&&(b.reflect[c]=Boolean(d.reflect),d=d.value),void 0!==d&&(b[c]=d)}},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a){var d=this.getAttribute(b);if(d)for(var e,f=a.publish||(a.publish={}),g=d.split(c),h=0,i=g.length;i>h;h++)e=g[h].trim(),e&&void 0===f[e]&&(f[e]=void 0)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&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=window.ShadowDOMPolyfill,g={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),f&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),h[a]=b}return b},findBasePrototype:function(a){return h[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},h={};g.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=g}(Polymer),function(a){function b(a){return document.contains(a)?i:h}function c(){return h.length?h[0]:i[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a){a.__queue||(a.__queue={},f.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?h.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=f.length;c>b&&(a=f[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){g.push(a)},flush:function(){if(!this.flushing){this.flushing=!0;for(var a;g.length;)a=g.shift(),a.__queue.go.call(a),a.__queue=null;this.flushing=!1}},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&j.push(a)},flushReadyCallbacks:function(){if(j)for(var a;j.length;)(a=j.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[],j=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.elements=f,a.queue=e,a.whenReady=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"),f.wait(this),this.loadResources(),this.registerWhenReady()
-},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
-//# sourceMappingURL=polymer.js.map
\ No newline at end of file
+// @version: 0.4.0-d66a86e
+window.PolymerGestures={},function(a){var b=!1,c=document.createElement("meta");if(c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findTouchAction:function(a){var c;if(b&&a.path){for(var d=a.path,e=0;e<d.length;e++)if(c=d[e],c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action")}else for(c=a.target;c;){if(c.hasAttribute("touch-action"))return c.getAttribute("touch-action");c=c.parentNode||c.host}return"auto"},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"html /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f="string"==typeof document.head.style.touchAction,g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b,c=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented","_source"],d=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],e="undefined"!=typeof SVGElementInstance,f=a.eventFactory,g={pointermap:new a.PointerMap,requiredGestures:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],dependencyMap:{down:{listeners:0,index:-1},up:{listeners:0,index:-1}},gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){var c=Object.create(null);c.listeners=0,c.index=this.gestures.length;for(var d,e=0;e<b.exposes.length;e++)d=b.exposes[e].toLowerCase(),this.dependencyMap[d]=c;this.gestures.push(b)},register:function(a,b){for(var c,d=this.eventSourceList.length,e=0;d>e&&(c=this.eventSourceList[e]);e++)c.register.call(c,a,b)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.requiredGestures.set(a.pointerId,b),this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a),this.requiredGestures.delete(a.pointerId)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a),this.requiredGestures.delete(a.pointerId)},eventHandler:function(a){var c=a.type;if("touchstart"===c||"mousedown"===c||"pointerdown"===c||"MSPointerDown"===c){a._handledByPG||(b={});var d=a.currentTarget._pgEvents;if(d)for(var e,f,g,h=Object.keys(d),i=0;i<h.length;i++)g=h[i],d[g]>0&&(e=this.dependencyMap[g],f=e?e.index:-1,b[f]=!0)}if(!a._handledByPG){var j=this.eventMap&&this.eventMap[c];j&&j(a),a._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=f.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,f=Object.create(null),g=0;g<c.length;g++)b=c[g],f[b]=a[b]||d[g],("target"===b||"relatedTarget"===b)&&e&&f[b]instanceof SVGElementInstance&&(f[b]=f[b].correspondingUseElement);return f.preventDefault=function(){a.preventDefault()},f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b,c=0;c<this.gestureQueue.length;c++){a=this.gestureQueue[c],b=a._requiredGestures;for(var d,e,f=0;f<this.gestures.length;f++)b[f]&&(d=this.gestures[f],e=d[a.type],e&&e.call(d,a))}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),a._requiredGestures=this.requiredGestures.get(a.pointerId),this.gestureQueue.push(a)}};g.boundHandler=g.eventHandler.bind(g),g.boundGestureTrigger=g.gestureTrigger.bind(g),a.dispatcher=g,a.activateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];if(d){var e=g.gestures[d.index];if(a._pgListeners||(g.register(a),a._pgListeners=0),e){var f,h=e.defaultActions&&e.defaultActions[c];switch(a.nodeType){case Node.ELEMENT_NODE:f=a;break;case Node.DOCUMENT_FRAGMENT_NODE:f=a.host;break;default:f=null}h&&f&&!f.hasAttribute("touch-action")&&f.setAttribute("touch-action",h)}a._pgEvents||(a._pgEvents={}),a._pgEvents[c]=(a._pgEvents[c]||0)+1,a._pgListeners++}return Boolean(d)},a.addEventListener=function(b,c,d,e){d&&(a.activateGesture(b,c),b.addEventListener(c,d,e))},a.deactivateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];return d&&(a._pgListeners>0&&a._pgListeners--,0===a._pgListeners&&g.unregister(a),a._pgEvents&&(a._pgEvents[c]>0?a._pgEvents[c]--:a._pgEvents[c]=0)),Boolean(d)},a.removeEventListener=function(b,c,d,e){d&&(a.deactivateGesture(b,c),b.removeEventListener(c,d,e))}}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],exposes:["down","up","move"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.findTarget(d),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d){var e=this.prepareEvent(a);e.target=d,0===e.buttons?(b.cancel(e),this.cleanupMouse()):b.move(e)}}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=(a.targetFinding.allShadows.bind(a.targetFinding),b.pointermap),d=(Array.prototype.map.call.bind(Array.prototype.map),2500),e=200,f=20,g=!1,h={events:["touchstart","touchmove","touchend","touchcancel"],exposes:["down","up","move"],register:function(a,c){c||b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y"},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return b===c.EMITTER?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":"XY"},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===c.pointers()||1===c.pointers()&&c.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,e)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,d){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var e={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:this.currentTouchEvent.target};return a.findTarget(e)}return a.findTarget(b)}return c.get(d)},touchToPointer:function(a){var c=this.currentTouchEvent,d=b.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(c.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE,d._source="touch";var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,c.preventDefault()},d},processTouches:function(a,b){var d=a.changedTouches;this.currentTouchEvent=a;for(var e,f,g=0;g<d.length;g++)e=d[g],f=this.touchToPointer(e),"touchstart"===a.type&&c.set(f.pointerId,f.target),c.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findTouchAction(b),e=this.touchActionToScrollType(d);if("none"===e)c=!1;else if("XY"===e)c=!0;else{var f=b.changedTouches[0],g=e,h="Y"===e?"X":"Y",i=Math.abs(f["client"+g]-this.firstXY[g]),j=Math.abs(f["client"+h]-this.firstXY[h]);c=i>=j}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(c.pointers()>=b.length){var d=[];c.forEach(function(a,c){if(1!==c&&!this.findTouch(b,c-2)){var e=a;d.push(e)}},this),d.forEach(function(a){this.cancel(a),c.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){b.down(a)},touchmove:function(a){if(g)a.cancelable&&this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=f&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){b.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(c){c.relatedTarget=a.findTarget(c),b.up(c)},cancel:function(a){b.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){c["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,e=b.changedTouches[0];if(this.isPrimaryTouch(e)){var f={x:e.clientX,y:e.clientY};c.push(f);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,f);setTimeout(g,d)}}};a.touchEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher,c=window.navigator;if(window.PointerEvent)b.registerSource("pointer",a.pointerEvents);else if(c.msPointerEnabled)b.registerSource("ms",a.msEvents);else if(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart){b.registerSource("touch",a.touchEvents);var d=c.userAgent.match("Safari")&&!c.userAgent.match("Chrome");d&&document.body.addEventListener("touchstart",function(){})}b.register(document,!0)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],exposes:["trackstart","track","trackx","tracky","trackend"],defaultActions:{track:"none",trackx:"pan-y",tracky:"pan-x"},WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);if(g.x)e.xDirection=this.clampDir(g.x);else if("trackx"===a)return;if(g.y)e.yDirection=this.clampDir(g.y);else if("tracky"===a)return;var h={bubbles:!0,cancelable:!0,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"};"tracky"!==a&&(h.x=b.x,h.dx=f.x,h.ddx=g.x,h.clientX=b.clientX,h.pageX=b.pageX,h.screenX=b.screenX,h.xDirection=e.xDirection),"trackx"!==a&&(h.dy=f.y,h.ddy=g.y,h.y=b.y,h.clientY=b.clientY,h.pageY=b.pageY,h.screenY=b.screenY,h.yDirection=e.yDirection);var i=c.makeGestureEvent(a,h);e.downTarget.dispatchEvent(i)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(!b.tracking){var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,b.lastMoveEvent=b.downEvent,this.fireTrack("trackstart",a,b))}b.tracking&&(this.fireTrack("track",a,b),this.fireTrack("trackx",a,b),this.fireTrack("tracky",a,b)),b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],exposes:["hold","holdpulse","release"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],exposes:["tap"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);
+return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);switch(b=i(b),c=i(c),a){case"||":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)||c(a,d,e)};case"&&":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)&&c(a,d,e)}}return function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),this.dynamicDeps=!0,function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.4.0-d66a86e"},"function"==typeof window.Polymer&&(Polymer={}),window.Platform||(logFlags=window.logFlags||{},Platform={flush:function(){}},CustomElements={useNative:!0,ready:!0,takeRecords:function(){},"instanceof":function(a,b){return a instanceof b}},HTMLImports={useNative:!0},addEventListener("HTMLImportsLoaded",function(){document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))}),ShadowDOMPolyfill=null,wrap=unwrap=function(a){return a}),function(a){function b(a,b){b=b||o,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a){a.target.__loaded=!0}function f(a,b){function c(){h==i&&a&&a()}function d(a){e(a),h++,c()}var f=b.querySelectorAll("link[rel=import]"),h=0,i=f.length;if(i)for(var j,k=0;i>k&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return l?a.__loaded:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a.import;b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=g,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var testingExposeCycleCount=global.testingExposeCycleCount,hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);
+var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue()))},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_,e=!0;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),e=c.ifValue,c.ifOneTime&&!e)return void this.valueChanged();c.ifOneTime||(e=e.open(this.updateIfValue,this))}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b));var f=c.value;return c.oneTime||(f=f.open(this.updateIteratedValue,this)),e?void this.updateValue(f):void this.valueChanged()},getUpdatedValue:function(){var a=this.deps.value;return this.deps.oneTime||(a=a.discardChanges()),a},updateIfValue:function(a){return a?void this.updateValue(this.getUpdatedValue()):void this.valueChanged()},updateIteratedValue:function(a){if(this.deps.hasIf){var b=this.deps.ifValue;if(this.deps.ifOneTime||(b=b.discardChanges()),!b)return void this.valueChanged()}this.updateValue(a)},updateValue:function(a){this.deps.repeat||(a=[a]);var b=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(a);this.valueChanged(a,b)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Polymer),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=Platform.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(Polymer),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(Polymer),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}function c(a){for(var b=a||{},c=1;c<arguments.length;c++){var e=arguments[c];try{for(var f in e)d(f,e,b)}catch(g){}}return b}function d(a,b,c){var d=e(b,a);Object.defineProperty(c,a,d)}function e(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||e(Object.getPrototypeOf(a),b)}}a.extend=b,a.mixin=c,Platform.mixin=c}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(a){function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c={};HTMLElement.register=function(a,b){c[a]=b},HTMLElement.getPrototypeForTag=function(a){var b=a?c[a]:HTMLElement.prototype;return b||Object.getPrototypeOf(document.createElement(a))};var d=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,d.apply(this,arguments)};var e=DOMTokenList.prototype.add,f=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)e.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)f.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var g=function(){return Array.prototype.slice.call(this)},h=window.NamedNodeMap||window.MozNamedAttrMap||{};NodeList.prototype.array=g,h.prototype.array=g,HTMLCollection.prototype.array=g,a.createDOM=b}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a){return a}function c(a,b){var c=typeof b;return b instanceof Date&&(c="date"),d[c](a,b)}var d={string:b,undefined:b,date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=c}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=null===b||void 0===b?{}:b,g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];PolymerGestures.addEventListener(this,c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d,a.addEventListener=PolymerGestures.addEventListener,a.removeEventListener=PolymerGestures.removeEventListener}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a){this.invokeMethod(e,[a])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){var e=a+"_",f=a+"Observable_";this[f]=c;var g=this[e],h=this,i=c.open(function(b,c){h[e]=b,h.emitPropertyChangeRecord(a,b,c)});if(d&&!b(g,i)){var j=d(g,i);b(i,j)||(i=j,c.setValue&&c.setValue(i))}this[e]=i,this.emitPropertyChangeRecord(a,i,g);var k={close:function(){c.close(),h[f]=void 0}};return this.registerObserver(k),k},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){return d?void(this[a]=b):this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){HTMLTemplateElement.decorate(a);for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),this.ownerDocument.isStagingDocument||this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()
+},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},window.ShadowDOMPolyfill),e="element",f="controller",g={STYLE_SCOPE_ATTRIBUTE:e,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(f),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,e){if(b=b||this.findStyleScope(),e=e||"",b){d&&(a=c(a,b.host));var g=this.element.cssTextToScopeStyle(a,f);Polymer.applyStyleToScope(g,b),this.styleCacheForScope(b)[this.localName+e]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);return c[b]},styleCacheForScope:function(a){if(d){var b=a.host?a.host.localName:a.localName;return h[b]||(h[b]={})}return a._scopeStyles=a._scopeStyles||{}}},h={};a.api.instance.styles=g}(Polymer),function(a){function b(a,b){if("string"!=typeof a){var c=b||document._currentScript;if(b=a,a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a),Platform.consumeDeclarations&&Platform.consumeDeclarations(function(a){if(a)for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.apply(null,c)})}(Polymer),function(a){var b={resolveElementPaths:function(a){Polymer.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),i&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",j=document.head.querySelectorAll(g);j.length&&(f=j[j.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return q?q.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i=window.ShadowDOMPolyfill,j="style",k="@import",l="link[rel=stylesheet]",m="global",n="polymer-scope",o={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Polymer.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(l),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(j),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(k)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(l),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(j+"["+n+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(n)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(m);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+n+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},p=HTMLElement.prototype,q=p.matches||p.matchesSelector||p.webkitMatchesSelector||p.mozMatchesSelector;a.api.declaration.styles=o,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return PolymerGestures.addEventListener(d,c,h),f?void 0:{open:g,discardChanges:g,close:function(){PolymerGestures.removeEventListener(d,c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c];d&&void 0!==d.reflect&&(b.reflect[c]=Boolean(d.reflect),d=d.value),void 0!==d&&(b[c]=d)}},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a){var d=this.getAttribute(b);if(d)for(var e,f=a.publish||(a.publish={}),g=d.split(c),h=0,i=g.length;i>h;h++)e=g[h].trim(),e&&void 0===f[e]&&(f[e]=void 0)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&a.content},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f=window.ShadowDOMPolyfill,g={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),f&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),h[a]=b}return b},findBasePrototype:function(a){return h[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},h={};g.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=g}(Polymer),function(a){function b(a){return document.contains(a)?i:h}function c(){return h.length?h[0]:i[0]}function d(a){e.waitToReady=!0,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a){a.__queue||(a.__queue={},f.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?h.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=f.length;c>b&&(a=f[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){g.push(a)},flush:function(){if(!this.flushing){this.flushing=!0;for(var a;g.length;)a=g.shift(),a.__queue.go.call(a),a.__queue=null;this.flushing=!1}},ready:function(){var a=CustomElements.ready;CustomElements.ready=!1,this.flush(),CustomElements.useNative||CustomElements.upgradeDocumentTree(document),CustomElements.ready=a,Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&j.push(a)},flushReadyCallbacks:function(){if(j)for(var a;j.length;)(a=j.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[],j=[];a.elements=f,a.queue=e,a.whenReady=a.whenPolymerReady=d}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),f.wait(this),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/microtask.js b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/microtask.js
new file mode 100644
index 0000000..827f2fe
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/microtask.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+(function(scope) {
+
+var iterations = 0;
+var callbacks = [];
+var twiddle = document.createTextNode('');
+
+function endOfMicrotask(callback) {
+  twiddle.textContent = iterations++;
+  callbacks.push(callback);
+}
+
+function atEndOfMicrotask() {
+  while (callbacks.length) {
+    callbacks.shift()();
+  }
+}
+
+new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)
+  .observe(twiddle, {characterData: true})
+  ;
+
+// exports
+
+scope.endOfMicrotask = endOfMicrotask;
+
+})(Platform);
+
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/node_bind.js b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/node_bind.js
new file mode 100644
index 0000000..270c557
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/node_bind.js
@@ -0,0 +1,343 @@
+// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+// Code distributed by Google as part of the polymer project is also
+// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+
+(function(global) {
+  'use strict';
+
+  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
+
+  function getTreeScope(node) {
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+
+    return typeof node.getElementById === 'function' ? node : null;
+  }
+
+  Node.prototype.bind = function(name, observable) {
+    console.error('Unhandled binding to Node: ', this, name, observable);
+  };
+
+  Node.prototype.bindFinished = function() {};
+
+  function updateBindings(node, name, binding) {
+    var bindings = node.bindings_;
+    if (!bindings)
+      bindings = node.bindings_ = {};
+
+    if (bindings[name])
+      binding[name].close();
+
+    return bindings[name] = binding;
+  }
+
+  function returnBinding(node, name, binding) {
+    return binding;
+  }
+
+  function sanitizeValue(value) {
+    return value == null ? '' : value;
+  }
+
+  function updateText(node, value) {
+    node.data = sanitizeValue(value);
+  }
+
+  function textBinding(node) {
+    return function(value) {
+      return updateText(node, value);
+    };
+  }
+
+  var maybeUpdateBindings = returnBinding;
+
+  Object.defineProperty(Platform, 'enableBindingsReflection', {
+    get: function() {
+      return maybeUpdateBindings === updateBindings;
+    },
+    set: function(enable) {
+      maybeUpdateBindings = enable ? updateBindings : returnBinding;
+      return enable;
+    },
+    configurable: true
+  });
+
+  Text.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'textContent')
+      return Node.prototype.bind.call(this, name, value, oneTime);
+
+    if (oneTime)
+      return updateText(this, value);
+
+    var observable = value;
+    updateText(this, observable.open(textBinding(this)));
+    return maybeUpdateBindings(this, name, observable);
+  }
+
+  function updateAttribute(el, name, conditional, value) {
+    if (conditional) {
+      if (value)
+        el.setAttribute(name, '');
+      else
+        el.removeAttribute(name);
+      return;
+    }
+
+    el.setAttribute(name, sanitizeValue(value));
+  }
+
+  function attributeBinding(el, name, conditional) {
+    return function(value) {
+      updateAttribute(el, name, conditional, value);
+    };
+  }
+
+  Element.prototype.bind = function(name, value, oneTime) {
+    var conditional = name[name.length - 1] == '?';
+    if (conditional) {
+      this.removeAttribute(name);
+      name = name.slice(0, -1);
+    }
+
+    if (oneTime)
+      return updateAttribute(this, name, conditional, value);
+
+
+    var observable = value;
+    updateAttribute(this, name, conditional,
+        observable.open(attributeBinding(this, name, conditional)));
+
+    return maybeUpdateBindings(this, name, observable);
+  };
+
+  var checkboxEventType;
+  (function() {
+    // Attempt to feature-detect which event (change or click) is fired first
+    // for checkboxes.
+    var div = document.createElement('div');
+    var checkbox = div.appendChild(document.createElement('input'));
+    checkbox.setAttribute('type', 'checkbox');
+    var first;
+    var count = 0;
+    checkbox.addEventListener('click', function(e) {
+      count++;
+      first = first || 'click';
+    });
+    checkbox.addEventListener('change', function() {
+      count++;
+      first = first || 'change';
+    });
+
+    var event = document.createEvent('MouseEvent');
+    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
+        false, false, false, 0, null);
+    checkbox.dispatchEvent(event);
+    // WebKit/Blink don't fire the change event if the element is outside the
+    // document, so assume 'change' for that case.
+    checkboxEventType = count == 1 ? 'change' : first;
+  })();
+
+  function getEventForInputType(element) {
+    switch (element.type) {
+      case 'checkbox':
+        return checkboxEventType;
+      case 'radio':
+      case 'select-multiple':
+      case 'select-one':
+        return 'change';
+      case 'range':
+        if (/Trident|MSIE/.test(navigator.userAgent))
+          return 'change';
+      default:
+        return 'input';
+    }
+  }
+
+  function updateInput(input, property, value, santizeFn) {
+    input[property] = (santizeFn || sanitizeValue)(value);
+  }
+
+  function inputBinding(input, property, santizeFn) {
+    return function(value) {
+      return updateInput(input, property, value, santizeFn);
+    }
+  }
+
+  function noop() {}
+
+  function bindInputEvent(input, property, observable, postEventFn) {
+    var eventType = getEventForInputType(input);
+
+    function eventHandler() {
+      observable.setValue(input[property]);
+      observable.discardChanges();
+      (postEventFn || noop)(input);
+      Platform.performMicrotaskCheckpoint();
+    }
+    input.addEventListener(eventType, eventHandler);
+
+    return {
+      close: function() {
+        input.removeEventListener(eventType, eventHandler);
+        observable.close();
+      },
+
+      observable_: observable
+    }
+  }
+
+  function booleanSanitize(value) {
+    return Boolean(value);
+  }
+
+  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
+  // Returns an array containing all radio buttons other than |element| that
+  // have the same |name|, either in the form that |element| belongs to or,
+  // if no form, in the document tree to which |element| belongs.
+  //
+  // This implementation is based upon the HTML spec definition of a
+  // "radio button group":
+  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
+  //
+  function getAssociatedRadioButtons(element) {
+    if (element.form) {
+      return filter(element.form.elements, function(el) {
+        return el != element &&
+            el.tagName == 'INPUT' &&
+            el.type == 'radio' &&
+            el.name == element.name;
+      });
+    } else {
+      var treeScope = getTreeScope(element);
+      if (!treeScope)
+        return [];
+      var radios = treeScope.querySelectorAll(
+          'input[type="radio"][name="' + element.name + '"]');
+      return filter(radios, function(el) {
+        return el != element && !el.form;
+      });
+    }
+  }
+
+  function checkedPostEvent(input) {
+    // Only the radio button that is getting checked gets an event. We
+    // therefore find all the associated radio buttons and update their
+    // check binding manually.
+    if (input.tagName === 'INPUT' &&
+        input.type === 'radio') {
+      getAssociatedRadioButtons(input).forEach(function(radio) {
+        var checkedBinding = radio.bindings_.checked;
+        if (checkedBinding) {
+          // Set the value directly to avoid an infinite call stack.
+          checkedBinding.observable_.setValue(false);
+        }
+      });
+    }
+  }
+
+  HTMLInputElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value' && name !== 'checked')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
+    var postEventFn = name == 'checked' ? checkedPostEvent : noop;
+
+    if (oneTime)
+      return updateInput(this, name, value, sanitizeFn);
+
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable, postEventFn);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name, sanitizeFn)),
+                sanitizeFn);
+
+    // Checkboxes may need to update bindings of other checkboxes.
+    return updateBindings(this, name, binding);
+  }
+
+  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateInput(this, 'value', value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateInput(this, 'value',
+                observable.open(inputBinding(this, 'value', sanitizeValue)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  function updateOption(option, value) {
+    var parentNode = option.parentNode;;
+    var select;
+    var selectBinding;
+    var oldValue;
+    if (parentNode instanceof HTMLSelectElement &&
+        parentNode.bindings_ &&
+        parentNode.bindings_.value) {
+      select = parentNode;
+      selectBinding = select.bindings_.value;
+      oldValue = select.value;
+    }
+
+    option.value = sanitizeValue(value);
+
+    if (select && select.value != oldValue) {
+      selectBinding.observable_.setValue(select.value);
+      selectBinding.observable_.discardChanges();
+      Platform.performMicrotaskCheckpoint();
+    }
+  }
+
+  function optionBinding(option) {
+    return function(value) {
+      updateOption(option, value);
+    }
+  }
+
+  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateOption(this, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateOption(this, observable.open(optionBinding(this)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
+    if (name === 'selectedindex')
+      name = 'selectedIndex';
+
+    if (name !== 'selectedIndex' && name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+
+    if (oneTime)
+      return updateInput(this, name, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name)));
+
+    // Option update events may need to access select bindings.
+    return updateBindings(this, name, binding);
+  }
+})(this);
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/observe.js b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/observe.js
new file mode 100644
index 0000000..240e25d
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/observe.js
@@ -0,0 +1,1727 @@
+// 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';
+
+  var testingExposeCycleCount = global.testingExposeCycleCount;
+
+  // Detect and do basic sanity checking on Object/Array.observe.
+  function detectObjectObserve() {
+    if (typeof Object.observe !== 'function' ||
+        typeof Array.observe !== 'function') {
+      return false;
+    }
+
+    var records = [];
+
+    function callback(recs) {
+      records = recs;
+    }
+
+    var test = {};
+    var arr = [];
+    Object.observe(test, callback);
+    Array.observe(arr, callback);
+    test.id = 1;
+    test.id = 2;
+    delete test.id;
+    arr.push(1, 2);
+    arr.length = 0;
+
+    Object.deliverChangeRecords(callback);
+    if (records.length !== 5)
+      return false;
+
+    if (records[0].type != 'add' ||
+        records[1].type != 'update' ||
+        records[2].type != 'delete' ||
+        records[3].type != 'splice' ||
+        records[4].type != 'splice') {
+      return false;
+    }
+
+    Object.unobserve(test, callback);
+    Array.unobserve(arr, callback);
+
+    return true;
+  }
+
+  var hasObserve = detectObjectObserve();
+
+  function detectEval() {
+    // Don't test for eval if we're running in a Chrome App environment.
+    // We check for APIs set that only exist in a Chrome App context.
+    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
+      return false;
+    }
+
+    // Firefox OS Apps do not allow eval. This feature detection is very hacky
+    // but even if some other platform adds support for this function this code
+    // will continue to work.
+    if (navigator.getDeviceStorage) {
+      return false;
+    }
+
+    try {
+      var f = new Function('', 'return true;');
+      return f();
+    } catch (ex) {
+      return false;
+    }
+  }
+
+  var hasEval = detectEval();
+
+  function isIndex(s) {
+    return +s === s >>> 0;
+  }
+
+  function toNumber(s) {
+    return +s;
+  }
+
+  function isObject(obj) {
+    return obj === Object(obj);
+  }
+
+  var numberIsNaN = global.Number.isNaN || function(value) {
+    return typeof value === 'number' && global.isNaN(value);
+  }
+
+  function areSameValue(left, right) {
+    if (left === right)
+      return left !== 0 || 1 / left === 1 / right;
+    if (numberIsNaN(left) && numberIsNaN(right))
+      return true;
+
+    return left !== left && right !== right;
+  }
+
+  var createObject = ('__proto__' in {}) ?
+    function(obj) { return obj; } :
+    function(obj) {
+      var proto = obj.__proto__;
+      if (!proto)
+        return obj;
+      var newObject = Object.create(proto);
+      Object.getOwnPropertyNames(obj).forEach(function(name) {
+        Object.defineProperty(newObject, name,
+                             Object.getOwnPropertyDescriptor(obj, name));
+      });
+      return newObject;
+    };
+
+  var identStart = '[\$_a-zA-Z]';
+  var identPart = '[\$_a-zA-Z0-9]';
+  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');
+
+  function getPathCharType(char) {
+    if (char === undefined)
+      return 'eof';
+
+    var code = char.charCodeAt(0);
+
+    switch(code) {
+      case 0x5B: // [
+      case 0x5D: // ]
+      case 0x2E: // .
+      case 0x22: // "
+      case 0x27: // '
+      case 0x30: // 0
+        return char;
+
+      case 0x5F: // _
+      case 0x24: // $
+        return 'ident';
+
+      case 0x20: // Space
+      case 0x09: // Tab
+      case 0x0A: // Newline
+      case 0x0D: // Return
+      case 0xA0:  // No-break space
+      case 0xFEFF:  // Byte Order Mark
+      case 0x2028:  // Line Separator
+      case 0x2029:  // Paragraph Separator
+        return 'ws';
+    }
+
+    // a-z, A-Z
+    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
+      return 'ident';
+
+    // 1-9
+    if (0x31 <= code && code <= 0x39)
+      return 'number';
+
+    return 'else';
+  }
+
+  var pathStateMachine = {
+    'beforePath': {
+      'ws': ['beforePath'],
+      'ident': ['inIdent', 'append'],
+      '[': ['beforeElement'],
+      'eof': ['afterPath']
+    },
+
+    'inPath': {
+      'ws': ['inPath'],
+      '.': ['beforeIdent'],
+      '[': ['beforeElement'],
+      'eof': ['afterPath']
+    },
+
+    'beforeIdent': {
+      'ws': ['beforeIdent'],
+      'ident': ['inIdent', 'append']
+    },
+
+    'inIdent': {
+      'ident': ['inIdent', 'append'],
+      '0': ['inIdent', 'append'],
+      'number': ['inIdent', 'append'],
+      'ws': ['inPath', 'push'],
+      '.': ['beforeIdent', 'push'],
+      '[': ['beforeElement', 'push'],
+      'eof': ['afterPath', 'push']
+    },
+
+    'beforeElement': {
+      'ws': ['beforeElement'],
+      '0': ['afterZero', 'append'],
+      'number': ['inIndex', 'append'],
+      "'": ['inSingleQuote', 'append', ''],
+      '"': ['inDoubleQuote', 'append', '']
+    },
+
+    'afterZero': {
+      'ws': ['afterElement', 'push'],
+      ']': ['inPath', 'push']
+    },
+
+    'inIndex': {
+      '0': ['inIndex', 'append'],
+      'number': ['inIndex', 'append'],
+      'ws': ['afterElement'],
+      ']': ['inPath', 'push']
+    },
+
+    'inSingleQuote': {
+      "'": ['afterElement'],
+      'eof': ['error'],
+      'else': ['inSingleQuote', 'append']
+    },
+
+    'inDoubleQuote': {
+      '"': ['afterElement'],
+      'eof': ['error'],
+      'else': ['inDoubleQuote', 'append']
+    },
+
+    'afterElement': {
+      'ws': ['afterElement'],
+      ']': ['inPath', 'push']
+    }
+  }
+
+  function noop() {}
+
+  function parsePath(path) {
+    var keys = [];
+    var index = -1;
+    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';
+
+    var actions = {
+      push: function() {
+        if (key === undefined)
+          return;
+
+        keys.push(key);
+        key = undefined;
+      },
+
+      append: function() {
+        if (key === undefined)
+          key = newChar
+        else
+          key += newChar;
+      }
+    };
+
+    function maybeUnescapeQuote() {
+      if (index >= path.length)
+        return;
+
+      var nextChar = path[index + 1];
+      if ((mode == 'inSingleQuote' && nextChar == "'") ||
+          (mode == 'inDoubleQuote' && nextChar == '"')) {
+        index++;
+        newChar = nextChar;
+        actions.append();
+        return true;
+      }
+    }
+
+    while (mode) {
+      index++;
+      c = path[index];
+
+      if (c == '\\' && maybeUnescapeQuote(mode))
+        continue;
+
+      type = getPathCharType(c);
+      typeMap = pathStateMachine[mode];
+      transition = typeMap[type] || typeMap['else'] || 'error';
+
+      if (transition == 'error')
+        return; // parse error;
+
+      mode = transition[0];
+      action = actions[transition[1]] || noop;
+      newChar = transition[2] === undefined ? c : transition[2];
+      action();
+
+      if (mode === 'afterPath') {
+        return keys;
+      }
+    }
+
+    return; // parse error
+  }
+
+  function isIdent(s) {
+    return identRegExp.test(s);
+  }
+
+  var constructorIsPrivate = {};
+
+  function Path(parts, privateToken) {
+    if (privateToken !== constructorIsPrivate)
+      throw Error('Use Path.get to retrieve path objects');
+
+    for (var i = 0; i < parts.length; i++) {
+      this.push(String(parts[i]));
+    }
+
+    if (hasEval && this.length) {
+      this.getValueFrom = this.compiledGetValueFromFn();
+    }
+  }
+
+  // TODO(rafaelw): Make simple LRU cache
+  var pathCache = {};
+
+  function getPath(pathString) {
+    if (pathString instanceof Path)
+      return pathString;
+
+    if (pathString == null || pathString.length == 0)
+      pathString = '';
+
+    if (typeof pathString != 'string') {
+      if (isIndex(pathString.length)) {
+        // Constructed with array-like (pre-parsed) keys
+        return new Path(pathString, constructorIsPrivate);
+      }
+
+      pathString = String(pathString);
+    }
+
+    var path = pathCache[pathString];
+    if (path)
+      return path;
+
+    var parts = parsePath(pathString);
+    if (!parts)
+      return invalidPath;
+
+    var path = new Path(parts, constructorIsPrivate);
+    pathCache[pathString] = path;
+    return path;
+  }
+
+  Path.get = getPath;
+
+  function formatAccessor(key) {
+    if (isIndex(key)) {
+      return '[' + key + ']';
+    } else {
+      return '["' + key.replace(/"/g, '\\"') + '"]';
+    }
+  }
+
+  Path.prototype = createObject({
+    __proto__: [],
+    valid: true,
+
+    toString: function() {
+      var pathString = '';
+      for (var i = 0; i < this.length; i++) {
+        var key = this[i];
+        if (isIdent(key)) {
+          pathString += i ? '.' + key : key;
+        } else {
+          pathString += formatAccessor(key);
+        }
+      }
+
+      return pathString;
+    },
+
+    getValueFrom: function(obj, directObserver) {
+      for (var i = 0; i < this.length; i++) {
+        if (obj == null)
+          return;
+        obj = obj[this[i]];
+      }
+      return obj;
+    },
+
+    iterateObjects: function(obj, observe) {
+      for (var i = 0; i < this.length; i++) {
+        if (i)
+          obj = obj[this[i - 1]];
+        if (!isObject(obj))
+          return;
+        observe(obj, this[0]);
+      }
+    },
+
+    compiledGetValueFromFn: function() {
+      var str = '';
+      var pathString = 'obj';
+      str += 'if (obj != null';
+      var i = 0;
+      var key;
+      for (; i < (this.length - 1); i++) {
+        key = this[i];
+        pathString += isIdent(key) ? '.' + key : formatAccessor(key);
+        str += ' &&\n     ' + pathString + ' != null';
+      }
+      str += ')\n';
+
+      var key = this[i];
+      pathString += isIdent(key) ? '.' + key : formatAccessor(key);
+
+      str += '  return ' + pathString + ';\nelse\n  return undefined;';
+      return new Function('obj', str);
+    },
+
+    setValueFrom: function(obj, value) {
+      if (!this.length)
+        return false;
+
+      for (var i = 0; i < this.length - 1; i++) {
+        if (!isObject(obj))
+          return false;
+        obj = obj[this[i]];
+      }
+
+      if (!isObject(obj))
+        return false;
+
+      obj[this[i]] = value;
+      return true;
+    }
+  });
+
+  var invalidPath = new Path('', constructorIsPrivate);
+  invalidPath.valid = false;
+  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
+
+  var MAX_DIRTY_CHECK_CYCLES = 1000;
+
+  function dirtyCheck(observer) {
+    var cycles = 0;
+    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
+      cycles++;
+    }
+    if (testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    return cycles > 0;
+  }
+
+  function objectIsEmpty(object) {
+    for (var prop in object)
+      return false;
+    return true;
+  }
+
+  function diffIsEmpty(diff) {
+    return objectIsEmpty(diff.added) &&
+           objectIsEmpty(diff.removed) &&
+           objectIsEmpty(diff.changed);
+  }
+
+  function diffObjectFromOldObject(object, oldObject) {
+    var added = {};
+    var removed = {};
+    var changed = {};
+
+    for (var prop in oldObject) {
+      var newValue = object[prop];
+
+      if (newValue !== undefined && newValue === oldObject[prop])
+        continue;
+
+      if (!(prop in object)) {
+        removed[prop] = undefined;
+        continue;
+      }
+
+      if (newValue !== oldObject[prop])
+        changed[prop] = newValue;
+    }
+
+    for (var prop in object) {
+      if (prop in oldObject)
+        continue;
+
+      added[prop] = object[prop];
+    }
+
+    if (Array.isArray(object) && object.length !== oldObject.length)
+      changed.length = object.length;
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  var eomTasks = [];
+  function runEOMTasks() {
+    if (!eomTasks.length)
+      return false;
+
+    for (var i = 0; i < eomTasks.length; i++) {
+      eomTasks[i]();
+    }
+    eomTasks.length = 0;
+    return true;
+  }
+
+  var runEOM = hasObserve ? (function(){
+    var eomObj = { pingPong: true };
+    var eomRunScheduled = false;
+
+    Object.observe(eomObj, function() {
+      runEOMTasks();
+      eomRunScheduled = false;
+    });
+
+    return function(fn) {
+      eomTasks.push(fn);
+      if (!eomRunScheduled) {
+        eomRunScheduled = true;
+        eomObj.pingPong = !eomObj.pingPong;
+      }
+    };
+  })() :
+  (function() {
+    return function(fn) {
+      eomTasks.push(fn);
+    };
+  })();
+
+  var observedObjectCache = [];
+
+  function newObservedObject() {
+    var observer;
+    var object;
+    var discardRecords = false;
+    var first = true;
+
+    function callback(records) {
+      if (observer && observer.state_ === OPENED && !discardRecords)
+        observer.check_(records);
+    }
+
+    return {
+      open: function(obs) {
+        if (observer)
+          throw Error('ObservedObject in use');
+
+        if (!first)
+          Object.deliverChangeRecords(callback);
+
+        observer = obs;
+        first = false;
+      },
+      observe: function(obj, arrayObserve) {
+        object = obj;
+        if (arrayObserve)
+          Array.observe(object, callback);
+        else
+          Object.observe(object, callback);
+      },
+      deliver: function(discard) {
+        discardRecords = discard;
+        Object.deliverChangeRecords(callback);
+        discardRecords = false;
+      },
+      close: function() {
+        observer = undefined;
+        Object.unobserve(object, callback);
+        observedObjectCache.push(this);
+      }
+    };
+  }
+
+  /*
+   * The observedSet abstraction is a perf optimization which reduces the total
+   * number of Object.observe observations of a set of objects. The idea is that
+   * groups of Observers will have some object dependencies in common and this
+   * observed set ensures that each object in the transitive closure of
+   * dependencies is only observed once. The observedSet acts as a write barrier
+   * such that whenever any change comes through, all Observers are checked for
+   * changed values.
+   *
+   * Note that this optimization is explicitly moving work from setup-time to
+   * change-time.
+   *
+   * TODO(rafaelw): Implement "garbage collection". In order to move work off
+   * the critical path, when Observers are closed, their observed objects are
+   * not Object.unobserve(d). As a result, it's possible that if the observedSet
+   * is kept open, but some Observers have been closed, it could cause "leaks"
+   * (prevent otherwise collectable objects from being collected). At some
+   * point, we should implement incremental "gc" which keeps a list of
+   * observedSets which may need clean-up and does small amounts of cleanup on a
+   * timeout until all is clean.
+   */
+
+  function getObservedObject(observer, object, arrayObserve) {
+    var dir = observedObjectCache.pop() || newObservedObject();
+    dir.open(observer);
+    dir.observe(object, arrayObserve);
+    return dir;
+  }
+
+  var observedSetCache = [];
+
+  function newObservedSet() {
+    var observerCount = 0;
+    var observers = [];
+    var objects = [];
+    var rootObj;
+    var rootObjProps;
+
+    function observe(obj, prop) {
+      if (!obj)
+        return;
+
+      if (obj === rootObj)
+        rootObjProps[prop] = true;
+
+      if (objects.indexOf(obj) < 0) {
+        objects.push(obj);
+        Object.observe(obj, callback);
+      }
+
+      observe(Object.getPrototypeOf(obj), prop);
+    }
+
+    function allRootObjNonObservedProps(recs) {
+      for (var i = 0; i < recs.length; i++) {
+        var rec = recs[i];
+        if (rec.object !== rootObj ||
+            rootObjProps[rec.name] ||
+            rec.type === 'setPrototype') {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    function callback(recs) {
+      if (allRootObjNonObservedProps(recs))
+        return;
+
+      var observer;
+      for (var i = 0; i < observers.length; i++) {
+        observer = observers[i];
+        if (observer.state_ == OPENED) {
+          observer.iterateObjects_(observe);
+        }
+      }
+
+      for (var i = 0; i < observers.length; i++) {
+        observer = observers[i];
+        if (observer.state_ == OPENED) {
+          observer.check_();
+        }
+      }
+    }
+
+    var record = {
+      object: undefined,
+      objects: objects,
+      open: function(obs, object) {
+        if (!rootObj) {
+          rootObj = object;
+          rootObjProps = {};
+        }
+
+        observers.push(obs);
+        observerCount++;
+        obs.iterateObjects_(observe);
+      },
+      close: function(obs) {
+        observerCount--;
+        if (observerCount > 0) {
+          return;
+        }
+
+        for (var i = 0; i < objects.length; i++) {
+          Object.unobserve(objects[i], callback);
+          Observer.unobservedCount++;
+        }
+
+        observers.length = 0;
+        objects.length = 0;
+        rootObj = undefined;
+        rootObjProps = undefined;
+        observedSetCache.push(this);
+      }
+    };
+
+    return record;
+  }
+
+  var lastObservedSet;
+
+  function getObservedSet(observer, obj) {
+    if (!lastObservedSet || lastObservedSet.object !== obj) {
+      lastObservedSet = observedSetCache.pop() || newObservedSet();
+      lastObservedSet.object = obj;
+    }
+    lastObservedSet.open(observer, obj);
+    return lastObservedSet;
+  }
+
+  var UNOPENED = 0;
+  var OPENED = 1;
+  var CLOSED = 2;
+  var RESETTING = 3;
+
+  var nextObserverId = 1;
+
+  function Observer() {
+    this.state_ = UNOPENED;
+    this.callback_ = undefined;
+    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef
+    this.directObserver_ = undefined;
+    this.value_ = undefined;
+    this.id_ = nextObserverId++;
+  }
+
+  Observer.prototype = {
+    open: function(callback, target) {
+      if (this.state_ != UNOPENED)
+        throw Error('Observer has already been opened.');
+
+      addToAll(this);
+      this.callback_ = callback;
+      this.target_ = target;
+      this.connect_();
+      this.state_ = OPENED;
+      return this.value_;
+    },
+
+    close: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      removeFromAll(this);
+      this.disconnect_();
+      this.value_ = undefined;
+      this.callback_ = undefined;
+      this.target_ = undefined;
+      this.state_ = CLOSED;
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      dirtyCheck(this);
+    },
+
+    report_: function(changes) {
+      try {
+        this.callback_.apply(this.target_, changes);
+      } catch (ex) {
+        Observer._errorThrownDuringCallback = true;
+        console.error('Exception caught during observer callback: ' +
+                       (ex.stack || ex));
+      }
+    },
+
+    discardChanges: function() {
+      this.check_(undefined, true);
+      return this.value_;
+    }
+  }
+
+  var collectObservers = !hasObserve;
+  var allObservers;
+  Observer._allObserversCount = 0;
+
+  if (collectObservers) {
+    allObservers = [];
+  }
+
+  function addToAll(observer) {
+    Observer._allObserversCount++;
+    if (!collectObservers)
+      return;
+
+    allObservers.push(observer);
+  }
+
+  function removeFromAll(observer) {
+    Observer._allObserversCount--;
+  }
+
+  var runningMicrotaskCheckpoint = false;
+
+  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {
+    try {
+      eval('%RunMicrotasks()');
+      return true;
+    } catch (ex) {
+      return false;
+    }
+  })();
+
+  global.Platform = global.Platform || {};
+
+  global.Platform.performMicrotaskCheckpoint = function() {
+    if (runningMicrotaskCheckpoint)
+      return;
+
+    if (hasDebugForceFullDelivery) {
+      eval('%RunMicrotasks()');
+      return;
+    }
+
+    if (!collectObservers)
+      return;
+
+    runningMicrotaskCheckpoint = true;
+
+    var cycles = 0;
+    var anyChanged, toCheck;
+
+    do {
+      cycles++;
+      toCheck = allObservers;
+      allObservers = [];
+      anyChanged = false;
+
+      for (var i = 0; i < toCheck.length; i++) {
+        var observer = toCheck[i];
+        if (observer.state_ != OPENED)
+          continue;
+
+        if (observer.check_())
+          anyChanged = true;
+
+        allObservers.push(observer);
+      }
+      if (runEOMTasks())
+        anyChanged = true;
+    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
+
+    if (testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    runningMicrotaskCheckpoint = false;
+  };
+
+  if (collectObservers) {
+    global.Platform.clearObservers = function() {
+      allObservers = [];
+    };
+  }
+
+  function ObjectObserver(object) {
+    Observer.call(this);
+    this.value_ = object;
+    this.oldObject_ = undefined;
+  }
+
+  ObjectObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    arrayObserve: false,
+
+    connect_: function(callback, target) {
+      if (hasObserve) {
+        this.directObserver_ = getObservedObject(this, this.value_,
+                                                 this.arrayObserve);
+      } else {
+        this.oldObject_ = this.copyObject(this.value_);
+      }
+
+    },
+
+    copyObject: function(object) {
+      var copy = Array.isArray(object) ? [] : {};
+      for (var prop in object) {
+        copy[prop] = object[prop];
+      };
+      if (Array.isArray(object))
+        copy.length = object.length;
+      return copy;
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var diff;
+      var oldValues;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+
+        oldValues = {};
+        diff = diffObjectFromChangeRecords(this.value_, changeRecords,
+                                           oldValues);
+      } else {
+        oldValues = this.oldObject_;
+        diff = diffObjectFromOldObject(this.value_, this.oldObject_);
+      }
+
+      if (diffIsEmpty(diff))
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([
+        diff.added || {},
+        diff.removed || {},
+        diff.changed || {},
+        function(property) {
+          return oldValues[property];
+        }
+      ]);
+
+      return true;
+    },
+
+    disconnect_: function() {
+      if (hasObserve) {
+        this.directObserver_.close();
+        this.directObserver_ = undefined;
+      } else {
+        this.oldObject_ = undefined;
+      }
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      if (hasObserve)
+        this.directObserver_.deliver(false);
+      else
+        dirtyCheck(this);
+    },
+
+    discardChanges: function() {
+      if (this.directObserver_)
+        this.directObserver_.deliver(true);
+      else
+        this.oldObject_ = this.copyObject(this.value_);
+
+      return this.value_;
+    }
+  });
+
+  function ArrayObserver(array) {
+    if (!Array.isArray(array))
+      throw Error('Provided object is not an Array');
+    ObjectObserver.call(this, array);
+  }
+
+  ArrayObserver.prototype = createObject({
+
+    __proto__: ObjectObserver.prototype,
+
+    arrayObserve: true,
+
+    copyObject: function(arr) {
+      return arr.slice();
+    },
+
+    check_: function(changeRecords) {
+      var splices;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+        splices = projectArraySplices(this.value_, changeRecords);
+      } else {
+        splices = calcSplices(this.value_, 0, this.value_.length,
+                              this.oldObject_, 0, this.oldObject_.length);
+      }
+
+      if (!splices || !splices.length)
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([splices]);
+      return true;
+    }
+  });
+
+  ArrayObserver.applySplices = function(previous, current, splices) {
+    splices.forEach(function(splice) {
+      var spliceArgs = [splice.index, splice.removed.length];
+      var addIndex = splice.index;
+      while (addIndex < splice.index + splice.addedCount) {
+        spliceArgs.push(current[addIndex]);
+        addIndex++;
+      }
+
+      Array.prototype.splice.apply(previous, spliceArgs);
+    });
+  };
+
+  function PathObserver(object, path) {
+    Observer.call(this);
+
+    this.object_ = object;
+    this.path_ = getPath(path);
+    this.directObserver_ = undefined;
+  }
+
+  PathObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    get path() {
+      return this.path_;
+    },
+
+    connect_: function() {
+      if (hasObserve)
+        this.directObserver_ = getObservedSet(this, this.object_);
+
+      this.check_(undefined, true);
+    },
+
+    disconnect_: function() {
+      this.value_ = undefined;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+    },
+
+    iterateObjects_: function(observe) {
+      this.path_.iterateObjects(this.object_, observe);
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValue = this.value_;
+      this.value_ = this.path_.getValueFrom(this.object_);
+      if (skipChanges || areSameValue(this.value_, oldValue))
+        return false;
+
+      this.report_([this.value_, oldValue, this]);
+      return true;
+    },
+
+    setValue: function(newValue) {
+      if (this.path_)
+        this.path_.setValueFrom(this.object_, newValue);
+    }
+  });
+
+  function CompoundObserver(reportChangesOnOpen) {
+    Observer.call(this);
+
+    this.reportChangesOnOpen_ = reportChangesOnOpen;
+    this.value_ = [];
+    this.directObserver_ = undefined;
+    this.observed_ = [];
+  }
+
+  var observerSentinel = {};
+
+  CompoundObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    connect_: function() {
+      if (hasObserve) {
+        var object;
+        var needsDirectObserver = false;
+        for (var i = 0; i < this.observed_.length; i += 2) {
+          object = this.observed_[i]
+          if (object !== observerSentinel) {
+            needsDirectObserver = true;
+            break;
+          }
+        }
+
+        if (needsDirectObserver)
+          this.directObserver_ = getObservedSet(this, object);
+      }
+
+      this.check_(undefined, !this.reportChangesOnOpen_);
+    },
+
+    disconnect_: function() {
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        if (this.observed_[i] === observerSentinel)
+          this.observed_[i + 1].close();
+      }
+      this.observed_.length = 0;
+      this.value_.length = 0;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+    },
+
+    addPath: function(object, path) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add paths once started.');
+
+      var path = getPath(path);
+      this.observed_.push(object, path);
+      if (!this.reportChangesOnOpen_)
+        return;
+      var index = this.observed_.length / 2 - 1;
+      this.value_[index] = path.getValueFrom(object);
+    },
+
+    addObserver: function(observer) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add observers once started.');
+
+      this.observed_.push(observerSentinel, observer);
+      if (!this.reportChangesOnOpen_)
+        return;
+      var index = this.observed_.length / 2 - 1;
+      this.value_[index] = observer.open(this.deliver, this);
+    },
+
+    startReset: function() {
+      if (this.state_ != OPENED)
+        throw Error('Can only reset while open');
+
+      this.state_ = RESETTING;
+      this.disconnect_();
+    },
+
+    finishReset: function() {
+      if (this.state_ != RESETTING)
+        throw Error('Can only finishReset after startReset');
+      this.state_ = OPENED;
+      this.connect_();
+
+      return this.value_;
+    },
+
+    iterateObjects_: function(observe) {
+      var object;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        object = this.observed_[i]
+        if (object !== observerSentinel)
+          this.observed_[i + 1].iterateObjects(object, observe)
+      }
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValues;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        var object = this.observed_[i];
+        var path = this.observed_[i+1];
+        var value;
+        if (object === observerSentinel) {
+          var observable = path;
+          value = this.state_ === UNOPENED ?
+              observable.open(this.deliver, this) :
+              observable.discardChanges();
+        } else {
+          value = path.getValueFrom(object);
+        }
+
+        if (skipChanges) {
+          this.value_[i / 2] = value;
+          continue;
+        }
+
+        if (areSameValue(value, this.value_[i / 2]))
+          continue;
+
+        oldValues = oldValues || [];
+        oldValues[i / 2] = this.value_[i / 2];
+        this.value_[i / 2] = value;
+      }
+
+      if (!oldValues)
+        return false;
+
+      // TODO(rafaelw): Having observed_ as the third callback arg here is
+      // pretty lame API. Fix.
+      this.report_([this.value_, oldValues, this.observed_]);
+      return true;
+    }
+  });
+
+  function identFn(value) { return value; }
+
+  function ObserverTransform(observable, getValueFn, setValueFn,
+                             dontPassThroughSet) {
+    this.callback_ = undefined;
+    this.target_ = undefined;
+    this.value_ = undefined;
+    this.observable_ = observable;
+    this.getValueFn_ = getValueFn || identFn;
+    this.setValueFn_ = setValueFn || identFn;
+    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this
+    // at the moment because of a bug in it's dependency tracking.
+    this.dontPassThroughSet_ = dontPassThroughSet;
+  }
+
+  ObserverTransform.prototype = {
+    open: function(callback, target) {
+      this.callback_ = callback;
+      this.target_ = target;
+      this.value_ =
+          this.getValueFn_(this.observable_.open(this.observedCallback_, this));
+      return this.value_;
+    },
+
+    observedCallback_: function(value) {
+      value = this.getValueFn_(value);
+      if (areSameValue(value, this.value_))
+        return;
+      var oldValue = this.value_;
+      this.value_ = value;
+      this.callback_.call(this.target_, this.value_, oldValue);
+    },
+
+    discardChanges: function() {
+      this.value_ = this.getValueFn_(this.observable_.discardChanges());
+      return this.value_;
+    },
+
+    deliver: function() {
+      return this.observable_.deliver();
+    },
+
+    setValue: function(value) {
+      value = this.setValueFn_(value);
+      if (!this.dontPassThroughSet_ && this.observable_.setValue)
+        return this.observable_.setValue(value);
+    },
+
+    close: function() {
+      if (this.observable_)
+        this.observable_.close();
+      this.callback_ = undefined;
+      this.target_ = undefined;
+      this.observable_ = undefined;
+      this.value_ = undefined;
+      this.getValueFn_ = undefined;
+      this.setValueFn_ = undefined;
+    }
+  }
+
+  var expectedRecordTypes = {
+    add: true,
+    update: true,
+    delete: true
+  };
+
+  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
+    var added = {};
+    var removed = {};
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      if (!expectedRecordTypes[record.type]) {
+        console.error('Unknown changeRecord type: ' + record.type);
+        console.error(record);
+        continue;
+      }
+
+      if (!(record.name in oldValues))
+        oldValues[record.name] = record.oldValue;
+
+      if (record.type == 'update')
+        continue;
+
+      if (record.type == 'add') {
+        if (record.name in removed)
+          delete removed[record.name];
+        else
+          added[record.name] = true;
+
+        continue;
+      }
+
+      // type = 'delete'
+      if (record.name in added) {
+        delete added[record.name];
+        delete oldValues[record.name];
+      } else {
+        removed[record.name] = true;
+      }
+    }
+
+    for (var prop in added)
+      added[prop] = object[prop];
+
+    for (var prop in removed)
+      removed[prop] = undefined;
+
+    var changed = {};
+    for (var prop in oldValues) {
+      if (prop in added || prop in removed)
+        continue;
+
+      var newValue = object[prop];
+      if (oldValues[prop] !== newValue)
+        changed[prop] = newValue;
+    }
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  function newSplice(index, removed, addedCount) {
+    return {
+      index: index,
+      removed: removed,
+      addedCount: addedCount
+    };
+  }
+
+  var EDIT_LEAVE = 0;
+  var EDIT_UPDATE = 1;
+  var EDIT_ADD = 2;
+  var EDIT_DELETE = 3;
+
+  function ArraySplice() {}
+
+  ArraySplice.prototype = {
+
+    // Note: This function is *based* on the computation of the Levenshtein
+    // "edit" distance. The one change is that "updates" are treated as two
+    // edits - not one. With Array splices, an update is really a delete
+    // followed by an add. By retaining this, we optimize for "keeping" the
+    // maximum array items in the original array. For example:
+    //
+    //   'xxxx123' -> '123yyyy'
+    //
+    // With 1-edit updates, the shortest path would be just to update all seven
+    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
+    // leaves the substring '123' intact.
+    calcEditDistances: function(current, currentStart, currentEnd,
+                                old, oldStart, oldEnd) {
+      // "Deletion" columns
+      var rowCount = oldEnd - oldStart + 1;
+      var columnCount = currentEnd - currentStart + 1;
+      var distances = new Array(rowCount);
+
+      // "Addition" rows. Initialize null column.
+      for (var i = 0; i < rowCount; i++) {
+        distances[i] = new Array(columnCount);
+        distances[i][0] = i;
+      }
+
+      // Initialize null row
+      for (var j = 0; j < columnCount; j++)
+        distances[0][j] = j;
+
+      for (var i = 1; i < rowCount; i++) {
+        for (var j = 1; j < columnCount; j++) {
+          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
+            distances[i][j] = distances[i - 1][j - 1];
+          else {
+            var north = distances[i - 1][j] + 1;
+            var west = distances[i][j - 1] + 1;
+            distances[i][j] = north < west ? north : west;
+          }
+        }
+      }
+
+      return distances;
+    },
+
+    // This starts at the final weight, and walks "backward" by finding
+    // the minimum previous weight recursively until the origin of the weight
+    // matrix.
+    spliceOperationsFromEditDistances: function(distances) {
+      var i = distances.length - 1;
+      var j = distances[0].length - 1;
+      var current = distances[i][j];
+      var edits = [];
+      while (i > 0 || j > 0) {
+        if (i == 0) {
+          edits.push(EDIT_ADD);
+          j--;
+          continue;
+        }
+        if (j == 0) {
+          edits.push(EDIT_DELETE);
+          i--;
+          continue;
+        }
+        var northWest = distances[i - 1][j - 1];
+        var west = distances[i - 1][j];
+        var north = distances[i][j - 1];
+
+        var min;
+        if (west < north)
+          min = west < northWest ? west : northWest;
+        else
+          min = north < northWest ? north : northWest;
+
+        if (min == northWest) {
+          if (northWest == current) {
+            edits.push(EDIT_LEAVE);
+          } else {
+            edits.push(EDIT_UPDATE);
+            current = northWest;
+          }
+          i--;
+          j--;
+        } else if (min == west) {
+          edits.push(EDIT_DELETE);
+          i--;
+          current = west;
+        } else {
+          edits.push(EDIT_ADD);
+          j--;
+          current = north;
+        }
+      }
+
+      edits.reverse();
+      return edits;
+    },
+
+    /**
+     * Splice Projection functions:
+     *
+     * A splice map is a representation of how a previous array of items
+     * was transformed into a new array of items. Conceptually it is a list of
+     * tuples of
+     *
+     *   <index, removed, addedCount>
+     *
+     * which are kept in ascending index order of. The tuple represents that at
+     * the |index|, |removed| sequence of items were removed, and counting forward
+     * from |index|, |addedCount| items were added.
+     */
+
+    /**
+     * Lacking individual splice mutation information, the minimal set of
+     * splices can be synthesized given the previous state and final state of an
+     * array. The basic approach is to calculate the edit distance matrix and
+     * choose the shortest path through it.
+     *
+     * Complexity: O(l * p)
+     *   l: The length of the current array
+     *   p: The length of the old array
+     */
+    calcSplices: function(current, currentStart, currentEnd,
+                          old, oldStart, oldEnd) {
+      var prefixCount = 0;
+      var suffixCount = 0;
+
+      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+      if (currentStart == 0 && oldStart == 0)
+        prefixCount = this.sharedPrefix(current, old, minLength);
+
+      if (currentEnd == current.length && oldEnd == old.length)
+        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
+
+      currentStart += prefixCount;
+      oldStart += prefixCount;
+      currentEnd -= suffixCount;
+      oldEnd -= suffixCount;
+
+      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
+        return [];
+
+      if (currentStart == currentEnd) {
+        var splice = newSplice(currentStart, [], 0);
+        while (oldStart < oldEnd)
+          splice.removed.push(old[oldStart++]);
+
+        return [ splice ];
+      } else if (oldStart == oldEnd)
+        return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+
+      var ops = this.spliceOperationsFromEditDistances(
+          this.calcEditDistances(current, currentStart, currentEnd,
+                                 old, oldStart, oldEnd));
+
+      var splice = undefined;
+      var splices = [];
+      var index = currentStart;
+      var oldIndex = oldStart;
+      for (var i = 0; i < ops.length; i++) {
+        switch(ops[i]) {
+          case EDIT_LEAVE:
+            if (splice) {
+              splices.push(splice);
+              splice = undefined;
+            }
+
+            index++;
+            oldIndex++;
+            break;
+          case EDIT_UPDATE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+          case EDIT_ADD:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+            break;
+          case EDIT_DELETE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+        }
+      }
+
+      if (splice) {
+        splices.push(splice);
+      }
+      return splices;
+    },
+
+    sharedPrefix: function(current, old, searchLength) {
+      for (var i = 0; i < searchLength; i++)
+        if (!this.equals(current[i], old[i]))
+          return i;
+      return searchLength;
+    },
+
+    sharedSuffix: function(current, old, searchLength) {
+      var index1 = current.length;
+      var index2 = old.length;
+      var count = 0;
+      while (count < searchLength && this.equals(current[--index1], old[--index2]))
+        count++;
+
+      return count;
+    },
+
+    calculateSplices: function(current, previous) {
+      return this.calcSplices(current, 0, current.length, previous, 0,
+                              previous.length);
+    },
+
+    equals: function(currentValue, previousValue) {
+      return currentValue === previousValue;
+    }
+  };
+
+  var arraySplice = new ArraySplice();
+
+  function calcSplices(current, currentStart, currentEnd,
+                       old, oldStart, oldEnd) {
+    return arraySplice.calcSplices(current, currentStart, currentEnd,
+                                   old, oldStart, oldEnd);
+  }
+
+  function intersect(start1, end1, start2, end2) {
+    // Disjoint
+    if (end1 < start2 || end2 < start1)
+      return -1;
+
+    // Adjacent
+    if (end1 == start2 || end2 == start1)
+      return 0;
+
+    // Non-zero intersect, span1 first
+    if (start1 < start2) {
+      if (end1 < end2)
+        return end1 - start2; // Overlap
+      else
+        return end2 - start2; // Contained
+    } else {
+      // Non-zero intersect, span2 first
+      if (end2 < end1)
+        return end2 - start1; // Overlap
+      else
+        return end1 - start1; // Contained
+    }
+  }
+
+  function mergeSplice(splices, index, removed, addedCount) {
+
+    var splice = newSplice(index, removed, addedCount);
+
+    var inserted = false;
+    var insertionOffset = 0;
+
+    for (var i = 0; i < splices.length; i++) {
+      var current = splices[i];
+      current.index += insertionOffset;
+
+      if (inserted)
+        continue;
+
+      var intersectCount = intersect(splice.index,
+                                     splice.index + splice.removed.length,
+                                     current.index,
+                                     current.index + current.addedCount);
+
+      if (intersectCount >= 0) {
+        // Merge the two splices
+
+        splices.splice(i, 1);
+        i--;
+
+        insertionOffset -= current.addedCount - current.removed.length;
+
+        splice.addedCount += current.addedCount - intersectCount;
+        var deleteCount = splice.removed.length +
+                          current.removed.length - intersectCount;
+
+        if (!splice.addedCount && !deleteCount) {
+          // merged splice is a noop. discard.
+          inserted = true;
+        } else {
+          var removed = current.removed;
+
+          if (splice.index < current.index) {
+            // some prefix of splice.removed is prepended to current.removed.
+            var prepend = splice.removed.slice(0, current.index - splice.index);
+            Array.prototype.push.apply(prepend, removed);
+            removed = prepend;
+          }
+
+          if (splice.index + splice.removed.length > current.index + current.addedCount) {
+            // some suffix of splice.removed is appended to current.removed.
+            var append = splice.removed.slice(current.index + current.addedCount - splice.index);
+            Array.prototype.push.apply(removed, append);
+          }
+
+          splice.removed = removed;
+          if (current.index < splice.index) {
+            splice.index = current.index;
+          }
+        }
+      } else if (splice.index < current.index) {
+        // Insert splice here.
+
+        inserted = true;
+
+        splices.splice(i, 0, splice);
+        i++;
+
+        var offset = splice.addedCount - splice.removed.length
+        current.index += offset;
+        insertionOffset += offset;
+      }
+    }
+
+    if (!inserted)
+      splices.push(splice);
+  }
+
+  function createInitialSplices(array, changeRecords) {
+    var splices = [];
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      switch(record.type) {
+        case 'splice':
+          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
+          break;
+        case 'add':
+        case 'update':
+        case 'delete':
+          if (!isIndex(record.name))
+            continue;
+          var index = toNumber(record.name);
+          if (index < 0)
+            continue;
+          mergeSplice(splices, index, [record.oldValue], 1);
+          break;
+        default:
+          console.error('Unexpected record type: ' + JSON.stringify(record));
+          break;
+      }
+    }
+
+    return splices;
+  }
+
+  function projectArraySplices(array, changeRecords) {
+    var splices = [];
+
+    createInitialSplices(array, changeRecords).forEach(function(splice) {
+      if (splice.addedCount == 1 && splice.removed.length == 1) {
+        if (splice.removed[0] !== array[splice.index])
+          splices.push(splice);
+
+        return
+      };
+
+      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,
+                                           splice.removed, 0, splice.removed.length));
+    });
+
+    return splices;
+  }
+
+  global.Observer = Observer;
+  global.Observer.runEOM_ = runEOM;
+  global.Observer.observerSentinel_ = observerSentinel; // for testing.
+  global.Observer.hasObjectObserve = hasObserve;
+  global.ArrayObserver = ArrayObserver;
+  global.ArrayObserver.calculateSplices = function(current, previous) {
+    return arraySplice.calculateSplices(current, previous);
+  };
+
+  global.ArraySplice = ArraySplice;
+  global.ObjectObserver = ObjectObserver;
+  global.PathObserver = PathObserver;
+  global.CompoundObserver = CompoundObserver;
+  global.Path = Path;
+  global.ObserverTransform = ObserverTransform;
+})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/patches_mdv.js b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/patches_mdv.js
new file mode 100644
index 0000000..0c49bfb
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/patches_mdv.js
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+(function(scope) {
+
+// inject style sheet
+var style = document.createElement('style');
+style.textContent = 'template {display: none !important;} /* injected by platform.js */';
+var head = document.querySelector('head');
+head.insertBefore(style, head.firstChild);
+
+// flush (with logging)
+var flushing;
+function flush() {
+  if (!flushing) {
+    flushing = true;
+    scope.endOfMicrotask(function() {
+      flushing = false;
+      logFlags.data && console.group('Platform.flush()');
+      scope.performMicrotaskCheckpoint();
+      logFlags.data && console.groupEnd();
+    });
+  }
+};
+
+// polling dirty checker
+// flush periodically if platform does not have object observe.
+if (!Observer.hasObjectObserve) {
+  var FLUSH_POLL_INTERVAL = 125;
+  window.addEventListener('WebComponentsReady', function() {
+    flush();
+    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
+  });
+} else {
+  // make flush a no-op when we have Object.observe
+  flush = function() {};
+}
+
+if (window.CustomElements && !CustomElements.useNative) {
+  var originalImportNode = Document.prototype.importNode;
+  Document.prototype.importNode = function(node, deep) {
+    var imported = originalImportNode.call(this, node, deep);
+    CustomElements.upgradeAll(imported);
+    return imported;
+  }
+}
+
+// exports
+scope.flush = flush;
+
+})(window.Platform);
+
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/build.log b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/build.log
index 5cf5f42..62346a0 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/build.log
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/build.log
@@ -1,12 +1,12 @@
 BUILD LOG
 ---------
-Build Time: 2014-08-28T12:39:13
+Build Time: 2014-09-10T15:36:06
 
 NODEJS INFORMATION
 ==================
 nodejs: v0.10.29
-chai: 1.9.1
 grunt: 0.4.5
+chai: 1.9.1
 grunt-audit: 0.0.3
 grunt-concat-sourcemap: 0.4.3
 grunt-contrib-concat: 0.4.0
@@ -14,23 +14,20 @@
 grunt-karma: 0.8.3
 karma: 0.12.22
 karma-crbot-reporter: 0.0.4
-karma-safari-launcher: 0.1.1
-mocha: 1.21.4
+karma-firefox-launcher: 0.1.3
 karma-ie-launcher: 0.1.5
 karma-mocha: 0.1.9
-karma-firefox-launcher: 0.1.3
+karma-safari-launcher: 0.1.1
+mocha: 1.21.4
 
 REPO REVISIONS
 ==============
-CustomElements: 65bb151f33891864b28eee305bdf299653ef351c
-HTMLImports: 0d3133d19b35d899ef3e33fbd65ad62e0571d1d5
-NodeBind: f41e84f3deb2cad22eef89ded1072060f7b1b183
-ShadowDOM: 57232dc6d07dd921009679dfbab622b52174df80
-TemplateBinding: f15094216a6b3f64a6d6b0f017b6bd7576b8b44e
-WeakMap: 6662df5cb7146707238b08e7a65cf70056ae516a
-observe-js: ca7b6ba385006f200c7ec3537c7730710e428c60
-platform-dev: fe549bc7f05ec668bc496108958eaee0bd174a06
+CustomElements: c2605585e079b042e5c0fba84bc1d25f7b530ae9
+HTMLImports: d0c8d08f23ed407288bcac385e19747a3fbeba96
+ShadowDOM: 481f9adb761c2226ccd94a35140a7d6f3830257d
+URL: 35e0e6aaab5979d277afa4822a2776a7fb7562ba
+platform-dev: 5a7353db53048b8ab4caa6279a56de7d1097d824
 
 BUILD HASHES
 ============
-build/platform.js: a15f487ef6424420af4d2e64f0f5d5740306b691
\ No newline at end of file
+build/platform.js: f590b5e657640112e98eb5d428885f429789d913
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/platform.js b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/platform.js
index c6ae161..d7e6fb8 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/platform.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/platform.js
@@ -7,11 +7,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.3.5-fe549bc
+// @version: 0.4.0-5a7353d
 
-window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){var b=a[this.name];if(!b)return!1;var c=b[0]===a;return b[0]=b[1]=void 0,c},has:function(a){var b=a[this.name];return b?b[0]===a:!1}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var testingExposeCycleCount=global.testingExposeCycleCount,hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];M(a,e,O(b,e))}return a}function e(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}M(a,e,O(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){P.value=c,M(a,b,P)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=I.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a):function(){return this.__impl4cf1e782hg__[a]}}function n(a){return L&&l(a)?new Function("v","this.__impl4cf1e782hg__."+a+" = v"):function(b){this.__impl4cf1e782hg__[a]=b}}function o(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[a].apply(this.__impl4cf1e782hg__,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return R}}function q(b,c,d){for(var e=N(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){Q&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),M(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===I.get(a)),I.set(a,b),J.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return I.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a&&a.__impl4cf1e782hg__}function x(a){return!w(a)}function y(a){return null===a?null:(c(x(a)),a.__wrapper8e3dd93a60__||(a.__wrapper8e3dd93a60__=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.__impl4cf1e782hg__)}function A(a){return a.__impl4cf1e782hg__}function B(a,b){b.__impl4cf1e782hg__=a,a.__wrapper8e3dd93a60__=b}function C(a){return a&&w(a)?z(a):a}function D(a){return a&&!w(a)?y(a):a}function E(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.__wrapper8e3dd93a60__=b)}function F(a,b,c){S.get=c,M(a.prototype,b,S)}function G(a,b){F(a,b,function(){return y(this.__impl4cf1e782hg__[b])})}function H(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=D(this);return a[b].apply(a,arguments)}})})}var I=new WeakMap,J=new WeakMap,K=Object.create(null),L=b(),M=Object.defineProperty,N=Object.getOwnPropertyNames,O=Object.getOwnPropertyDescriptor,P={value:void 0,configurable:!0,enumerable:!1,writable:!0};N(window);var Q=/Firefox/.test(navigator.userAgent),R={get:function(){},set:function(){},configurable:!0,enumerable:!0},S={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=I,a.defineGetter=F,a.defineWrapGetter=G,a.forwardMethodsToWrapper=H,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=J,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=E,a.setWrapper=B,a.unsafeUnwrap=A,a.unwrap=z,a.unwrapIfNeeded=C,a.wrap=y,a.wrapIfNeeded=D,a.wrappers=K}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){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={constructor:i,observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof S.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof S.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof S.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!U.get(a)&&(U.set(a,!0),n(R(a),R(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(V.get(b))throw new Error("InvalidStateError");V.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof S.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof S.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof S.Document&&(g=i.defaultView)}return bb.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),Z.set(b,cb),X.delete(b,null),V.delete(b),b.defaultPrevented
-}function o(a,b,c,d){var e=db;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=eb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=fb,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=T.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===db)return!0;c===fb&&(c=eb)}else if(c===fb&&!b.bubbles)return!0;if("relatedTarget"in b){var i=Q(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=R(j),m=k(b,a,l);if(m===g)return!0}else m=null;Y.set(b,m)}}Z.set(b,c);var n=b.type,o=!1;W.set(b,g),X.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===db||r.capture&&c===fb))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),_.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!$.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof gb))return R(x(gb,"Event",a,b));var c=a;return rb||"beforeunload"!==c.type?void O(c,this):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:Q(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void O(b,this):R(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=Q(arguments[b]);var c=Q(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(pb)return new a(c,u(d));var e=Q(document.createEvent(b)),f=ob[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=Q(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){O(a,this)}function C(a){return a instanceof S.ShadowRoot&&(a=a.host),Q(a)}function D(a,b){var c=T.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=Q(a);c;c=c.parentNode)if(D(R(c),b))return!0;return!1}function F(a){K(a,tb)}function G(b,c,e,f){a.renderAllPending();var g=R(ub.call(P(c),e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=ab.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=ab.get(this);d||(d=Object.create(null),ab.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.setWrapper,P=a.unsafeUnwrap,Q=a.unwrap,R=a.wrap,S=a.wrappers,T=(new WeakMap,new WeakMap),U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=new WeakMap,bb=new WeakMap,cb=0,db=1,eb=2,fb=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var gb=window.Event;gb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return W.get(this)},get currentTarget(){return X.get(this)},get eventPhase(){return Z.get(this)},get path(){var a=bb.get(this);return a?a.slice():[]},stopPropagation:function(){$.set(this,!0)},stopImmediatePropagation:function(){$.set(this,!0),_.set(this,!0)}},N(gb,t,document.createEvent("Event"));var hb=v("UIEvent",t),ib=v("CustomEvent",t),jb={get relatedTarget(){var a=Y.get(this);return void 0!==a?a:R(Q(this).relatedTarget)}},kb=M({initMouseEvent:w("initMouseEvent",14)},jb),lb=M({initFocusEvent:w("initFocusEvent",5)},jb),mb=v("MouseEvent",hb,kb),nb=v("FocusEvent",hb,lb),ob=Object.create(null),pb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!pb){var qb=function(a,b,c){if(c){var d=ob[c];b=M(M({},d),b)}ob[a]=b};qb("Event",{bubbles:!1,cancelable:!1}),qb("CustomEvent",{detail:null},"Event"),qb("UIEvent",{view:null,detail:0},"Event"),qb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),qb("FocusEvent",{relatedTarget:null},"UIEvent")}var rb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return P(this).returnValue},set returnValue(a){P(this).returnValue=a}}),rb&&N(rb,y);var sb=window.EventTarget,tb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;tb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=T.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,T.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=T.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=Q(b),d=c.type;U.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return Q(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},sb&&N(sb,B);var ub=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=ib,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=nb,a.wrappers.MouseEvent=mb,a.wrappers.UIEvent=hb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,p)}function c(a){j(a,this)}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.setWrapper,k=a.unsafeUnwrap,l=a.wrap,m=window.TouchEvent;if(m){var n;try{n=document.createEvent("TouchEvent")}catch(o){return}var p={enumerable:!1};c.prototype={get target(){return l(k(this).target)}};var q={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){q.get=function(){return k(this)[a]},Object.defineProperty(c.prototype,a,q)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(k(this).touches)},get targetTouches(){return e(k(this).targetTouches)},get changedTouches(){return e(k(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(m,f,n),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,h)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=g(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(f(this)[b].apply(f(this),arguments))}}var f=a.unsafeUnwrap,g=a.wrap,h={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);P=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;P=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return K(b[0]);for(var d=K(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(K(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=K(b),e=d.parentNode;e&&W.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=K(a),g=f.firstChild;g;)c=g.nextSibling,W.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=M(c?Q.call(c,J(a),!1):R.call(J(a),!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof O.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof S),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unsafeUnwrap,K=a.unwrap,L=a.unwrapIfNeeded,M=a.wrap,N=a.wrapIfNeeded,O=a.wrappers,P=!1,Q=document.importNode,R=window.Node.prototype.cloneNode,S=window.Node,T=window.DocumentFragment,U=(S.prototype.appendChild,S.prototype.compareDocumentPosition),V=S.prototype.insertBefore,W=S.prototype.removeChild,X=S.prototype.replaceChild,Y=/Trident/.test(navigator.userAgent),Z=Y?function(a,b){try{W.call(a,b)}catch(c){if(!(a instanceof T))throw c}}:function(a,b){W.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=K(c):(d=c,c=M(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),V.call(J(this),K(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:J(this);j?V.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=K(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Z(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Z(J(this),f);return P||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=K(d):(e=d,d=M(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),X.call(J(this),K(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&X.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:M(J(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:M(J(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:M(J(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:M(J(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:M(J(this).previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=J(this).ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),J(this).textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,N(a))},compareDocumentPosition:function(a){return U.call(J(this),L(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(S,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c,d,e){for(var f=null,g=null,h=0,i=b.length;i>h;h++)f=s(b[h]),!e&&(g=q(f).root)&&g instanceof a.wrappers.ShadowRoot||(d[c++]=f);return c}function c(a){return String(a).replace(/\/deep\//g," ")}function d(a,b){for(var c,e=a.firstElementChild;e;){if(e.matches(b))return e;if(c=d(e,b))return c;e=e.nextElementSibling}return null}function e(a,b){return a.matches(b)}function f(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===D}function g(){return!0}function h(a,b,c){return a.localName===c}function i(a,b){return a.namespaceURI===b}function j(a,b,c){return a.namespaceURI===b&&a.localName===c}function k(a,b,c,d,e,f){for(var g=a.firstElementChild;g;)d(g,e,f)&&(c[b++]=g),b=k(g,b,c,d,e,f),g=g.nextElementSibling;return b}function l(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,null);if(i instanceof B)h=w.call(i,f);else{if(!(i instanceof C))return k(this,d,e,c,f,null);h=v.call(i,f)}return b(h,d,e,g)}function m(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=y.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=x.call(i,f,g)}return b(h,d,e,!1)}function n(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=A.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=z.call(i,f,g)}return b(h,d,e,!1)}var o=a.wrappers.HTMLCollection,p=a.wrappers.NodeList,q=a.getTreeScope,r=a.unsafeUnwrap,s=a.wrap,t=document.querySelector,u=document.documentElement.querySelector,v=document.querySelectorAll,w=document.documentElement.querySelectorAll,x=document.getElementsByTagName,y=document.documentElement.getElementsByTagName,z=document.getElementsByTagNameNS,A=document.documentElement.getElementsByTagNameNS,B=window.Element,C=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",E={querySelector:function(b){var e=c(b),f=e!==b;b=e;var g,h=r(this),i=q(this).root;if(i instanceof a.wrappers.ShadowRoot)return d(this,b);if(h instanceof B)g=s(u.call(h,b));else{if(!(h instanceof C))return d(this,b);g=s(t.call(h,b))}return g&&!f&&(i=q(g).root)&&i instanceof a.wrappers.ShadowRoot?d(this,b):g},querySelectorAll:function(a){var b=c(a),d=b!==a;a=b;var f=new p;return f.length=l.call(this,e,0,f,a,d),f}},F={getElementsByTagName:function(a){var b=new o,c="*"===a?g:f;return b.length=m.call(this,c,0,b,a,a.toLowerCase()),b},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new o,d=null;return d="*"===a?"*"===b?g:h:"*"===b?i:j,c.length=n.call(this,d,0,c,a||null,b),c}};a.GetElementsByInterface=F,a.SelectorsInterface=E}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return h(this).data},set data(a){var b=h(this).data;e(this,"characterData",{oldValue:b}),h(this).data=a}}),f(b.prototype,c),g(i,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){d(a,this),this.ownerElement_=b}var d=a.setWrapper,e=a.unsafeUnwrap;c.prototype={constructor:c,get length(){return e(this).length},item:function(a){return e(this).item(a)},contains:function(a){return e(this).contains(a)},add:function(){e(this).add.apply(e(this),arguments),b(this.ownerElement_)},remove:function(){e(this).remove.apply(e(this),arguments),b(this.ownerElement_)},toggle:function(){var a=e(this).toggle.apply(e(this),arguments);return b(this.ownerElement_),a},toString:function(){return e(this).toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unsafeUnwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);n(this).polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return n(this).polymerShadowRoot_||null},setAttribute:function(a,d){var e=n(this).getAttribute(a);n(this).setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=n(this).getAttribute(a);n(this).removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(n(this),a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(A,b)}function d(a){return a.replace(B,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",C[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&D[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof z.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=x(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(y(f))}function i(a){o.call(this,a)}function j(a,b){var c=x(a.cloneNode(!1));c.innerHTML=b;for(var d,e=x(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return y(e)}function k(b){return function(){return a.renderAllPending(),w(this)[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),w(this)[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),w(this)[b].apply(w(this),arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unsafeUnwrap,x=a.unwrap,y=a.wrap,z=a.wrappers,A=/[&\u00A0"]/g,B=/[&\u00A0<>]/g,C=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),E=/MSIE/.test(navigator.userAgent),F=window.HTMLElement,G=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(E&&D[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof z.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!G&&this instanceof z.HTMLTemplateElement?h(this.content,a):w(this).innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)},get hidden(){return this.hasAttribute("hidden")},set hidden(a){a?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(F,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=f(this).getContext.apply(f(this),arguments);return a&&g(a)}}),e(h,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),b.prototype.constructor=b,e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=i(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!m){var b=c(a);k.set(this,j(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=a.unwrap,j=a.wrap,k=new WeakMap,l=new WeakMap,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{constructor:d,get content(){return m?j(h(this).content):k.get(this)}}),m&&g(m,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;e&&(b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;h&&(b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())
-},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.SVGElementInstance;h&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return g(f(this).correspondingElement)},get correspondingUseElement(){return g(f(this).correspondingUseElement)},get parentNode(){return g(f(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return g(f(this).firstChild)},get lastChild(){return g(f(this).lastChild)},get previousSibling(){return g(f(this).previousSibling)},get nextSibling(){return g(f(this).nextSibling)}}),e(h,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrap,h=a.unwrapIfNeeded,i=a.wrap,j=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return i(f(this).canvas)},drawImage:function(){arguments[0]=h(arguments[0]),f(this).drawImage.apply(f(this),arguments)},createPattern:function(){return arguments[0]=g(arguments[0]),f(this).createPattern.apply(f(this),arguments)}}),d(j,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.WebGLRenderingContext;if(i){c(b.prototype,{get canvas(){return h(f(this).canvas)},texImage2D:function(){arguments[5]=g(arguments[5]),f(this).texImage2D.apply(f(this),arguments)},texSubImage2D:function(){arguments[6]=g(arguments[6]),f(this).texSubImage2D.apply(f(this),arguments)}});var j=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(i,b,j),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Range;b.prototype={get startContainer(){return h(e(this).startContainer)},get endContainer(){return h(e(this).endContainer)},get commonAncestorContainer(){return h(e(this).commonAncestorContainer)},setStart:function(a,b){e(this).setStart(g(a),b)},setEnd:function(a,b){e(this).setEnd(g(a),b)},setStartBefore:function(a){e(this).setStartBefore(g(a))},setStartAfter:function(a){e(this).setStartAfter(g(a))},setEndBefore:function(a){e(this).setEndBefore(g(a))},setEndAfter:function(a){e(this).setEndAfter(g(a))},selectNode:function(a){e(this).selectNode(g(a))},selectNodeContents:function(a){e(this).selectNodeContents(g(a))},compareBoundaryPoints:function(a,b){return e(this).compareBoundaryPoints(a,f(b))},extractContents:function(){return h(e(this).extractContents())},cloneContents:function(){return h(e(this).cloneContents())},insertNode:function(a){e(this).insertNode(g(a))},surroundContents:function(a){e(this).surroundContents(g(a))},cloneRange:function(){return h(e(this).cloneRange())},isPointInRange:function(a,b){return e(this).isPointInRange(g(a),b)},comparePoint:function(a,b){return e(this).comparePoint(g(a),b)},intersectsNode:function(a){return e(this).intersectsNode(g(a))},toString:function(){return e(this).toString()}},i.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return h(e(this).createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=l(k(a).ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;n.set(this,e),this.treeScope_=new d(this,g(e||a)),m.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unsafeUnwrap,l=a.unwrap,m=new WeakMap,n=new WeakMap,o=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{constructor:b,get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return n.get(this)||null},get host(){return m.get(this)||null},invalidateShadowRenderer:function(){return m.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return o.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=H(a),g=H(c),h=e?H(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=I(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=H(a),d=c.parentNode;if(d){var e=I(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){J.set(a,[])}function f(a){var b=J.get(a);return b||J.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<N.length;a++){var b=N[a],c=b.parentRenderer;c&&c.dirty||b.render()}N=[]}function i(){y=null,h()}function j(a){var b=L.get(a);return b||(b=new n(a),L.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=K.get(a);c?c.push(b):K.set(a,[b])}function r(a){return K.get(a)}function s(a){K.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!P.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unsafeUnwrap,H=a.unwrap,I=a.wrap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),N=[],O=new ArraySplice;O.equals=function(a,b){return H(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(H(b)),h=a||new WeakMap,i=O.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=I(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&I(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var a=this.parentRenderer;if(a&&a.invalidate(),N.push(this),y)return;y=window[M](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){G(a).polymerShadowRenderer_=this}};var P=/^(:not\()?[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=G(this).polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),G(this).polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}{var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap;window.Selection}b.prototype={get anchorNode(){return h(e(this).anchorNode)},get focusNode(){return h(e(this).focusNode)},addRange:function(a){e(this).addRange(f(a))},collapse:function(a,b){e(this).collapse(g(a),b)},containsNode:function(a,b){return e(this).containsNode(g(a),b)},extend:function(a,b){e(this).extend(g(a),b)},getRangeAt:function(a){return h(e(this).getRangeAt(a))},removeRange:function(a){e(this).removeRange(f(a))},selectAllChildren:function(a){e(this).selectAllChildren(g(a))},toString:function(){return e(this).toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return C(c.apply(A(this),arguments))}}function d(a,b){F.call(A(b),B(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){z(a,this)}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return C(c.apply(A(this),arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(A(this),arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.setWrapper,A=a.unsafeUnwrap,B=a.unwrap,C=a.wrap,D=a.wrapEventTargetMethods,E=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var F=document.adoptNode,G=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,A(this))},getSelection:function(){return x(),new m(G.call(B(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var H=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void z(a,this):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){C(this)instanceof d||y(this),b.apply(C(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);H.call(B(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=E.get(this);return a?a:(a=new g(B(this).implementation),E.set(this,a),a)},get defaultView(){return C(B(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getDefaultComputedStyle,n=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},m&&(k.prototype.getDefaultComputedStyle=function(a,b){return j(this||window).getDefaultComputedStyle(i(a),b)}),k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(n.call(h(this)))},get document(){return j(h(this).document)}}),m&&(b.prototype.getDefaultComputedStyle=function(a,b){return g(),m.call(h(this),i(a),b)}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b;b=a instanceof f?a:new f(a&&e(a)),d(b,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unwrap,f=window.FormData;c(f,b,new f),a.wrappers.FormData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=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.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b<shadowDOMSelectorsRe.length;b++)a=a.replace(shadowDOMSelectorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){}},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]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){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):this.addElementToDocument(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"))}};var r=a.URL;r&&(i.createObjectURL=function(){return r.createObjectURL.apply(r,arguments)},i.revokeObjectURL=function(a){r.revokeObjectURL(a)}),a.URL=i}}(this),function(a){function b(a){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){function b(a,b){b=b||o,d(function(){e(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a,b){function c(){g==h&&a&&a()}function d(){g++,c()}var e=b.querySelectorAll("link[rel=import]"),g=0,h=e.length;if(h)for(var i,j=0;h>j&&(i=e[j]);j++)f(i)?d.call(i):(i.addEventListener("load",d),i.addEventListener("error",d));else c()}function f(a){return l?a.__loaded:a.__importParsed}function g(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)h(b)&&i(b)}function h(a){return"link"===a.localName&&"import"===a.rel}function i(a){var b=a.import;b?j({target:a}):(a.addEventListener("load",j),a.addEventListener("error",j))}function j(a){a.target.__loaded=!0}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&g(b.addedNodes)}).observe(document.head,{childList:!0}),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=f,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;for(var f,g=this.pending[a],h=0,i=g.length;i>h&&(f=g[h]);h++)this.onload(a,f,d,c,e),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:a;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b=d(a);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(b)}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=a.isIE,j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import&&(a.import.__importParsed=!0),this.markParsingComplete(a),a.dispatchEvent(a.__resource&&!a.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),this.addElementToDocument(a)},rootImportForElement:function(a){for(var b=a;b.ownerDocument.__importLink;)b=b.ownerDocument.__importLink;return b},addElementToDocument:function(a){for(var b=this.rootImportForElement(a.__importElement||a),c=b.__insertedElements=b.__insertedElements||0,d=b.nextElementSibling,e=0;c>e;e++)d=d&&d.nextElementSibling;b.parentNode.insertBefore(a,d)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),this.addElementToDocument(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){if(a)for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&void 0===a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n}(HTMLImports),function(a){function b(a){return c(a,g)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(g)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}var e=a.useNative,f=a.flags,g="import",h=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(e)var i={};else{var j=(a.xhr,a.Loader),k=a.parser,i={documents:{},documentPreloadSelectors:"link[rel="+g+"]",importsPreloadSelectors:["link[rel="+g+"]"].join(","),loadNode:function(a){l.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);l.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===h?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e,g,h){if(f.load&&console.log("loaded",a,c),c.__resource=e,c.__error=g,b(c)){var i=this.documents[a];void 0===i&&(i=g?null:d(e,h||a),i&&(i.__importLink=c,this.bootDocument(i)),this.documents[a]=i),c.import=i}k.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),k.parseNext()},loadedAll:function(){k.parseNext()}},l=new j(i.loaded.bind(i),i.loadedAll.bind(i));if(!document.baseURI){var m={get:function(){var a=document.querySelector("base");return a?a.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",m),Object.defineProperty(h,"baseURI",m)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c})}a.importer=i,a.IMPORT_LINK_TYPE=g,a.importLoader=l}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;
-for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)}),CustomElements.ready=!0,setTimeout(function(){CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,Boolean(b.bubbles),Boolean(b.cancelable),b.detail),c},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(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(this.iterator_.getUpdatedValue()))},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_,e=!0;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),e=c.ifValue,c.ifOneTime&&!e)return void this.valueChanged();c.ifOneTime||(e=e.open(this.updateIfValue,this))}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b));var f=c.value;return c.oneTime||(f=f.open(this.updateIteratedValue,this)),e?void this.updateValue(f):void this.valueChanged()},getUpdatedValue:function(){var a=this.deps.value;return this.deps.oneTime||(a=a.discardChanges()),a},updateIfValue:function(a){return a?void this.updateValue(this.getUpdatedValue()):void this.valueChanged()},updateIteratedValue:function(a){if(this.deps.hasIf){var b=this.deps.ifValue;if(this.deps.ifOneTime||(b=b.discardChanges()),!b)return void this.valueChanged()}this.updateValue(a)},updateValue:function(a){this.deps.repeat||(a=[a]);var b=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(a);this.valueChanged(a,b)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){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){var b=a[this.name];if(!b)return!1;var c=b[0]===a;return b[0]=b[1]=void 0,c},has:function(a){var b=a[this.name];return b?b[0]===a:!1}},window.WeakMap=c}(),Platform.flags.shadow?(!function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var testingExposeCycleCount=global.testingExposeCycleCount,hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];M(a,e,O(b,e))}return a}function e(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}M(a,e,O(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){P.value=c,M(a,b,P)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=I.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a):function(){return this.__impl4cf1e782hg__[a]}}function n(a){return L&&l(a)?new Function("v","this.__impl4cf1e782hg__."+a+" = v"):function(b){this.__impl4cf1e782hg__[a]=b}}function o(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[a].apply(this.__impl4cf1e782hg__,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return R}}function q(b,c,d){for(var e=N(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){Q&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),M(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===I.get(a)),I.set(a,b),J.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return I.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a&&a.__impl4cf1e782hg__}function x(a){return!w(a)}function y(a){return null===a?null:(c(x(a)),a.__wrapper8e3dd93a60__||(a.__wrapper8e3dd93a60__=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.__impl4cf1e782hg__)}function A(a){return a.__impl4cf1e782hg__}function B(a,b){b.__impl4cf1e782hg__=a,a.__wrapper8e3dd93a60__=b}function C(a){return a&&w(a)?z(a):a}function D(a){return a&&!w(a)?y(a):a}function E(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.__wrapper8e3dd93a60__=b)}function F(a,b,c){S.get=c,M(a.prototype,b,S)}function G(a,b){F(a,b,function(){return y(this.__impl4cf1e782hg__[b])})}function H(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=D(this);return a[b].apply(a,arguments)}})})}var I=new WeakMap,J=new WeakMap,K=Object.create(null),L=b(),M=Object.defineProperty,N=Object.getOwnPropertyNames,O=Object.getOwnPropertyDescriptor,P={value:void 0,configurable:!0,enumerable:!1,writable:!0};N(window);var Q=/Firefox/.test(navigator.userAgent),R={get:function(){},set:function(){},configurable:!0,enumerable:!0},S={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=I,a.defineGetter=F,a.defineWrapGetter=G,a.forwardMethodsToWrapper=H,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=J,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=E,a.setWrapper=B,a.unsafeUnwrap=A,a.unwrap=z,a.unwrapIfNeeded=C,a.wrap=y,a.wrapIfNeeded=D,a.wrappers=K}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){for(p=!1;o.length;){var a=o;o=[],a.sort(function(a,b){return a.uid_-b.uid_});for(var b=0;b<a.length;b++){var c=a[b],d=c.takeRecords();f(c),d.length&&c.callback_(d,c)}}}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var p=!1;for(var q in f){var m=f[q],r=new d(c,a);"name"in e&&"namespace"in e&&(r.attributeName=e.name,r.attributeNamespace=e.namespace),e.addedNodes&&(r.addedNodes=e.addedNodes),e.removedNodes&&(r.removedNodes=e.removedNodes),e.previousSibling&&(r.previousSibling=e.previousSibling),e.nextSibling&&(r.nextSibling=e.nextSibling),void 0!==g[q]&&(r.oldValue=g[q]),m.records_.length||(o.push(m),p=!0),m.records_.push(r)}p&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={constructor:i,observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof S.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof S.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof S.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!U.get(a)&&(U.set(a,!0),n(R(a),R(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(V.get(b))throw new Error("InvalidStateError");V.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof S.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof S.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];
+i instanceof S.Document&&(g=i.defaultView)}return bb.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),Z.set(b,cb),X.delete(b,null),V.delete(b),b.defaultPrevented}function o(a,b,c,d){var e=db;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=eb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=fb,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=T.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===db)return!0;c===fb&&(c=eb)}else if(c===fb&&!b.bubbles)return!0;if("relatedTarget"in b){var i=Q(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=R(j),m=k(b,a,l);if(m===g)return!0}else m=null;Y.set(b,m)}}Z.set(b,c);var n=b.type,o=!1;W.set(b,g),X.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===db||r.capture&&c===fb))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),_.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!$.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof gb))return R(x(gb,"Event",a,b));var c=a;return rb||"beforeunload"!==c.type?void O(c,this):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:Q(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void O(b,this):R(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=Q(arguments[b]);var c=Q(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(pb)return new a(c,u(d));var e=Q(document.createEvent(b)),f=ob[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=Q(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){O(a,this)}function C(a){return a instanceof S.ShadowRoot&&(a=a.host),Q(a)}function D(a,b){var c=T.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=Q(a);c;c=c.parentNode)if(D(R(c),b))return!0;return!1}function F(a){K(a,tb)}function G(b,c,e,f){a.renderAllPending();var g=R(ub.call(P(c),e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=ab.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=ab.get(this);d||(d=Object.create(null),ab.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.setWrapper,P=a.unsafeUnwrap,Q=a.unwrap,R=a.wrap,S=a.wrappers,T=(new WeakMap,new WeakMap),U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=new WeakMap,bb=new WeakMap,cb=0,db=1,eb=2,fb=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var gb=window.Event;gb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return W.get(this)},get currentTarget(){return X.get(this)},get eventPhase(){return Z.get(this)},get path(){var a=bb.get(this);return a?a.slice():[]},stopPropagation:function(){$.set(this,!0)},stopImmediatePropagation:function(){$.set(this,!0),_.set(this,!0)}},N(gb,t,document.createEvent("Event"));var hb=v("UIEvent",t),ib=v("CustomEvent",t),jb={get relatedTarget(){var a=Y.get(this);return void 0!==a?a:R(Q(this).relatedTarget)}},kb=M({initMouseEvent:w("initMouseEvent",14)},jb),lb=M({initFocusEvent:w("initFocusEvent",5)},jb),mb=v("MouseEvent",hb,kb),nb=v("FocusEvent",hb,lb),ob=Object.create(null),pb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!pb){var qb=function(a,b,c){if(c){var d=ob[c];b=M(M({},d),b)}ob[a]=b};qb("Event",{bubbles:!1,cancelable:!1}),qb("CustomEvent",{detail:null},"Event"),qb("UIEvent",{view:null,detail:0},"Event"),qb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),qb("FocusEvent",{relatedTarget:null},"UIEvent")}var rb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return P(this).returnValue},set returnValue(a){P(this).returnValue=a}}),rb&&N(rb,y);var sb=window.EventTarget,tb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;tb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=T.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,T.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=T.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=Q(b),d=c.type;U.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return Q(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},sb&&N(sb,B);var ub=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=ib,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=nb,a.wrappers.MouseEvent=mb,a.wrappers.UIEvent=hb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,p)}function c(a){j(a,this)}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.setWrapper,k=a.unsafeUnwrap,l=a.wrap,m=window.TouchEvent;if(m){var n;try{n=document.createEvent("TouchEvent")}catch(o){return}var p={enumerable:!1};c.prototype={get target(){return l(k(this).target)}};var q={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){q.get=function(){return k(this)[a]},Object.defineProperty(c.prototype,a,q)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(k(this).touches)},get targetTouches(){return e(k(this).targetTouches)},get changedTouches(){return e(k(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(m,f,n),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,h)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=g(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(f(this)[b].apply(f(this),arguments))}}var f=a.unsafeUnwrap,g=a.wrap,h={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);P=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;P=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return K(b[0]);for(var d=K(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(K(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=K(b),e=d.parentNode;e&&W.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=K(a),g=f.firstChild;g;)c=g.nextSibling,W.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=M(c?Q.call(c,J(a),!1):R.call(J(a),!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof O.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof S),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unsafeUnwrap,K=a.unwrap,L=a.unwrapIfNeeded,M=a.wrap,N=a.wrapIfNeeded,O=a.wrappers,P=!1,Q=document.importNode,R=window.Node.prototype.cloneNode,S=window.Node,T=window.DocumentFragment,U=(S.prototype.appendChild,S.prototype.compareDocumentPosition),V=S.prototype.insertBefore,W=S.prototype.removeChild,X=S.prototype.replaceChild,Y=/Trident/.test(navigator.userAgent),Z=Y?function(a,b){try{W.call(a,b)}catch(c){if(!(a instanceof T))throw c}}:function(a,b){W.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=K(c):(d=c,c=M(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),V.call(J(this),K(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:J(this);j?V.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=K(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Z(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Z(J(this),f);return P||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=K(d):(e=d,d=M(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),X.call(J(this),K(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&X.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:M(J(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:M(J(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:M(J(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:M(J(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:M(J(this).previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=J(this).ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),J(this).textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,N(a))},compareDocumentPosition:function(a){return U.call(J(this),L(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(S,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c,d,e){for(var f=null,g=null,h=0,i=b.length;i>h;h++)f=s(b[h]),!e&&(g=q(f).root)&&g instanceof a.wrappers.ShadowRoot||(d[c++]=f);return c}function c(a){return String(a).replace(/\/deep\//g," ")}function d(a,b){for(var c,e=a.firstElementChild;e;){if(e.matches(b))return e;if(c=d(e,b))return c;e=e.nextElementSibling}return null}function e(a,b){return a.matches(b)}function f(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===D}function g(){return!0}function h(a,b,c){return a.localName===c}function i(a,b){return a.namespaceURI===b}function j(a,b,c){return a.namespaceURI===b&&a.localName===c}function k(a,b,c,d,e,f){for(var g=a.firstElementChild;g;)d(g,e,f)&&(c[b++]=g),b=k(g,b,c,d,e,f),g=g.nextElementSibling;return b}function l(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,null);if(i instanceof B)h=w.call(i,f);else{if(!(i instanceof C))return k(this,d,e,c,f,null);h=v.call(i,f)}return b(h,d,e,g)}function m(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=y.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=x.call(i,f,g)}return b(h,d,e,!1)}function n(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=A.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=z.call(i,f,g)}return b(h,d,e,!1)}var o=a.wrappers.HTMLCollection,p=a.wrappers.NodeList,q=a.getTreeScope,r=a.unsafeUnwrap,s=a.wrap,t=document.querySelector,u=document.documentElement.querySelector,v=document.querySelectorAll,w=document.documentElement.querySelectorAll,x=document.getElementsByTagName,y=document.documentElement.getElementsByTagName,z=document.getElementsByTagNameNS,A=document.documentElement.getElementsByTagNameNS,B=window.Element,C=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",E={querySelector:function(b){var e=c(b),f=e!==b;b=e;var g,h=r(this),i=q(this).root;if(i instanceof a.wrappers.ShadowRoot)return d(this,b);if(h instanceof B)g=s(u.call(h,b));else{if(!(h instanceof C))return d(this,b);g=s(t.call(h,b))}return g&&!f&&(i=q(g).root)&&i instanceof a.wrappers.ShadowRoot?d(this,b):g},querySelectorAll:function(a){var b=c(a),d=b!==a;a=b;var f=new p;return f.length=l.call(this,e,0,f,a,d),f}},F={getElementsByTagName:function(a){var b=new o,c="*"===a?g:f;return b.length=m.call(this,c,0,b,a,a.toLowerCase()),b},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new o,d=null;return d="*"===a?"*"===b?g:h:"*"===b?i:j,c.length=n.call(this,d,0,c,a||null,b),c}};a.GetElementsByInterface=F,a.SelectorsInterface=E}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return h(this).data},set data(a){var b=h(this).data;e(this,"characterData",{oldValue:b}),h(this).data=a}}),f(b.prototype,c),g(i,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){d(a,this),this.ownerElement_=b}var d=a.setWrapper,e=a.unsafeUnwrap;c.prototype={constructor:c,get length(){return e(this).length},item:function(a){return e(this).item(a)},contains:function(a){return e(this).contains(a)},add:function(){e(this).add.apply(e(this),arguments),b(this.ownerElement_)},remove:function(){e(this).remove.apply(e(this),arguments),b(this.ownerElement_)},toggle:function(){var a=e(this).toggle.apply(e(this),arguments);return b(this.ownerElement_),a},toString:function(){return e(this).toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unsafeUnwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);n(this).polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return n(this).polymerShadowRoot_||null},setAttribute:function(a,d){var e=n(this).getAttribute(a);n(this).setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=n(this).getAttribute(a);n(this).removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(n(this),a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(A,b)}function d(a){return a.replace(B,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",C[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&D[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof z.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=x(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(y(f))}function i(a){o.call(this,a)}function j(a,b){var c=x(a.cloneNode(!1));c.innerHTML=b;for(var d,e=x(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return y(e)}function k(b){return function(){return a.renderAllPending(),w(this)[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),w(this)[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),w(this)[b].apply(w(this),arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unsafeUnwrap,x=a.unwrap,y=a.wrap,z=a.wrappers,A=/[&\u00A0"]/g,B=/[&\u00A0<>]/g,C=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),E=/MSIE/.test(navigator.userAgent),F=window.HTMLElement,G=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(E&&D[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof z.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!G&&this instanceof z.HTMLTemplateElement?h(this.content,a):w(this).innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)},get hidden(){return this.hasAttribute("hidden")},set hidden(a){a?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(F,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=f(this).getContext.apply(f(this),arguments);return a&&g(a)}}),e(h,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),b.prototype.constructor=b,e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=i(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!m){var b=c(a);k.set(this,j(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=a.unwrap,j=a.wrap,k=new WeakMap,l=new WeakMap,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{constructor:d,get content(){return m?j(h(this).content):k.get(this)}}),m&&g(m,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;e&&(b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;h&&(b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())
+},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.SVGElementInstance;h&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return g(f(this).correspondingElement)},get correspondingUseElement(){return g(f(this).correspondingUseElement)},get parentNode(){return g(f(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return g(f(this).firstChild)},get lastChild(){return g(f(this).lastChild)},get previousSibling(){return g(f(this).previousSibling)},get nextSibling(){return g(f(this).nextSibling)}}),e(h,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrap,h=a.unwrapIfNeeded,i=a.wrap,j=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return i(f(this).canvas)},drawImage:function(){arguments[0]=h(arguments[0]),f(this).drawImage.apply(f(this),arguments)},createPattern:function(){return arguments[0]=g(arguments[0]),f(this).createPattern.apply(f(this),arguments)}}),d(j,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.WebGLRenderingContext;if(i){c(b.prototype,{get canvas(){return h(f(this).canvas)},texImage2D:function(){arguments[5]=g(arguments[5]),f(this).texImage2D.apply(f(this),arguments)},texSubImage2D:function(){arguments[6]=g(arguments[6]),f(this).texSubImage2D.apply(f(this),arguments)}});var j=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(i,b,j),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Range;b.prototype={get startContainer(){return h(e(this).startContainer)},get endContainer(){return h(e(this).endContainer)},get commonAncestorContainer(){return h(e(this).commonAncestorContainer)},setStart:function(a,b){e(this).setStart(g(a),b)},setEnd:function(a,b){e(this).setEnd(g(a),b)},setStartBefore:function(a){e(this).setStartBefore(g(a))},setStartAfter:function(a){e(this).setStartAfter(g(a))},setEndBefore:function(a){e(this).setEndBefore(g(a))},setEndAfter:function(a){e(this).setEndAfter(g(a))},selectNode:function(a){e(this).selectNode(g(a))},selectNodeContents:function(a){e(this).selectNodeContents(g(a))},compareBoundaryPoints:function(a,b){return e(this).compareBoundaryPoints(a,f(b))},extractContents:function(){return h(e(this).extractContents())},cloneContents:function(){return h(e(this).cloneContents())},insertNode:function(a){e(this).insertNode(g(a))},surroundContents:function(a){e(this).surroundContents(g(a))},cloneRange:function(){return h(e(this).cloneRange())},isPointInRange:function(a,b){return e(this).isPointInRange(g(a),b)},comparePoint:function(a,b){return e(this).comparePoint(g(a),b)},intersectsNode:function(a){return e(this).intersectsNode(g(a))},toString:function(){return e(this).toString()}},i.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return h(e(this).createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=l(k(a).ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;n.set(this,e),this.treeScope_=new d(this,g(e||a)),m.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unsafeUnwrap,l=a.unwrap,m=new WeakMap,n=new WeakMap,o=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{constructor:b,get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return n.get(this)||null},get host(){return m.get(this)||null},invalidateShadowRenderer:function(){return m.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return o.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=H(a),g=H(c),h=e?H(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=I(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=H(a),d=c.parentNode;if(d){var e=I(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){J.set(a,[])}function f(a){var b=J.get(a);return b||J.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<N.length;a++){var b=N[a],c=b.parentRenderer;c&&c.dirty||b.render()}N=[]}function i(){y=null,h()}function j(a){var b=L.get(a);return b||(b=new n(a),L.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=K.get(a);c?c.push(b):K.set(a,[b])}function r(a){return K.get(a)}function s(a){K.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!P.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unsafeUnwrap,H=a.unwrap,I=a.wrap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),N=[],O=new ArraySplice;O.equals=function(a,b){return H(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(H(b)),h=a||new WeakMap,i=O.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=I(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&I(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var a=this.parentRenderer;if(a&&a.invalidate(),N.push(this),y)return;y=window[M](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){G(a).polymerShadowRenderer_=this}};var P=/^(:not\()?[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=G(this).polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),G(this).polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}{var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap;window.Selection}b.prototype={get anchorNode(){return h(e(this).anchorNode)},get focusNode(){return h(e(this).focusNode)},addRange:function(a){e(this).addRange(f(a))},collapse:function(a,b){e(this).collapse(g(a),b)},containsNode:function(a,b){return e(this).containsNode(g(a),b)},extend:function(a,b){e(this).extend(g(a),b)},getRangeAt:function(a){return h(e(this).getRangeAt(a))},removeRange:function(a){e(this).removeRange(f(a))},selectAllChildren:function(a){e(this).selectAllChildren(g(a))},toString:function(){return e(this).toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return C(c.apply(A(this),arguments))}}function d(a,b){F.call(A(b),B(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){z(a,this)}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return C(c.apply(A(this),arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(A(this),arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.setWrapper,A=a.unsafeUnwrap,B=a.unwrap,C=a.wrap,D=a.wrapEventTargetMethods,E=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var F=document.adoptNode,G=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,A(this))},getSelection:function(){return x(),new m(G.call(B(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var H=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void z(a,this):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){C(this)instanceof d||y(this),b.apply(C(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);H.call(B(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=E.get(this);return a?a:(a=new g(B(this).implementation),E.set(this,a),a)},get defaultView(){return C(B(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getDefaultComputedStyle,n=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},m&&(k.prototype.getDefaultComputedStyle=function(a,b){return j(this||window).getDefaultComputedStyle(i(a),b)}),k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(n.call(h(this)))},get document(){return j(h(this).document)}}),m&&(b.prototype.getDefaultComputedStyle=function(a,b){return g(),m.call(h(this),i(a),b)}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b;b=a instanceof f?a:new f(a&&e(a)),d(b,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unwrap,f=window.FormData;c(f,b,new f),a.wrappers.FormData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=Array.prototype.slice.call(g.sheet.cssRules,0),b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b<shadowDOMSelectorsRe.length;b++)a=a.replace(shadowDOMSelectorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){a.type===CSSRule.KEYFRAMES_RULE&&a.cssRules&&(c+=this.ieSafeCssTextFromKeyFrameRule(a))}},this),c},ieSafeCssTextFromKeyFrameRule:function(a){var b="@keyframes "+a.name+" {";return Array.prototype.forEach.call(a.cssRules,function(a){b+=" "+a.keyText+" {"+a.style.cssText+"}"}),b+=" }"},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var b="link[rel=stylesheet]["+y+"]",c="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+b,HTMLImports.importer.importsPreloadSelectors+=","+b,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,b,c].join(",");var d=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var b=a.__importElement||a;if(!b.hasAttribute(y))return void d.call(this,a);
+a.__resource&&(b=a.ownerDocument.createElement("style"),b.textContent=a.__resource),HTMLImports.path.resolveUrlsInStyle(b),b.textContent=k.shimStyle(b),b.removeAttribute(y,""),b.setAttribute(z,""),b[z]=!0,b.parentNode!==C&&(a.parentNode===C?C.replaceChild(b,a):this.addElementToDocument(b)),b.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var e=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:e.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}})}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}};var r=a.URL;r&&(i.createObjectURL=function(){return r.createObjectURL.apply(r,arguments)},i.revokeObjectURL=function(a){r.revokeObjectURL(a)}),a.URL=i}}(this),function(){Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}})}(window.Platform),function(a){"use strict";if(!window.performance){var b=Date.now();window.performance={now:function(){return Date.now()-b}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var c=[],d=function(){Array.prototype.push.call(arguments,document._currentScript),c.push(arguments)};window.Polymer=d,a.consumeDeclarations=function(b){a.consumeDeclarations=function(){throw"Possible attempt to load Polymer twice"},b&&b(c),c=null},window.addEventListener("DOMContentLoaded",function(){window.Polymer===d&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})})}(window.Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){function b(a,b){b=b||o,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a){a.target.__loaded=!0}function f(a,b){function c(){h==i&&a&&a()}function d(a){e(a),h++,c()}var f=b.querySelectorAll("link[rel=import]"),h=0,i=f.length;if(i)for(var j,k=0;i>k&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return l?a.__loaded:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a.import;b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=g,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;for(var f,g=this.pending[a],h=0,i=g.length;i>h&&(f=g[h]);h++)this.onload(a,f,d,c,e),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:a;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b=d(a);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(b)}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=a.isIE,j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import&&(a.import.__importParsed=!0),this.markParsingComplete(a),a.dispatchEvent(a.__resource&&!a.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),this.addElementToDocument(a)},rootImportForElement:function(a){for(var b=a;b.ownerDocument.__importLink;)b=b.ownerDocument.__importLink;return b},addElementToDocument:function(a){for(var b=this.rootImportForElement(a.__importElement||a),c=b.__insertedElements=b.__insertedElements||0,d=b.nextElementSibling,e=0;c>e;e++)d=d&&d.nextElementSibling;b.parentNode.insertBefore(a,d)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),this.addElementToDocument(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){if(a)for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&void 0===a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n}(HTMLImports),function(a){function b(a){return c(a,g)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(g)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}var e=a.useNative,f=a.flags,g="import",h=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(e)var i={};else{var j=(a.xhr,a.Loader),k=a.parser,i={documents:{},documentPreloadSelectors:"link[rel="+g+"]",importsPreloadSelectors:["link[rel="+g+"]"].join(","),loadNode:function(a){l.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);l.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===h?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e,g,h){if(f.load&&console.log("loaded",a,c),c.__resource=e,c.__error=g,b(c)){var i=this.documents[a];void 0===i&&(i=g?null:d(e,h||a),i&&(i.__importLink=c,this.bootDocument(i)),this.documents[a]=i),c.import=i}k.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),k.parseNext()},loadedAll:function(){k.parseNext()}},l=new j(i.loaded.bind(i),i.loadedAll.bind(i));if(!document.baseURI){var m={get:function(){var a=document.querySelector("base");return a?a.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",m),Object.defineProperty(h,"baseURI",m)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c})}a.importer=i,a.IMPORT_LINK_TYPE=g,a.importLoader=l}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);
+if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)}),CustomElements.ready=!0,setTimeout(function(){CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,Boolean(b.bubbles),Boolean(b.cancelable),b.detail),c},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window);
 //# sourceMappingURL=platform.js.map
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/lib/elements.dart b/runtime/bin/vmservice/observatory/lib/elements.dart
index 51a8555..7fd7652 100644
--- a/runtime/bin/vmservice/observatory/lib/elements.dart
+++ b/runtime/bin/vmservice/observatory/lib/elements.dart
@@ -33,6 +33,8 @@
 export 'package:observatory/src/elements/library_view.dart';
 export 'package:observatory/src/elements/metrics.dart';
 export 'package:observatory/src/elements/nav_bar.dart';
+export 'package:observatory/src/elements/object_common.dart';
+export 'package:observatory/src/elements/object_view.dart';
 export 'package:observatory/src/elements/observatory_application.dart';
 export 'package:observatory/src/elements/observatory_element.dart';
 export 'package:observatory/src/elements/script_inset.dart';
diff --git a/runtime/bin/vmservice/observatory/lib/elements.html b/runtime/bin/vmservice/observatory/lib/elements.html
index a096870..e54546b 100644
--- a/runtime/bin/vmservice/observatory/lib/elements.html
+++ b/runtime/bin/vmservice/observatory/lib/elements.html
@@ -26,6 +26,8 @@
 <link rel="import" href="src/elements/library_view.html">
 <link rel="import" href="src/elements/metrics.html">
 <link rel="import" href="src/elements/nav_bar.html">
+<link rel="import" href="src/elements/object_common.html">
+<link rel="import" href="src/elements/object_view.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/script_inset.html">
diff --git a/runtime/bin/vmservice/observatory/lib/src/app/application.dart b/runtime/bin/vmservice/observatory/lib/src/app/application.dart
index f6eb6344..a848c35 100644
--- a/runtime/bin/vmservice/observatory/lib/src/app/application.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/app/application.dart
@@ -87,6 +87,7 @@
         notifications.add(event);
         break;
 
+
       case 'GC':
         // Ignore GC events for now.
         break;
@@ -201,10 +202,17 @@
     _initOnce(false);
   }
 
+  void _removeDisconnectEvents() {
+    notifications.removeWhere((oldEvent) {
+        return (oldEvent.eventType == 'VMDisconnected');
+      });
+  }
+
   _vmConnected(VM vm) {
     if (vm is WebSocketVM) {
       targets.add(vm.target);
     }
+    _removeDisconnectEvents();
   }
 
   _vmDisconnected(VM vm) {
@@ -213,6 +221,6 @@
       return;
     }
     this.vm = null;
-    locationManager.go(locationManager.makeLink('/vm-connect/'));
+    notifications.add(new ServiceEvent.vmDisconencted());
   }
 }
diff --git a/runtime/bin/vmservice/observatory/lib/src/app/location_manager.dart b/runtime/bin/vmservice/observatory/lib/src/app/location_manager.dart
index 04b6d84..0d7705b 100644
--- a/runtime/bin/vmservice/observatory/lib/src/app/location_manager.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/app/location_manager.dart
@@ -33,6 +33,10 @@
   /// Go to a specific url.
   void go(String url) {
     if (_app.vm == null) {
+      if (!window.confirm('Connection with VM has been lost. '
+                          'Proceeding will lose current page.')) {
+        return;
+      }
       url = makeLink('/vm-connect/');
     }
     _pushUrl(url);
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/class_view.html b/runtime/bin/vmservice/observatory/lib/src/elements/class_view.html
index d1fbf97..f8af57d 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/class_view.html
@@ -108,8 +108,8 @@
                   <field-ref ref="{{ field }}"></field-ref>
                 </div>
                 <div class="memberValue">
-                  <template if="{{ field['value'] != null }}">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                  <template if="{{ field.value != null }}">
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </template>
                 </div>
               </div>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/context_ref.dart b/runtime/bin/vmservice/observatory/lib/src/elements/context_ref.dart
index 7072e66..7f020ec 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/context_ref.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/context_ref.dart
@@ -26,7 +26,7 @@
       }).whenComplete(onDone);
     } else {
       Context refMap = ref;
-      refMap.elements = null;
+      refMap.variables = null;
       onDone();
     }
   }
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/field_ref.html b/runtime/bin/vmservice/observatory/lib/src/elements/field_ref.html
index ab1de8e..bc74935 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/field_ref.html
@@ -7,15 +7,15 @@
   <template>
   <link rel="stylesheet" href="css/shared.css">
     <span>
-      <template if="{{ ref['static'] }}">static</template>
-      <template if="{{ ref['final'] }}">final</template>
-      <template if="{{ ref['const'] }}">const</template>
-      <template if="{{ (ref['declaredType'].name == 'dynamic' &&
-                        !ref['final'] && !ref['const']) }}">
+      <template if="{{ ref.isStatic] }}">static</template>
+      <template if="{{ ref.isFinal }}">final</template>
+      <template if="{{ ref.isConst }}">const</template>
+      <template if="{{ (ref.declaredType.name == 'dynamic' &&
+                        !ref.isFinal && !ref.isConst) }}">
         var
       </template>
-      <template if="{{ (ref['declaredType'].name != 'dynamic') }}">
-        <instance-ref ref="{{ ref['declaredType'] }}"></instance-ref>
+      <template if="{{ (ref.declaredType.name != 'dynamic') }}">
+        <instance-ref ref="{{ ref.declaredType }}"></instance-ref>
       </template>
       <a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a>
     </span>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/field_view.dart b/runtime/bin/vmservice/observatory/lib/src/elements/field_view.dart
index c3b4b34..d1de392 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/field_view.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/field_view.dart
@@ -10,7 +10,7 @@
 
 @CustomTag('field-view')
 class FieldViewElement extends ObservatoryElement {
-  @published ServiceMap field;
+  @published Field field;
   FieldViewElement.created() : super.created();
 
   void refresh(var done) {
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/field_view.html b/runtime/bin/vmservice/observatory/lib/src/elements/field_view.html
index a7df2a6..e73e292 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/field_view.html
@@ -12,12 +12,12 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
-      <template if="{{ field['owner'].type == 'Class' }}">
+      <template if="{{ field.owner.type == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ field.owner }}"></class-nav-menu>
       </template>
-      <template if="{{ field['owner'].type == 'Library' }}">
-        <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
+      <template if="{{ field.owner.type == 'Library' }}">
+        <library-nav-menu library="{{ field.owner }}"></library-nav-menu>
       </template>
       <nav-menu link="{{ field.link }}" anchor="{{ field.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -26,15 +26,15 @@
 
     <div class="content">
       <h1>
-        <template if="{{ field['static'] }}">static</template>
-        <template if="{{ field['final'] }}">final</template>
-        <template if="{{ field['const'] }}">const</template>
-        <template if="{{ (field['declaredType'].name == 'dynamic' &&
-                         !field['final'] && !field['const']) }}">
+        <template if="{{ field.isStatic }}">static</template>
+        <template if="{{ field.isFinal }}">final</template>
+        <template if="{{ field.isConst }}">const</template>
+        <template if="{{ (field.declaredType.name == 'dynamic' &&
+                         !field.isFinal && !field.isConst) }}">
           var
         </template>
-        <template if="{{ (field['declaredType'].name != 'dynamic') }}">
-          {{ field['declaredType'].name }}
+        <template if="{{ (field.declaredType.name != 'dynamic') }}">
+          {{ field.declaredType.name }}
         </template>
         {{ field.name }}
       </h1>
@@ -42,49 +42,49 @@
         <div class="memberItem">
           <div class="memberName">owner</div>
           <div class="memberValue">
-            <template if="{{ field['owner'].type == 'Class' }}">
-              <class-ref ref="{{ field['owner'] }}"></class-ref>
+            <template if="{{ field.owner.type == 'Class' }}">
+              <class-ref ref="{{ field.owner }}"></class-ref>
             </template>
-            <template if="{{ field['owner'].type != 'Class' }}">
-              <library-ref ref="{{ field['owner'] }}"></library-ref>
+            <template if="{{ field.owner.type != 'Class' }}">
+              <library-ref ref="{{ field.owner }}"></library-ref>
             </template>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ field['script'] }}"></script-ref>
+            <script-ref ref="{{ field.script }}"></script-ref>
           </div>
         </div>
-        <template if="{{ !field['static'] }}">
+        <template if="{{ !field.isStatic }}">
           <div class="memberItem"
                title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
             <div class="memberName">observed types</div>
             <div class="memberValue">
-              <template if="{{ field['guardClass'] == 'dynamic' }}">
+              <template if="{{ field.guardClass == 'dynamic' }}">
                 various
               </template>
-              <template if="{{ field['guardClass'] == 'unknown' }}">
+              <template if="{{ field.guardClass == 'unknown' }}">
                 none
               </template>
-              <template if="{{ field['guardClass'] != 'unknown' &&
-                            field['guardClass'] != 'dynamic' }}">
-                <class-ref ref="{{ field['guardClass'] }}"></class-ref>
-                <template if="{{ field['guardNullable'] }}">
+              <template if="{{ field.guardClass != 'unknown' &&
+                            field.guardClass != 'dynamic' }}">
+                <class-ref ref="{{ field.guardClass }}"></class-ref>
+                <template if="{{ field.guardNullable }}">
                   &mdash; null observed
                 </template>
-                <template if="{{ !field['guardNullable'] }}">
+                <template if="{{ !field.guardNullable }}">
                   &mdash; null not observed
                 </template>
               </template>
             </div>
           </div>
         </template>
-        <template if="{{ field['value'] != null }}">
+        <template if="{{ field.value != null }}">
           <div class="memberItem">
             <div class="memberName">static value</div>
             <div class="memberValue">
-              <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+              <any-service-ref ref="{{ field.value }}"></any-service-ref>
             </div>
           </div>
         </template>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.html b/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.html
index 6a97bea..b9dbb9b 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.html
@@ -149,7 +149,7 @@
                     <field-ref ref="{{ field['decl'] }}"></field-ref>
                   </div>
                   <div class="memberValue">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </div>
                 </div>
               </template>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/library_view.html b/runtime/bin/vmservice/observatory/lib/src/elements/library_view.html
index c8aba4e..750e93e 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/library_view.html
@@ -103,8 +103,8 @@
                   <field-ref ref="{{ field }}"></field-ref>
                 </div>
                 <div class="memberValue">
-                  <template if="{{ field['value'] != null }}">
-                    <any-service-ref ref="{{ field['value'] }}"></any-service-ref>
+                  <template if="{{ field.value != null }}">
+                    <any-service-ref ref="{{ field.value }}"></any-service-ref>
                   </template>
                 </div>
               </div>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/observatory/lib/src/elements/nav_bar.html
index a515004..99d776f 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/nav_bar.html
@@ -343,6 +343,13 @@
         <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
       </div>
     </template>
+    <template if="{{ event.eventType == 'VMDisconnected' }}">
+      <div class="item">
+        Disconnected from VM
+        <br><br>
+        <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
+      </div>
+    </template>
   </template>
 </polymer-element>
 
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/object_common.dart b/runtime/bin/vmservice/observatory/lib/src/elements/object_common.dart
index b1814e4..6079530 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/object_common.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/object_common.dart
@@ -21,8 +21,8 @@
   // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
   Future<ServiceObject> retainedSize(var dummy) {
     return object.isolate.get(object.id + "/retained")
-        .then((ServiceMap obj) {
-          retainedBytes = int.parse(obj['valueAsString']);
+        .then((Instance obj) {
+          retainedBytes = int.parse(obj.valueAsString);
         });
   }
 
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/object_common.html b/runtime/bin/vmservice/observatory/lib/src/elements/object_common.html
index 63c78a1..ea2fb87 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/object_common.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/object_common.html
@@ -21,10 +21,19 @@
         </div>
       </div>
 
-      <div class="memberItem" title="Space for this object in memory">
-        <div class="memberName">size</div>
-        <div class="memberValue">{{ object.size | formatSize }}</div>
-      </div>
+      <template if="{{ object.size != null }}">
+        <div class="memberItem" title="Space for this object in memory">
+          <div class="memberName">size</div>
+          <div class="memberValue">{{ object.size | formatSize }}</div>
+        </div>
+      </template>
+
+      <template if="{{ object.size == null }}">
+        <div class="memberItem" title="Space for this object in memory">
+          <div class="memberName">size</div>
+          <div class="memberValue">0</div>
+        </div>
+      </template>
 
       <div class="memberItem" title="Space that would be reclaimed if references to this object were replaced with null">
         <div class="memberName">retained size</div>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/object_view.dart b/runtime/bin/vmservice/observatory/lib/src/elements/object_view.dart
new file mode 100644
index 0000000..307b675
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/object_view.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library object_view;
+
+import 'dart:async';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('object-view')
+class ObjectViewElement extends ObservatoryElement {
+  @published ServiceObject object;
+
+  ObjectViewElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/object_view.html b/runtime/bin/vmservice/observatory/lib/src/elements/object_view.html
new file mode 100644
index 0000000..bec4a53
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/object_view.html
@@ -0,0 +1,32 @@
+<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="field_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="inbound_reference.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="object_common.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="eval_link.html">
+
+<polymer-element name="object-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ object.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="object" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
+    </nav-bar>
+
+    <div class="content">
+      <object-common object="{{ object }}"></object-common>
+    </div>
+
+    <hr>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="object_view.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/observatory_element.dart b/runtime/bin/vmservice/observatory/lib/src/elements/observatory_element.dart
index 1141def..43a4b5b 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/observatory_element.dart
@@ -125,8 +125,10 @@
       else if (codeUnit == '\$'.codeUnitAt(0)) result.addAll('\\\$'.codeUnits);
       else if (codeUnit == '\\'.codeUnitAt(0)) result.addAll('\\\\'.codeUnits);
       else if (codeUnit == "'".codeUnitAt(0)) result.addAll("'".codeUnits);
-      else if (codeUnit < 32) result.addAll("\\u$codeUnit".codeUnits);
-      else result.add(codeUnit);
+      else if (codeUnit < 32) {
+         var escapeSequence = "\\u" + codeUnit.toRadixString(16).padLeft(4, "0");
+         result.addAll(escapeSequence.codeUnits);
+      } else result.add(codeUnit);
     }
     if (wasTruncated) {
       result.addAll("...".codeUnits);
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.dart b/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.dart
index 3637bbd..63f2449 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.dart
@@ -53,7 +53,7 @@
 
   // Workaround isEmpty not being useable due to missing @MirrorsUsed.
   bool get nameIsEmpty {
-    return name.isEmpty;
+    return (name == null) || name.isEmpty;
   }
 }
 
@@ -94,6 +94,14 @@
         ServiceRefElement element = new Element.tag('library-ref');
         element.ref = ref;
         return element;
+      case 'Object':
+        ServiceRefElement element = new Element.tag('object-ref');
+        element.ref = ref;
+        return element;
+      case 'Script':
+        ServiceRefElement element = new Element.tag('script-ref');
+        element.ref = ref;
+        return element;
       default:
         if (ref.isInstance ||
             ref.isSentinel) {  // TODO(rmacnak): Separate this out.
@@ -125,3 +133,8 @@
     Logger.root.info('Viewing object of \'${type}\'');
   }
 }
+
+@CustomTag('object-ref')
+class ObjectRefElement extends ServiceRefElement {
+  ObjectRefElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.html b/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.html
index 3b4b930..097e90c 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.html
@@ -7,4 +7,15 @@
 <polymer-element name="any-service-ref" extends="observatory-element">
 </polymer-element>
 
+<polymer-element name="object-ref" extends="service-ref">
+  <template><link rel="stylesheet" href="css/shared.css">
+    <template if="{{ nameIsEmpty }}">
+      <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.vmType }}</em></a>
+    </template>
+    <template if="{{ !nameIsEmpty }}">
+      <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ name }}</em></a>
+    </template>
+  </template>
+</polymer-element>
+
 <script type="application/dart" src="service_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/service_view.dart b/runtime/bin/vmservice/observatory/lib/src/elements/service_view.dart
index 438ebfa..43a492f 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/service_view.dart
@@ -81,6 +81,10 @@
             new Element.tag('io-http-server-connection-view');
         element.connection = object;
         return element;
+      case 'Object':
+        ObjectViewElement element = new Element.tag('object-view');
+        element.object = object;
+        return element;
       case 'SocketList':
         IOSocketListViewElement element =
             new Element.tag('io-socket-list-view');
diff --git a/runtime/bin/vmservice/observatory/lib/src/service/object.dart b/runtime/bin/vmservice/observatory/lib/src/service/object.dart
index 1319872..4fb2ba1 100644
--- a/runtime/bin/vmservice/observatory/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/service/object.dart
@@ -123,6 +123,7 @@
     }
     assert(_isServiceMap(map));
     var type = _stripRef(map['type']);
+    var vmType = map['_vmType'] != null ? _stripRef(map['_vmType']) : type;
     var obj = null;
     assert(type != 'VM');
     switch (type) {
@@ -141,6 +142,9 @@
       case 'Error':
         obj = new DartError._empty(owner);
         break;
+      case 'Field':
+        obj = new Field._empty(owner);
+        break;
       case 'Function':
         obj = new ServiceFunction._empty(owner);
         break;
@@ -153,6 +157,19 @@
       case 'Library':
         obj = new Library._empty(owner);
         break;
+      case 'Object':
+        switch (vmType) {
+          case 'PcDescriptors':
+            obj = new PcDescriptors._empty(owner);
+            break;
+          case 'LocalVarDescriptors':
+            obj = new LocalVarDescriptors._empty(owner);
+            break;
+          case 'TokenStream':
+            obj = new TokenStream._empty(owner);
+            break;
+        }
+        break;
       case 'ServiceError':
         obj = new ServiceError._empty(owner);
         break;
@@ -172,11 +189,11 @@
         if (_isInstanceType(type) ||
             type == 'Sentinel') {  // TODO(rmacnak): Separate this out.
           obj = new Instance._empty(owner);
-          break;
-        } else {
-          obj = new ServiceMap._empty(owner);
-          break;
         }
+        break;
+    }
+    if (obj == null) {
+      obj = new ServiceMap._empty(owner);
     }
     obj.update(map);
     return obj;
@@ -1278,12 +1295,18 @@
     name = 'ServiceException $kind';
     vmName = name;
   }
+
+  String toString() => 'ServiceException($message)';
 }
 
 /// A [ServiceEvent] is an asynchronous event notification from the vm.
 class ServiceEvent extends ServiceObject {
   ServiceEvent._empty(ServiceObjectOwner owner) : super._empty(owner);
 
+  ServiceEvent.vmDisconencted() : super._empty(null) {
+    eventType = 'VMDisconnected';
+  }
+
   @observable String eventType;
   @observable ServiceMap breakpoint;
   @observable ServiceMap exception;
@@ -1317,7 +1340,7 @@
   @reflectable final imports = new ObservableList<Library>();
   @reflectable final scripts = new ObservableList<Script>();
   @reflectable final classes = new ObservableList<Class>();
-  @reflectable final variables = new ObservableList<ServiceMap>();
+  @reflectable final variables = new ObservableList<Field>();
   @reflectable final functions = new ObservableList<ServiceFunction>();
 
   bool get canCache => true;
@@ -1418,7 +1441,7 @@
 
   bool get hasNoAllocations => newSpace.empty && oldSpace.empty;
 
-  @reflectable final fields = new ObservableList<ServiceMap>();
+  @reflectable final fields = new ObservableList<Field>();
   @reflectable final functions = new ObservableList<ServiceFunction>();
 
   @observable Class superclass;
@@ -1702,6 +1725,55 @@
   }
 }
 
+
+class Field extends ServiceObject {
+  @observable var /* Library or Class */ owner;
+  @observable Instance declaredType;
+  @observable bool isStatic;
+  @observable bool isFinal;
+  @observable bool isConst;
+  @observable Instance value;
+  @observable String name;
+  @observable String vmName;
+
+  @observable bool guardNullable;
+  @observable String guardClass;
+  @observable String guardLength;
+  @observable Script script;
+  @observable int tokenPos;
+
+  Field._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+  void _update(ObservableMap map, bool mapIsRef) {
+    // Extract full properties.
+    _upgradeCollection(map, isolate);
+
+    name = map['name'];
+    vmName = (map.containsKey('vmName') ? map['vmName'] : name);
+    owner = map['owner'];
+    declaredType = map['declaredType'];
+    isStatic = map['static'];
+    isFinal = map['final'];
+    isConst = map['const'];
+    value = map['value'];
+
+    if (mapIsRef) {
+      return;
+    }
+
+    guardNullable = map['guardNullable'];
+    guardClass = map['guardClass'];
+    guardLength = map['guardLength'];
+    script = map['script'];
+    tokenPos = map['tokenPos'];
+
+    _loaded = true;
+  }
+
+  String toString() => 'Field(${owner.name}.$name)';
+}
+
+
 class ScriptLine extends Observable {
   final Script script;
   final int line;
@@ -1892,7 +1964,6 @@
   CodeTick(this.address, this.exclusiveTicks, this.inclusiveTicks);
 }
 
-
 class PcDescriptor extends Observable {
   final int address;
   @reflectable final int deoptId;
@@ -1933,6 +2004,101 @@
   }
 }
 
+class PcDescriptors extends ServiceObject {
+  @observable Class clazz;
+  @observable int size;
+  bool get canCache => false;
+  bool get immutable => true;
+  @reflectable final List<PcDescriptor> descriptors =
+      new ObservableList<PcDescriptor>();
+
+  PcDescriptors._empty(ServiceObjectOwner owner) : super._empty(owner) {
+    print('created PcDescriptors.');
+  }
+
+  void _update(ObservableMap m, bool mapIsRef) {
+    if (mapIsRef) {
+      return;
+    }
+    _upgradeCollection(m, isolate);
+    clazz = m['class'];
+    size = m['size'];
+    descriptors.clear();
+    for (var descriptor in m['members']) {
+      var address = int.parse(descriptor['pc'], radix:16);
+      var deoptId = descriptor['deoptId'];
+      var tokenPos = descriptor['tokenPos'];
+      var tryIndex = descriptor['tryIndex'];
+      var kind = descriptor['kind'].trim();
+      descriptors.add(
+          new PcDescriptor(address, deoptId, tokenPos, tryIndex, kind));
+    }
+  }
+}
+
+class LocalVarDescriptor extends Observable {
+  @reflectable final String name;
+  @reflectable final int index;
+  @reflectable final int beginPos;
+  @reflectable final int endPos;
+  @reflectable final int scopeId;
+  @reflectable final String kind;
+
+  LocalVarDescriptor(this.name, this.index, this.beginPos, this.endPos,
+                     this.scopeId, this.kind);
+}
+
+class LocalVarDescriptors extends ServiceObject {
+  @observable Class clazz;
+  @observable int size;
+  bool get canCache => false;
+  bool get immutable => true;
+  @reflectable final List<LocalVarDescriptor> descriptors =
+        new ObservableList<LocalVarDescriptor>();
+  LocalVarDescriptors._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+  void _update(ObservableMap m, bool mapIsRef) {
+    if (mapIsRef) {
+      return;
+    }
+    _upgradeCollection(m, isolate);
+    clazz = m['class'];
+    size = m['size'];
+    descriptors.clear();
+    for (var descriptor in m['members']) {
+      var name = descriptor['name'];
+      var index = descriptor['index'];
+      var beginPos = descriptor['beginPos'];
+      var endPos = descriptor['endPos'];
+      var scopeId = descriptor['scopeId'];
+      var kind = descriptor['kind'].trim();
+      descriptors.add(
+          new LocalVarDescriptor(name, index, beginPos, endPos, scopeId, kind));
+    }
+  }
+}
+
+class TokenStream extends ServiceObject {
+  @observable Class clazz;
+  @observable int size;
+  bool get canCache => false;
+  bool get immutable => true;
+
+  @observable String privateKey;
+
+  TokenStream._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+  void _update(ObservableMap m, bool mapIsRef) {
+    if (mapIsRef) {
+      return;
+    }
+    _upgradeCollection(m, isolate);
+    clazz = m['class'];
+    size = m['size'];
+    privateKey = m['privateKey'];
+  }
+}
+
 class CodeInstruction extends Observable {
   @observable final int address;
   @observable final String machine;
@@ -2089,8 +2255,6 @@
   @observable ServiceFunction function;
   @observable Script script;
   @observable bool isOptimized = false;
-  String name;
-  String vmName;
 
   bool get canCache => true;
   bool get immutable => true;
diff --git a/runtime/bin/vmservice/observatory/test/contexts_test.dart b/runtime/bin/vmservice/observatory/test/contexts_test.dart
index 05ae127..6eda397 100644
--- a/runtime/bin/vmservice/observatory/test/contexts_test.dart
+++ b/runtime/bin/vmservice/observatory/test/contexts_test.dart
@@ -52,8 +52,8 @@
 
 (Isolate isolate) =>
   isolate.rootLib.load().then((Library lib) {
-    ServiceMap field = lib.variables.singleWhere((v) => v.name == 'cleanBlock');
-    return field['value'].load().then((Instance block) {
+    Field field = lib.variables.singleWhere((v) => v.name == 'cleanBlock');
+    return field.value.load().then((Instance block) {
       expect(block.isClosure, isTrue);
       expect(block.closureCtxt.isContext, isTrue);
       expect(block.closureCtxt.length, equals(0));
@@ -65,8 +65,8 @@
 
 (Isolate isolate) =>
   isolate.rootLib.load().then((Library lib) {
-    ServiceMap field = lib.variables.singleWhere((v) => v.name == 'copyingBlock');
-    return field['value'].load().then((Instance block) {
+    Field field = lib.variables.singleWhere((v) => v.name == 'copyingBlock');
+    return field.value.load().then((Instance block) {
       expect(block.isClosure, isTrue);
       expect(block.closureCtxt.isContext, isTrue);
       expect(block.closureCtxt.length, equals(1));
@@ -80,8 +80,8 @@
 
 (Isolate isolate) =>
   isolate.rootLib.load().then((Library lib) {
-    ServiceMap field = lib.variables.singleWhere((v) => v.name == 'fullBlock');
-    return field['value'].load().then((Instance block) {
+    Field field = lib.variables.singleWhere((v) => v.name == 'fullBlock');
+    return field.value.load().then((Instance block) {
       expect(block.isClosure, isTrue);
       expect(block.closureCtxt.isContext, isTrue);
       expect(block.closureCtxt.length, equals(1));
@@ -95,8 +95,8 @@
 
 (Isolate isolate) =>
   isolate.rootLib.load().then((Library lib) {
-    ServiceMap field = lib.variables.singleWhere((v) => v.name == 'fullBlockWithChain');
-    return field['value'].load().then((Instance block) {
+    Field field = lib.variables.singleWhere((v) => v.name == 'fullBlockWithChain');
+    return field.value.load().then((Instance block) {
       expect(block.isClosure, isTrue);
       expect(block.closureCtxt.isContext, isTrue);
       expect(block.closureCtxt.length, equals(1));
diff --git a/runtime/bin/vmservice/observatory/test/inbound_references_test.dart b/runtime/bin/vmservice/observatory/test/inbound_references_test.dart
index f515671..0d9698c 100644
--- a/runtime/bin/vmservice/observatory/test/inbound_references_test.dart
+++ b/runtime/bin/vmservice/observatory/test/inbound_references_test.dart
@@ -30,7 +30,7 @@
 
 (Isolate isolate) =>
   isolate.rootLib.load().then((Library lib) {
-    Instance e = lib.variables.where((v) => v.name == 'e').single['value'];
+    Instance e = lib.variables.where((v) => v.name == 'e').single.value;
     var id = e.id;
     return isolate.get('/$id/inbound_references?limit=100').then(
         (ServiceMap response) {
@@ -41,15 +41,14 @@
 
           // Assert e is referenced by at least n, array, and the top-level
           // field e.
-          hasReferenceSuchThat((r) => r['slot'] is Map &&
-                                      r['slot']['type']=='@Field' &&
-                                      r['slot']['name']=='edge' &&
+          hasReferenceSuchThat((r) => r['slot'] is Field &&
+                                      r['slot'].name=='edge' &&
                                       r['source'].isInstance &&
                                       r['source'].clazz.name=='Node');
           hasReferenceSuchThat((r) => r['slot'] == 1 &&
                                       r['source'].isList);
           hasReferenceSuchThat((r) => r['slot']=='<unknown>' &&
-                                      r['source']['type']=='@Field');
+                                      r['source'] is Field);
     });
 }),
 
diff --git a/runtime/bin/vmservice/observatory/test/mirror_references_test.dart b/runtime/bin/vmservice/observatory/test/mirror_references_test.dart
index 651803a..b3c782c 100644
--- a/runtime/bin/vmservice/observatory/test/mirror_references_test.dart
+++ b/runtime/bin/vmservice/observatory/test/mirror_references_test.dart
@@ -27,10 +27,10 @@
 
 (Isolate isolate) =>
   isolate.rootLib.load().then((Library lib) {
-    ServiceMap fooField = lib.variables.singleWhere((v) => v.name == 'foo');
-    Instance foo = fooField['value'];
-    ServiceMap refField = lib.variables.singleWhere((v) => v.name == 'ref');
-    Instance ref = refField['value'];
+    Field fooField = lib.variables.singleWhere((v) => v.name == 'foo');
+    Instance foo = fooField.value;
+    Field refField = lib.variables.singleWhere((v) => v.name == 'ref');
+    Instance ref = refField.value;
 
     expect(foo.isMirrorReference, isFalse);
     expect(ref.isMirrorReference, isTrue);
diff --git a/runtime/bin/vmservice/observatory/test/string_escaping_test.dart b/runtime/bin/vmservice/observatory/test/string_escaping_test.dart
index cf581b7..3b73a8c 100644
--- a/runtime/bin/vmservice/observatory/test/string_escaping_test.dart
+++ b/runtime/bin/vmservice/observatory/test/string_escaping_test.dart
@@ -23,6 +23,8 @@
 var escapedUnicodeEscape;
 var longStringEven;
 var longStringOdd;
+var malformedWithLeadSurrogate;
+var malformedWithTrailSurrogate;
 
 void script() {
   ascii = "Hello, World!";
@@ -42,6 +44,9 @@
   for (int i = 0; i < 512; i++) longStringEven += "𝄞";
   longStringOdd = ".";
   for (int i = 0; i < 512; i++) longStringOdd += "𝄞";
+
+  malformedWithLeadSurrogate = "before" + "𝄞"[0] + "after";
+  malformedWithTrailSurrogate = "before" + "𝄞"[1] + "after";
 }
 
 var tests = [
@@ -49,14 +54,14 @@
 (Isolate isolate) =>
   isolate.rootLib.load().then((Library lib) {
     expectFullString(String varName, String varValueAsString) {
-      ServiceMap field = lib.variables.singleWhere((v) => v.name == varName);
-      Instance value = field['value'];
+      Field field = lib.variables.singleWhere((v) => v.name == varName);
+      Instance value = field.value;
       expect(value.valueAsString, equals(varValueAsString));
       expect(value.valueAsStringIsTruncated, isFalse);
     }
     expectTruncatedString(String varName, String varValueAsString) {
-      ServiceMap field = lib.variables.singleWhere((v) => v.name == varName);
-      Instance value = field['value'];
+      Field field = lib.variables.singleWhere((v) => v.name == varName);
+      Instance value = field.value;
       expect(varValueAsString, startsWith(value.valueAsString));
       expect(value.valueAsStringIsTruncated, isTrue);
     }
@@ -71,9 +76,11 @@
     expectFullString('newLines', newLines);
     expectFullString('tabs', tabs);
     expectFullString('suggrogatePairs', suggrogatePairs);
-    expectFullString('nullInTheMiddle', nullInTheMiddle);  /// 01: ok
+    expectFullString('nullInTheMiddle', nullInTheMiddle);
     expectTruncatedString('longStringEven', longStringEven);
     expectTruncatedString('longStringOdd', longStringOdd);
+    expectFullString('malformedWithLeadSurrogate', malformedWithLeadSurrogate);
+    expectFullString('malformedWithTrailSurrogate', malformedWithTrailSurrogate);
   }),
 
 ];
diff --git a/runtime/bin/vmservice/observatory/test/weak_properties_test.dart b/runtime/bin/vmservice/observatory/test/weak_properties_test.dart
index 662d60f..71d5051 100644
--- a/runtime/bin/vmservice/observatory/test/weak_properties_test.dart
+++ b/runtime/bin/vmservice/observatory/test/weak_properties_test.dart
@@ -36,12 +36,12 @@
 
 (Isolate isolate) =>
   isolate.rootLib.load().then((Library lib) {
-    ServiceMap keyField = lib.variables.singleWhere((v) => v.name == 'key');
-    Instance key = keyField['value'];
-    ServiceMap valueField = lib.variables.singleWhere((v) => v.name == 'value');
-    Instance value = valueField['value'];
-    ServiceMap propField = lib.variables.singleWhere((v) => v.name == 'weak_property');
-    Instance prop = propField['value'];
+    Field keyField = lib.variables.singleWhere((v) => v.name == 'key');
+    Instance key = keyField.value;
+    Field valueField = lib.variables.singleWhere((v) => v.name == 'value');
+    Instance value = valueField.value;
+    Field propField = lib.variables.singleWhere((v) => v.name == 'weak_property');
+    Instance prop = propField.value;
 
     expect(key.isWeakProperty, isFalse);
     expect(value.isWeakProperty, isFalse);
diff --git a/runtime/bin/vmservice/observatory/tests/ui/inspector.dart b/runtime/bin/vmservice/observatory/tests/ui/inspector.dart
index 686d4d6..7f65a04 100644
--- a/runtime/bin/vmservice/observatory/tests/ui/inspector.dart
+++ b/runtime/bin/vmservice/observatory/tests/ui/inspector.dart
@@ -46,6 +46,8 @@
 var stringEscapedUnicodeEscape;
 var stringHebrew;
 var stringLatin1;
+var stringMalformedLead;
+var stringMalformedTrail;
 var stringNewLinesAndTabs;
 var stringNullInTheMiddle;
 var stringSnowflake;
@@ -135,6 +137,8 @@
   stringEscapedUnicodeEscape = "Should not be A: \\u0041";
   stringHebrew = "שלום רב שובך צפורה נחמדת";  // Right-to-left text.
   stringLatin1 = "blåbærgrød";
+  stringMalformedLead = "before" + "𝄞"[0] + "after";
+  stringMalformedTrail = "before" + "𝄞"[1] + "after";
   stringNewLinesAndTabs = "One fish\ttwo fish\nRed fish\tBlue fish\n";
   stringNullInTheMiddle = "There are four\u0000 words.";
   stringSnowflake = "❄";
diff --git a/runtime/bin/vmservice/resources.dart b/runtime/bin/vmservice/resources.dart
index b774697..7e884fe 100644
--- a/runtime/bin/vmservice/resources.dart
+++ b/runtime/bin/vmservice/resources.dart
@@ -44,3 +44,5 @@
   Resource resource = new Resource(name, mimeType, data);
   Resource.resources[name] = resource;
 }
+
+void _triggerResourceLoad() native "VMServiceIO_TriggerResourceLoad";
diff --git a/runtime/bin/vmservice/vmservice_io.dart b/runtime/bin/vmservice/vmservice_io.dart
index 399b941..c04d485 100644
--- a/runtime/bin/vmservice/vmservice_io.dart
+++ b/runtime/bin/vmservice/vmservice_io.dart
@@ -8,7 +8,6 @@
 import 'dart:convert';
 import 'dart:io';
 import 'dart:isolate';
-import 'dart:mirrors';
 import 'dart:vmservice';
 
 part 'resources.dart';
@@ -26,53 +25,47 @@
 Server server;
 Future<Server> serverFuture;
 
-// The VM service instance.
-VMService service;
+void _bootServer() {
+  // Load resources.
+  _triggerResourceLoad();
+  // Lazily create service.
+  var service = new VMService();
+  // Lazily create server.
+  server = new Server(service, _ip, _port);
+}
+
+void _clearFuture(_) {
+  serverFuture = null;
+}
 
 void _onSignal(ProcessSignal signal) {
   if (serverFuture != null) {
     // Still waiting.
     return;
   }
+  if (server == null) {
+    _bootServer();
+  }
   // Toggle HTTP server.
   if (server.running) {
-    serverFuture = server.shutdown(true).then((_) {
-      serverFuture = null;
-    });
+    serverFuture = server.shutdown(true).then(_clearFuture);
   } else {
-    serverFuture = server.startup().then((_) {
-      serverFuture = null;
-    });
+    serverFuture = server.startup().then(_clearFuture);
   }
 }
 
-void registerSignalHandler() {
+void _registerSignalHandler(Stream signalWatch(ProcessSignal signal)) {
   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);
-  }
+  signalWatch(ProcessSignal.SIGQUIT).listen(_onSignal);
 }
 
-
-main() {
-  // Get VMService.
-  service = new VMService();
-  // Start HTTP server.
-  server = new Server(service, _ip, _port);
+main(Stream signalWatch(ProcessSignal signal)) {
   if (_autoStart) {
+    _bootServer();
     server.startup();
   }
-
-  registerSignalHandler();
+  _registerSignalHandler(signalWatch);
 }
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 4debf74..99e8148 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -86,6 +86,48 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(Resources);
 };
 
+
+void TriggerResourceLoad(Dart_NativeArguments args) {
+  Dart_Handle library = Dart_RootLibrary();
+  ASSERT(!Dart_IsError(library));
+  Dart_Handle result = VmService::LoadResources(library);
+  ASSERT(!Dart_IsError(result));
+}
+
+
+struct VmServiceIONativeEntry {
+  const char* name;
+  int num_arguments;
+  Dart_NativeFunction function;
+};
+
+
+static VmServiceIONativeEntry _VmServiceIONativeEntries[] = {
+  {"VMServiceIO_TriggerResourceLoad", 0, TriggerResourceLoad},
+};
+
+
+static Dart_NativeFunction VmServiceIONativeResolver(Dart_Handle name,
+                                                     int num_arguments,
+                                                     bool* auto_setup_scope) {
+  const char* function_name = NULL;
+  Dart_Handle result = Dart_StringToCString(name, &function_name);
+  ASSERT(!Dart_IsError(result));
+  ASSERT(function_name != NULL);
+  *auto_setup_scope = true;
+  intptr_t n =
+      sizeof(_VmServiceIONativeEntries) / sizeof(_VmServiceIONativeEntries[0]);
+  for (intptr_t i = 0; i < n; i++) {
+    VmServiceIONativeEntry entry = _VmServiceIONativeEntries[i];
+    if ((strcmp(function_name, entry.name) == 0) &&
+        (num_arguments == entry.num_arguments)) {
+      return entry.function;
+    }
+  }
+  return NULL;
+}
+
+
 const char* VmService::error_msg_ = NULL;
 
 bool VmService::Start(const char *server_ip, intptr_t server_port) {
@@ -103,7 +145,7 @@
   ASSERT(Dart_CurrentIsolate() == NULL);
   Dart_Isolate isolate = Dart_GetServiceIsolate(NULL);
   if (isolate == NULL) {
-    error_msg_ = "Internal error.";
+    error_msg_ = "Dart_GetServiceIsolate failed.";
     return false;
   }
   Dart_EnterIsolate(isolate);
@@ -111,7 +153,8 @@
   // Install our own library tag handler.
   Dart_SetLibraryTagHandler(LibraryTagHandler);
   Dart_Handle result;
-  Dart_Handle library = LoadScript(kVMServiceIOLibraryScriptResourceName);
+  Dart_Handle library;
+  library = LoadScript(kVMServiceIOLibraryScriptResourceName);
   // Expect a library.
   ASSERT(library != Dart_Null());
   SHUTDOWN_ON_ERROR(library);
@@ -130,6 +173,8 @@
   Dart_EnterIsolate(isolate);
   Dart_EnterScope();
   library = Dart_RootLibrary();
+  result = Dart_SetNativeResolver(library, VmServiceIONativeResolver, NULL);
+  ASSERT(!Dart_IsError(result));
   // Set requested TCP port.
   DartUtils::SetStringField(library, "_ip", server_ip);
   // If we have a port specified, start the server immediately.
@@ -146,19 +191,21 @@
                 Dart_NewBoolean(auto_start));
   // We cannot register for signals on windows.
 #if defined(TARGET_OS_WINDOWS)
-  const bool is_windows = true;
+  Dart_Handle is_windows = Dart_True();
 #else
-  const bool is_windows = false;
+  Dart_Handle is_windows = Dart_False();
 #endif
-  Dart_SetField(library,
-                DartUtils::NewString("_isWindows"),
-                Dart_NewBoolean(is_windows));
+  Dart_SetField(library, DartUtils::NewString("_isWindows"), is_windows);
 
+
+  // Get _getWatchSignalInternal from dart:io.
+  Dart_Handle dart_io_str = Dart_NewStringFromCString(DartUtils::kIOLibURL);
+  Dart_Handle io_lib = Dart_LookupLibrary(dart_io_str);
+  Dart_Handle function_name =
+      Dart_NewStringFromCString("_getWatchSignalInternal");
+  Dart_Handle signal_watch = Dart_Invoke(io_lib, function_name, 0, NULL);
   // Invoke main.
-  result = Dart_Invoke(library, DartUtils::NewString("main"), 0, NULL);
-  SHUTDOWN_ON_ERROR(result);
-  // Load resources.
-  result = LoadResources(library);
+  result = Dart_Invoke(library, DartUtils::NewString("main"), 1, &signal_watch);
   SHUTDOWN_ON_ERROR(result);
 
   Dart_ExitScope();
diff --git a/runtime/bin/vmservice_impl.h b/runtime/bin/vmservice_impl.h
index 8c9f011..7545746 100644
--- a/runtime/bin/vmservice_impl.h
+++ b/runtime/bin/vmservice_impl.h
@@ -29,6 +29,9 @@
                                   const char* prefix);
   static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, Dart_Handle library,
                                        Dart_Handle url);
+
+  friend void TriggerResourceLoad(Dart_NativeArguments args);
+
   static void ThreadMain(uword parameters);
   static const char* error_msg_;
   DISALLOW_ALLOCATION();
diff --git a/runtime/include/dart_debugger_api.h b/runtime/include/dart_debugger_api.h
index 679db43..0cc5bd9 100755
--- a/runtime/include/dart_debugger_api.h
+++ b/runtime/include/dart_debugger_api.h
@@ -462,6 +462,18 @@
                             Dart_Handle* function,
                             Dart_CodeLocation* location);
 
+/**
+ * Returns frame pointer of the given activation frame.
+ *
+ * \frame_pointer receives the frame pointer for the frame.
+ *
+ * Requires there to be a current isolate.
+ *
+ * \return A handle to the True object if no error occurs.
+ */
+DART_EXPORT Dart_Handle Dart_ActivationFrameGetFramePointer(
+                            Dart_ActivationFrame activation_frame,
+                            uintptr_t* frame_pointer);
 
 /**
  * Returns an array containing all the local variable names and values of
diff --git a/runtime/lib/bigint.dart b/runtime/lib/bigint.dart
index 146c7ca..108b8f7 100644
--- a/runtime/lib/bigint.dart
+++ b/runtime/lib/bigint.dart
@@ -736,15 +736,39 @@
 
   // Accumulate multiply.
   // this[i..i+n-1]: bigint multiplicand.
-  // x: digit multiplier.
+  // x: digit multiplier, 0 <= x < DIGIT_BASE (i.e. 32-bit multiplier).
+  // w[j..j+n-1]: bigint accumulator.
+  // Returns carry out.
+  // w[j..j+n-1] += this[i..i+n-1] * x.
+  // Returns carry out.
+  int _am(int i, int x, _Bigint w, int j, int n) {
+    if (x == 0) {
+      // No-op if x is 0.
+      return 0;
+    }
+    int c = 0;
+    int xl = x & DIGIT2_MASK;
+    int xh = x >> DIGIT2_BITS;
+    while (--n >= 0) {
+      int l = _digits[i] & DIGIT2_MASK;
+      int h = _digits[i++] >> DIGIT2_BITS;
+      int m = xh*l + h*xl;
+      l = xl*l + ((m & DIGIT2_MASK) << DIGIT2_BITS) + w._digits[j] + c;
+      c = (l >> DIGIT_BITS) + (m >> DIGIT2_BITS) + xh*h;
+      w._digits[j++] = l & DIGIT_MASK;
+    }
+    return c;
+  }
+
+  // Accumulate multiply with carry.
+  // this[i..i+n-1]: bigint multiplicand.
+  // x: digit multiplier, 0 <= x < 2*DIGIT_BASE  (i.e. 33-bit multiplier).
   // w[j..j+n-1]: bigint accumulator.
   // c: int carry in.
   // Returns carry out.
   // w[j..j+n-1] += this[i..i+n-1] * x + c.
   // Returns carry out.
-  // TODO(regis): _sqrTo is the only caller passing an x possibly larger than
-  // a digit (2*digit) and passing a non-zero carry in. Refactor?
-  int _am(int i, int x, _Bigint w, int j, int c, int n) {
+  int _amc(int i, int x, _Bigint w, int j, int c, int n) {
     if (x == 0 && c == 0) {
       // No-op if both x and c are 0.
       return 0;
@@ -772,8 +796,7 @@
       r._digits[i] = 0;
     }
     for (i = 0; i < a._used; ++i) {
-      // TODO(regis): Replace _am with addMulVVW.
-      r._digits[i + _used] = _am(0, a._digits[i], r, i, 0, _used);
+      r._digits[i + _used] = _am(0, a._digits[i], r, i, _used);
     }
     r._clamp();
     r._neg = r._used > 0 && _neg != a._neg;  // Zero cannot be negative.
@@ -788,9 +811,9 @@
       r._digits[i] = 0;
     }
     for (i = 0; i < _used - 1; ++i) {
-      var c = _am(i, _digits[i], r, 2*i, 0, 1);
+      var c = _am(i, _digits[i], r, 2*i, 1);
       var d = r._digits[i + _used];
-      d += _am(i + 1, _digits[i] << 1, r, 2*i + 1, c, _used - i - 1);
+      d += _amc(i + 1, _digits[i] << 1, r, 2*i + 1, c, _used - i - 1);
       if (d >= DIGIT_BASE) {
         r._digits[i + _used] = d - DIGIT_BASE;
         r._digits[i + _used + 1] = 1;
@@ -799,7 +822,7 @@
       }
     }
     if (r._used > 0) {
-      r._digits[r._used - 1] += _am(i, _digits[i], r, 2*i, 0, 1);
+      r._digits[r._used - 1] += _am(i, _digits[i], r, 2*i, 1);
     }
     r._neg = false;
     r._clamp();
@@ -864,7 +887,7 @@
       var qd = (r._digits[--i] == y0)
           ? DIGIT_MASK
           : (r._digits[i]*d1 + (r._digits[i - 1] + e)*d2).floor();
-      if ((r._digits[i] += y._am(0, qd, r, j, 0, y_used)) < qd) {  // Try it out
+      if ((r._digits[i] += y._amc(0, qd, r, j, 0, y_used)) < qd) {  // Try it out
         y._dlShiftTo(j, t);
         r._subTo(t, r);
         while (r._digits[i] < --qd) {
@@ -940,56 +963,46 @@
     return result._toValidInt();
   }
 
-  int pow(int exponent) {
-    throw "Bigint.pow not implemented";
-  }
-
   // Overriden operators and methods.
 
   // The following operators override operators of _IntegerImplementation for
   // efficiency, but are not necessary for correctness. They shortcut native
   // calls that would return null because the receiver is _Bigint.
   num operator +(num other) {
-    return other._toBigint()._addFromInteger(this);
+    return other._toBigintOrDouble()._addFromInteger(this);
   }
   num operator -(num other) {
-    return other._toBigint()._subFromInteger(this);
+    return other._toBigintOrDouble()._subFromInteger(this);
   }
   num operator *(num other) {
-    return other._toBigint()._mulFromInteger(this);
+    return other._toBigintOrDouble()._mulFromInteger(this);
   }
   num operator ~/(num other) {
     if ((other is int) && (other == 0)) {
       throw const IntegerDivisionByZeroException();
     }
-    return other._toBigint()._truncDivFromInteger(this);
+    return other._toBigintOrDouble()._truncDivFromInteger(this);
   }
-  num operator /(num other) {
-    return this.toDouble() / other.toDouble();
-  }
-  // TODO(regis): Investigate strange behavior with % double.INFINITY.
-  /*
   num operator %(num other) {
     if ((other is int) && (other == 0)) {
       throw const IntegerDivisionByZeroException();
     }
-    return other._toBigint()._moduloFromInteger(this);
+    return other._toBigintOrDouble()._moduloFromInteger(this);
   }
-  */
   int operator &(int other) {
-    return other._toBigint()._bitAndFromInteger(this);
+    return other._toBigintOrDouble()._bitAndFromInteger(this);
   }
   int operator |(int other) {
-    return other._toBigint()._bitOrFromInteger(this);
+    return other._toBigintOrDouble()._bitOrFromInteger(this);
   }
   int operator ^(int other) {
-    return other._toBigint()._bitXorFromInteger(this);
+    return other._toBigintOrDouble()._bitXorFromInteger(this);
   }
   int operator >>(int other) {
-    return other._toBigint()._shrFromInt(this);
+    return other._toBigintOrDouble()._shrFromInt(this);
   }
   int operator <<(int other) {
-    return other._toBigint()._shlFromInt(this);
+    return other._toBigintOrDouble()._shlFromInt(this);
   }
   // End of operator shortcuts.
 
@@ -1080,31 +1093,137 @@
     return other._toBigint()._compareTo(this) == 0;
   }
 
-  // New method to support crypto.
+  // Return -1/this % DIGIT_BASE, useful for Montgomery reduction.
+  //
+  //         xy == 1 (mod m)
+  //         xy =  1+km
+  //   xy(2-xy) = (1+km)(1-km)
+  // x(y(2-xy)) = 1-k^2 m^2
+  // x(y(2-xy)) == 1 (mod m^2)
+  // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
+  // Should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
+  int _invDigit() {
+    if (_used == 0) return 0;
+    var x = _digits[0];
+    if ((x & 1) == 0) return 0;
+    var y = x & 3;    // y == 1/x mod 2^2
+    y = (y*(2 - (x & 0xf)*y)) & 0xf;  // y == 1/x mod 2^4
+    y = (y*(2 - (x & 0xff)*y)) & 0xff;  // y == 1/x mod 2^8
+    y = (y*(2 - (((x & 0xffff)*y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16
+    // Last step - calculate inverse mod DIGIT_BASE directly;
+    // Assumes 16 < DIGIT_BITS <= 32 and assumes ability to handle 48-bit ints.
+    y = (y*(2 - x*y % DIGIT_BASE)) % DIGIT_BASE;    // y == 1/x mod DIGIT_BASE
+    // We really want the negative inverse, and - DIGIT_BASE < y < DIGIT_BASE.
+    return (y > 0) ? DIGIT_BASE - y : -y;
+  }
 
-  // Return this.pow(e) mod m, with 256 <= e < 1<<32.
+  // TODO(regis): Make this method private once the plumbing to invoke it from
+  // dart:math is in place.
+  // Return pow(this, e) % m.
   int modPow(int e, int m) {
+    // TODO(regis): Where/how do we handle values of e smaller than 256?
+    // TODO(regis): Where/how do we handle even values of m?
     assert(e >= 256 && !m.isEven());
-    if (e >= (1 << 32)) {
-      throw "Bigint.modPow with exponent larger than 32-bit not implemented";
+    if (e is! _Bigint) {
+      _Reduction z = new _Montgomery(m);
+      var r = new _Bigint();
+      var r2 = new _Bigint();
+      var g = z._convert(this);
+      int i = _nbits(e) - 1;
+      g._copyTo(r);
+      while (--i >= 0) {
+        z._sqrTo(r, r2);
+        if ((e & (1 << i)) > 0) {
+          z._mulTo(r2, g, r);
+        } else {
+          var t = r;
+          r = r2;
+          r2 = t;
+        }
+      }
+      return z._revert(r)._toValidInt();
     }
+    var i = e.bitLength;
+    var k;
+    var r = new _Bigint()._setInt(1);
+    if (i <= 0) return r;
+    // TODO(regis): Are these values of k really optimal for our implementation?
+    else if (i < 18) k = 1;
+    else if (i < 48) k = 3;
+    else if (i < 144) k = 4;
+    else if (i < 768) k = 5;
+    else k = 6;
     _Reduction z = new _Montgomery(m);
-    var r = new _Bigint();
-    var r2 = new _Bigint();
-    var g = z.convert(this);
-    int i = _nbits(e) - 1;
-    g._copyTo(r);
-    while (--i >= 0) {
-      z.sqrTo(r, r2);
-      if ((e & (1 << i)) > 0) {
-        z.mulTo(r2, g, r);
-      } else {
-        var t = r;
-        r = r2;
-        r2 = t;
+    var n = 3;
+    var k1 = k - 1;
+    var km = (1 << k) - 1;
+    List g = new List(km + 1);
+    g[1] = z._convert(this);
+    if (k > 1) {
+      var g2 = new _Bigint();
+      z._sqrTo(g[1], g2);
+      while (n <= km) {
+        g[n] = new _Bigint();
+        z._mulTo(g2, g[n - 2], g[n]);
+        n += 2;
       }
     }
-    return z.revert(r)._toValidInt();
+    var j = e._used - 1;
+    var w;
+    var is1 = true;
+    var r2 = new _Bigint();
+    var t;
+    i = _nbits(e._digits[j]) - 1;
+    while (j >= 0) {
+      if (i >= k1) {
+        w = (e._digits[j] >> (i - k1)) & km;
+      } else {
+        w = (e._digits[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
+        if (j > 0) {
+          w |= e._digits[j - 1] >> (DIGIT_BITS + i - k1);
+        }
+      }
+      n = k;
+      while ((w & 1) == 0) {
+        w >>= 1;
+        --n;
+      }
+      if ((i -= n) < 0) {
+        i += DIGIT_BITS;
+        --j;
+      }
+      if (is1) {  // r == 1, don't bother squaring or multiplying it.
+        g[w]._copyTo(r);
+        is1 = false;
+      }
+      else {
+        while (n > 1) {
+          z._sqrTo(r, r2);
+          z._sqrTo(r2, r);
+          n -= 2;
+        }
+        if (n > 0) {
+          z._sqrTo(r, r2);
+        } else {
+          t = r;
+          r = r2;
+          r2 = t;
+        }
+        z._mulTo(r2,g[w], r);
+      }
+
+      while (j >= 0 && (e._digits[j] & (1 << i)) == 0) {
+        z._sqrTo(r, r2);
+        t = r;
+        r = r2;
+        r2 = t;
+        if (--i < 0) {
+          i = DIGIT_BITS - 1;
+          --j;
+        }
+      }
+    }
+    return z._revert(r)._toValidInt();
   }
 }
 
@@ -1174,8 +1293,8 @@
       // Use _am to combine the multiply-shift-add into one call.
       j = i + _m._used;
       var digit = x._digits[j];
-      digit += _m ._am(0, u0, x, i, 0, _m ._used);
-      // propagate carry
+      digit += _m ._am(0, u0, x, i, _m._used);
+      // Propagate carry.
       while (digit >= _Bigint.DIGIT_BASE) {
         digit -= _Bigint.DIGIT_BASE;
         x._digits[j++] = digit;
diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
index 3b77aaa..95f026d 100644
--- a/runtime/lib/double.dart
+++ b/runtime/lib/double.dart
@@ -134,7 +134,7 @@
   }
 
   int toInt() native "Double_toInt";
-  _Bigint _toBigint() { return toInt()._toBigint(); }
+  num _toBigintOrDouble() { return this; }
   double toDouble() { return this; }
 
   static const int CACHE_SIZE_LOG2 = 3;
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index eb166ef..3e9fa095 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -201,6 +201,7 @@
   int toInt() { return this; }
   double toDouble() { return new _Double.fromInteger(this); }
   _Bigint _toBigint() { return new _Bigint()._setInt(this); }
+  num _toBigintOrDouble() { return _toBigint(); }
 
   String toStringAsFixed(int fractionDigits) {
     return this.toDouble().toStringAsFixed(fractionDigits);
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 2573b9a..bb147a1 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -218,7 +218,7 @@
 }
 
 
-static int32_t StringValueAt(const String& str, const Integer& index) {
+static uint16_t StringValueAt(const String& str, const Integer& index) {
   if (index.IsSmi()) {
     const intptr_t index_value = Smi::Cast(index).Value();
     if ((0 <= index_value) && (index_value < str.Length())) {
@@ -235,20 +235,17 @@
 DEFINE_NATIVE_ENTRY(String_charAt, 2) {
   const String& receiver = String::CheckedHandle(arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
-  uint32_t value = StringValueAt(receiver, index);
-  ASSERT(value <= 0x10FFFF);
-  return Symbols::FromCharCode(value);
+  uint16_t value = StringValueAt(receiver, index);
+  return Symbols::FromCharCode(static_cast<int32_t>(value));
 }
 
 
+// Returns the 16-bit UTF-16 code unit at the given index.
 DEFINE_NATIVE_ENTRY(String_codeUnitAt, 2) {
   const String& receiver = String::CheckedHandle(arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
-
-  int32_t value = StringValueAt(receiver, index);
-  ASSERT(value >= 0);
-  ASSERT(value <= 0xFFFF);
-  return Smi::New(value);
+  uint16_t value = StringValueAt(receiver, index);
+  return Smi::New(static_cast<intptr_t>(value));
 }
 
 
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 3ac78a8..9a454b1 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -518,6 +518,14 @@
     return buffer.toString();
   }
 
+  // Convert single object to string.
+  static String _interpolateSingle(Object o) {
+    final s = o.toString();
+    if (s is! String) {
+      throw new ArgumentError(o);
+    }
+    return s;
+  }
 
   /**
    * Convert all objects in [values] to strings and concat them
diff --git a/runtime/platform/json.cc b/runtime/platform/json.cc
index a406e7a..6457a87 100644
--- a/runtime/platform/json.cc
+++ b/runtime/platform/json.cc
@@ -527,44 +527,6 @@
 }
 
 
-void TextBuffer::AddUTF8(uint32_t ch) {
-  static const uint32_t kMaxOneByteChar   = 0x7F;
-  static const uint32_t kMaxTwoByteChar   = 0x7FF;
-  static const uint32_t kMaxThreeByteChar = 0xFFFF;
-  static const uint32_t kMaxFourByteChar  = 0x10FFFF;
-  static const uint32_t kMask = ~(1 << 6);
-
-  if (ch <= kMaxOneByteChar) {
-    EnsureCapacity(1);
-    buf_[msg_len_++] = ch;
-    buf_[msg_len_] = '\0';
-    return;
-  }
-  if (ch <= kMaxTwoByteChar) {
-    EnsureCapacity(2);
-    buf_[msg_len_++] = 0xC0 | (ch >> 6);
-    buf_[msg_len_++] = 0x80 | (ch & kMask);
-    buf_[msg_len_] = '\0';
-    return;
-  }
-  if (ch <= kMaxThreeByteChar) {
-    EnsureCapacity(3);
-    buf_[msg_len_++] = 0xE0 | (ch >> 12);
-    buf_[msg_len_++] = 0x80 | ((ch >> 6) & kMask);
-    buf_[msg_len_++] = 0x80 | (ch & kMask);
-    buf_[msg_len_] = '\0';
-    return;
-  }
-  ASSERT(ch <= kMaxFourByteChar);
-  EnsureCapacity(4);
-  buf_[msg_len_++] = 0xF0 | (ch >> 18);
-  buf_[msg_len_++] = 0x80 | ((ch >> 12) & kMask);
-  buf_[msg_len_++] = 0x80 | ((ch >> 6) & kMask);
-  buf_[msg_len_++] = 0x80 | (ch & kMask);
-  buf_[msg_len_] = '\0';
-}
-
-
 intptr_t TextBuffer::Printf(const char* format, ...) {
   va_list args;
   va_start(args, format);
@@ -588,8 +550,10 @@
 }
 
 
-void TextBuffer::AddEscapedChar(uint32_t cp) {
-  switch (cp) {
+// Write a UTF-16 code unit so it can be read by a JSON parser in a string
+// literal. Use escape sequences for characters other than printable ASCII.
+void TextBuffer::EscapeAndAddCodeUnit(uint32_t codeunit) {
+  switch (codeunit) {
     case '"':
       Printf("%s", "\\\"");
       break;
@@ -615,15 +579,26 @@
       Printf("%s", "\\t");
       break;
     default:
-      if (cp < 0x20) {
+      if (codeunit < 0x20) {
         // Encode character as \u00HH.
-        uint32_t digit2 = (cp >> 4) & 0xf;
-        uint32_t digit3 = (cp & 0xf);
+        uint32_t digit2 = (codeunit >> 4) & 0xf;
+        uint32_t digit3 = (codeunit & 0xf);
         Printf("\\u00%c%c",
                digit2 > 9 ? 'A' + (digit2 - 10) : '0' + digit2,
                digit3 > 9 ? 'A' + (digit3 - 10) : '0' + digit3);
+      } else if (codeunit > 127) {
+        // Encode character as \uHHHH.
+        uint32_t digit0 = (codeunit >> 12) & 0xf;
+        uint32_t digit1 = (codeunit >> 8) & 0xf;
+        uint32_t digit2 = (codeunit >> 4) & 0xf;
+        uint32_t digit3 = (codeunit & 0xf);
+        Printf("\\u%c%c%c%c",
+               digit0 > 9 ? 'A' + (digit0 - 10) : '0' + digit0,
+               digit1 > 9 ? 'A' + (digit1 - 10) : '0' + digit1,
+               digit2 > 9 ? 'A' + (digit2 - 10) : '0' + digit2,
+               digit3 > 9 ? 'A' + (digit3 - 10) : '0' + digit3);
       } else {
-        AddUTF8(cp);
+        AddChar(codeunit);
       }
   }
 }
@@ -637,7 +612,7 @@
 void TextBuffer::AddEscapedString(const char* s) {
   intptr_t len = strlen(s);
   for (int i = 0; i < len; i++) {
-    AddEscapedChar(s[i]);
+    EscapeAndAddCodeUnit(s[i]);
   }
 }
 
diff --git a/runtime/platform/json.h b/runtime/platform/json.h
index 36c7d5d..35e975f0 100644
--- a/runtime/platform/json.h
+++ b/runtime/platform/json.h
@@ -126,8 +126,7 @@
 
   intptr_t Printf(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
   void AddChar(char ch);
-  void AddUTF8(uint32_t ch);
-  void AddEscapedChar(uint32_t ch);
+  void EscapeAndAddCodeUnit(uint32_t cu);
   void AddString(const char* s);
   void AddEscapedString(const char* s);
 
diff --git a/runtime/platform/platform_headers.gypi b/runtime/platform/platform_headers.gypi
index 514ad08..f760fd0 100644
--- a/runtime/platform/platform_headers.gypi
+++ b/runtime/platform/platform_headers.gypi
@@ -13,10 +13,6 @@
     'json.h',
     'floating_point.h',
     'floating_point_win.h',
-    'thread.h',
-    'thread_linux.h',
-    'thread_macos.h',
-    'thread_win.h',
     'utils.h',
   ],
 }
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index de4a1c4..03a0715 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -32,7 +32,6 @@
 cc/ThreadInterrupterMedium: Skip
 cc/ThreadInterrupterLow: Skip
 cc/Service_Profile: Skip
-cc/ToCStringTruncated: Fail # Issue 20874
 
 [ $system == linux ]
 cc/ThreadInterrupterHigh: Skip
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 5d69702..a135048 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -1507,6 +1507,7 @@
 void Assembler::LoadWordFromPoolOffset(Register rd,
                                        int32_t offset,
                                        Condition cond) {
+  ASSERT(allow_constant_pool());
   ASSERT(rd != PP);
   int32_t offset_mask = 0;
   if (Address::CanHoldLoadOffset(kWord, offset, &offset_mask)) {
@@ -1539,7 +1540,7 @@
   // Smis and VM heap objects are never relocated; do not use object pool.
   if (object.IsSmi()) {
     LoadImmediate(rd, reinterpret_cast<int32_t>(object.raw()), cond);
-  } else if (object.InVMHeap()) {
+  } else if (object.InVMHeap() || !allow_constant_pool()) {
     // Make sure that class CallPattern is able to decode this load immediate.
     const int32_t object_raw = reinterpret_cast<int32_t>(object.raw());
     LoadImmediate(rd, object_raw, cond);
@@ -2256,11 +2257,23 @@
 void Assembler::Asr(Register rd, Register rm, uint32_t shift_imm,
                     Condition cond) {
   ASSERT(shift_imm != 0);  // Do not use Asr if no shift is wanted.
-  if (shift_imm == 32) shift_imm = 0;  // Comply to UAL syntax.
+  if (shift_imm == 32) {
+    shift_imm = 0;  // Comply to UAL syntax.
+  }
   mov(rd, Operand(rm, ASR, shift_imm), cond);
 }
 
 
+void Assembler::Asrs(Register rd, Register rm, uint32_t shift_imm,
+                     Condition cond) {
+  ASSERT(shift_imm != 0);  // Do not use Asr if no shift is wanted.
+  if (shift_imm == 32) {
+    shift_imm = 0;  // Comply to UAL syntax.
+  }
+  movs(rd, Operand(rm, ASR, shift_imm), cond);
+}
+
+
 void Assembler::Asr(Register rd, Register rm, Register rs, Condition cond) {
   mov(rd, Operand(rm, ASR, rs), cond);
 }
@@ -2726,7 +2739,7 @@
 
 
 void Assembler::AddImmediateSetFlags(Register rd, Register rn, int32_t value,
-                                    Condition cond) {
+                                     Condition cond) {
   Operand o;
   if (Operand::CanHold(value, &o)) {
     // Handles value == kMinInt32.
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 9a08c8e..da452b6 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -295,7 +295,9 @@
         object_pool_(GrowableObjectArray::Handle()),
         prologue_offset_(-1),
         use_far_branches_(use_far_branches),
-        comments_() { }
+        comments_(),
+        allow_constant_pool_(true) { }
+
   ~Assembler() { }
 
   void PopRegister(Register r) { Pop(r); }
@@ -717,6 +719,7 @@
   void Lsr(Register rd, Register rm, Register rs, Condition cond = AL);
   void Asr(Register rd, Register rm, uint32_t shift_imm, Condition cond = AL);
   void Asr(Register rd, Register rm, Register rs, Condition cond = AL);
+  void Asrs(Register rd, Register rm, uint32_t shift_imm, Condition cond = AL);
   void Ror(Register rd, Register rm, uint32_t shift_imm, Condition cond = AL);
   void Ror(Register rd, Register rm, Register rs, Condition cond = AL);
   void Rrx(Register rd, Register rm, Condition cond = AL);
@@ -734,6 +737,10 @@
     Lsl(reg, reg, kSmiTagSize, cond);
   }
 
+  void SmiTag(Register dst, Register src, Condition cond = AL) {
+    Lsl(dst, src, kSmiTagSize, cond);
+  }
+
   void SmiUntag(Register reg, Condition cond = AL) {
     Asr(reg, reg, kSmiTagSize, cond);
   }
@@ -742,6 +749,16 @@
     Asr(dst, src, kSmiTagSize, cond);
   }
 
+  // Untag the value in the register assuming it is a smi.
+  // Untagging shifts tag bit into the carry flag - if carry is clear
+  // assumption was correct. In this case jump to the is_smi label.
+  // Otherwise fall-through.
+  void SmiUntag(Register dst, Register src, Label* is_smi) {
+    ASSERT(kSmiTagSize == 1);
+    Asrs(dst, src, kSmiTagSize);
+    b(is_smi, CC);
+  }
+
   // Function frame setup and tear down.
   void EnterFrame(RegList regs, intptr_t frame_space);
   void LeaveFrame(RegList regs);
@@ -828,6 +845,13 @@
   static bool IsSafe(const Object& object) { return true; }
   static bool IsSafeSmi(const Object& object) { return object.IsSmi(); }
 
+  bool allow_constant_pool() const {
+    return allow_constant_pool_;
+  }
+  void set_allow_constant_pool(bool b) {
+    allow_constant_pool_ = b;
+  }
+
  private:
   AssemblerBuffer buffer_;  // Contains position independent code.
   GrowableObjectArray& object_pool_;  // Objects and patchable jump targets.
@@ -858,6 +882,8 @@
 
   GrowableArray<CodeComment*> comments_;
 
+  bool allow_constant_pool_;
+
   void EmitType01(Condition cond,
                   int type,
                   Opcode opcode,
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index cde458c..3f7986a 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -31,7 +31,8 @@
       patchable_pool_entries_(),
       prologue_offset_(-1),
       use_far_branches_(use_far_branches),
-      comments_() {
+      comments_(),
+      allow_constant_pool_(true) {
   if (Isolate::Current() != Dart::vm_isolate()) {
     object_pool_ = GrowableObjectArray::New(Heap::kOld);
 
@@ -487,7 +488,20 @@
 }
 
 
+// A set of VM objects that are present in every constant pool.
+static bool IsAlwaysInConstantPool(const Object& object) {
+  // TODO(zra): Evaluate putting all VM heap objects into the pool.
+  return (object.raw() == Object::null())
+      || (object.raw() == Bool::True().raw())
+      || (object.raw() == Bool::False().raw());
+}
+
+
 bool Assembler::CanLoadObjectFromPool(const Object& object) {
+  if (!allow_constant_pool()) {
+    return IsAlwaysInConstantPool(object);
+  }
+
   // TODO(zra, kmillikin): Also load other large immediates from the object
   // pool
   if (object.IsSmi()) {
@@ -500,14 +514,14 @@
   return (Isolate::Current() != Dart::vm_isolate()) &&
          // Not in the VMHeap, OR is one of the VMHeap objects we put in every
          // object pool.
-         // TODO(zra): Evaluate putting all VM heap objects into the pool.
-         (!object.InVMHeap() || (object.raw() == Object::null()) ||
-                                (object.raw() == Bool::True().raw()) ||
-                                (object.raw() == Bool::False().raw()));
+         (!object.InVMHeap() || IsAlwaysInConstantPool(object));
 }
 
 
 bool Assembler::CanLoadImmediateFromPool(int64_t imm, Register pp) {
+  if (!allow_constant_pool()) {
+    return false;
+  }
   return !Utils::IsInt(32, imm) &&
          (pp != kNoPP) &&
          // We *could* put constants in the pool in a VM isolate, but it is
@@ -567,7 +581,9 @@
 
 
 void Assembler::LoadDecodableImmediate(Register reg, int64_t imm, Register pp) {
-  if ((pp != kNoPP) && (Isolate::Current() != Dart::vm_isolate())) {
+  if ((pp != kNoPP) &&
+      (Isolate::Current() != Dart::vm_isolate()) &&
+      allow_constant_pool()) {
     int64_t val_smi_tag = imm & kSmiTagMask;
     imm &= ~kSmiTagMask;  // Mask off the tag bits.
     const int32_t offset = Array::element_offset(FindImmediate(imm));
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index 4b5b635..e960df7 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -1147,6 +1147,13 @@
     kNotPatchable,
   };
 
+  bool allow_constant_pool() const {
+    return allow_constant_pool_;
+  }
+  void set_allow_constant_pool(bool b) {
+    allow_constant_pool_ = b;
+  }
+
   void LoadWordFromPoolOffset(Register dst, Register pp, uint32_t offset);
   void LoadWordFromPoolOffsetFixed(Register dst, Register pp, uint32_t offset);
   intptr_t FindExternalLabel(const ExternalLabel* label,
@@ -1315,6 +1322,8 @@
 
   GrowableArray<CodeComment*> comments_;
 
+  bool allow_constant_pool_;
+
   void AddSubHelper(OperandSize os, bool set_flags, bool subtract,
                     Register rd, Register rn, Operand o) {
     ASSERT((rd != R31) && (rn != R31));
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index d9c372a..5b8b619 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2761,6 +2761,26 @@
 }
 
 
+void Assembler::SmiUntagOrCheckClass(Register object,
+                                     intptr_t class_id,
+                                     Register scratch,
+                                     Label* is_smi) {
+  ASSERT(kSmiTagShift == 1);
+  ASSERT(RawObject::kClassIdTagPos == 16);
+  ASSERT(RawObject::kClassIdTagSize == 16);
+  const intptr_t class_id_offset = Object::tags_offset() +
+      RawObject::kClassIdTagPos / kBitsPerByte;
+
+  // Untag optimistically. Tag bit is shifted into the CARRY.
+  SmiUntag(object);
+  j(NOT_CARRY, is_smi, kNearJump);
+  // Load cid: can't use LoadClassId, object is untagged. Use TIMES_2 scale
+  // factor in the addressing mode to compensate for this.
+  movzxw(scratch, Address(object, TIMES_2, class_id_offset));
+  cmpl(scratch, Immediate(class_id));
+}
+
+
 void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
   ASSERT(result != object);
   static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index 6201cae..30fc201 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -697,6 +697,11 @@
   void LoadTaggedClassIdMayBeSmi(Register result,
                                  Register object);
 
+  void SmiUntagOrCheckClass(Register object,
+                            intptr_t class_id,
+                            Register scratch,
+                            Label* is_smi);
+
   static Address ElementAddressForIntIndex(bool is_external,
                                            intptr_t cid,
                                            intptr_t index_scale,
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 4e9243f..60f9f5c 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -355,6 +355,7 @@
 
 
 void Assembler::LoadWordFromPoolOffset(Register rd, int32_t offset) {
+  ASSERT(allow_constant_pool());
   ASSERT(!in_delay_slot_);
   ASSERT(rd != PP);
   if (Address::CanHoldOffset(offset)) {
@@ -460,7 +461,7 @@
   // Smis and VM heap objects are never relocated; do not use object pool.
   if (object.IsSmi()) {
     LoadImmediate(rd, reinterpret_cast<int32_t>(object.raw()));
-  } else if (object.InVMHeap()) {
+  } else if (object.InVMHeap() || !allow_constant_pool()) {
     // Make sure that class CallPattern is able to decode this load immediate.
     int32_t object_raw = reinterpret_cast<int32_t>(object.raw());
     const uint16_t object_low = Utils::Low16Bits(object_raw);
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index fbc52dc..eb8c28e 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -144,7 +144,8 @@
         use_far_branches_(use_far_branches),
         delay_slot_available_(false),
         in_delay_slot_(false),
-        comments_() { }
+        comments_(),
+        allow_constant_pool_(true) { }
   ~Assembler() { }
 
   void PopRegister(Register r) { Pop(r); }
@@ -856,7 +857,9 @@
       const uint16_t low = Utils::Low16Bits(value);
       const uint16_t high = Utils::High16Bits(value);
       lui(rd, Immediate(high));
-      ori(rd, rd, Immediate(low));
+      if (low != 0) {
+        ori(rd, rd, Immediate(low));
+      }
     }
   }
 
@@ -1125,6 +1128,10 @@
     sll(reg, reg, kSmiTagSize);
   }
 
+  void SmiTag(Register dst, Register src) {
+    sll(dst, src, kSmiTagSize);
+  }
+
   void SmiUntag(Register reg) {
     sra(reg, reg, kSmiTagSize);
   }
@@ -1251,6 +1258,13 @@
   static bool IsSafe(const Object& object) { return true; }
   static bool IsSafeSmi(const Object& object) { return object.IsSmi(); }
 
+  bool allow_constant_pool() const {
+    return allow_constant_pool_;
+  }
+  void set_allow_constant_pool(bool b) {
+    allow_constant_pool_ = b;
+  }
+
  private:
   AssemblerBuffer buffer_;
   GrowableObjectArray& object_pool_;  // Objects and patchable jump targets.
@@ -1280,6 +1294,8 @@
 
   GrowableArray<CodeComment*> comments_;
 
+  bool allow_constant_pool_;
+
   void Emit(int32_t value) {
     // Emitting an instruction clears the delay slot state.
     in_delay_slot_ = false;
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 3d4e9ff..a181206 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -25,7 +25,8 @@
       object_pool_(GrowableObjectArray::Handle()),
       patchable_pool_entries_(),
       prologue_offset_(-1),
-      comments_() {
+      comments_(),
+      allow_constant_pool_(true) {
   // Far branching mode is only needed and implemented for MIPS and ARM.
   ASSERT(!use_far_branches);
   Isolate* isolate = Isolate::Current();
@@ -148,6 +149,7 @@
 
 
 void Assembler::CallPatchable(const ExternalLabel* label) {
+  ASSERT(allow_constant_pool());
   intptr_t call_start = buffer_.GetPosition();
   LoadExternalLabel(TMP, label, kPatchable, PP);
   call(TMP);
@@ -2368,6 +2370,7 @@
 
 
 void Assembler::JmpPatchable(const ExternalLabel* label, Register pp) {
+  ASSERT(allow_constant_pool());
   intptr_t call_start = buffer_.GetPosition();
   LoadExternalLabel(TMP, label, kPatchable, pp);
   jmp(TMP);
@@ -2588,7 +2591,20 @@
 }
 
 
+// A set of VM objects that are present in every constant pool.
+static bool IsAlwaysInConstantPool(const Object& object) {
+  // TODO(zra): Evaluate putting all VM heap objects into the pool.
+  return (object.raw() == Object::null())
+      || (object.raw() == Bool::True().raw())
+      || (object.raw() == Bool::False().raw());
+}
+
+
 bool Assembler::CanLoadFromObjectPool(const Object& object) {
+  if (!allow_constant_pool()) {
+    return IsAlwaysInConstantPool(object);
+  }
+
   // TODO(zra, kmillikin): Also load other large immediates from the object
   // pool
   if (object.IsSmi()) {
@@ -2601,10 +2617,7 @@
   return (Isolate::Current() != Dart::vm_isolate()) &&
          // Not in the VMHeap, OR is one of the VMHeap objects we put in every
          // object pool.
-         // TODO(zra): Evaluate putting all VM heap objects into the pool.
-         (!object.InVMHeap() || (object.raw() == Object::null()) ||
-                                (object.raw() == Bool::True().raw()) ||
-                                (object.raw() == Bool::False().raw()));
+         (!object.InVMHeap() || IsAlwaysInConstantPool(object));
 }
 
 
@@ -2672,6 +2685,9 @@
 
 
 bool Assembler::CanLoadImmediateFromPool(const Immediate& imm, Register pp) {
+  if (!allow_constant_pool()) {
+    return false;
+  }
   return !imm.is_int32() &&
          (pp != kNoRegister) &&
          (Isolate::Current() != Dart::vm_isolate());
@@ -3432,6 +3448,25 @@
 }
 
 
+void Assembler::SmiUntagOrCheckClass(Register object,
+                                     intptr_t class_id,
+                                     Label* is_smi) {
+  ASSERT(kSmiTagShift == 1);
+  ASSERT(RawObject::kClassIdTagPos == 16);
+  ASSERT(RawObject::kClassIdTagSize == 16);
+  const intptr_t class_id_offset = Object::tags_offset() +
+      RawObject::kClassIdTagPos / kBitsPerByte;
+
+  // Untag optimistically. Tag bit is shifted into the CARRY.
+  SmiUntag(object);
+  j(NOT_CARRY, is_smi, kNearJump);
+  // Load cid: can't use LoadClassId, object is untagged. Use TIMES_2 scale
+  // factor in the addressing mode to compensate for this.
+  movzxw(TMP, Address(object, TIMES_2, class_id_offset));
+  cmpl(TMP, Immediate(class_id));
+}
+
+
 void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
   ASSERT(result != object);
 
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index e66f1c9..5396d97 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -688,6 +688,13 @@
     kNotPatchable,
   };
 
+  bool allow_constant_pool() const {
+    return allow_constant_pool_;
+  }
+  void set_allow_constant_pool(bool b) {
+    allow_constant_pool_ = b;
+  }
+
   bool CanLoadImmediateFromPool(const Immediate& imm, Register pp);
   void LoadImmediate(Register reg, const Immediate& imm, Register pp);
   void LoadImmediate(const Address& dst, const Immediate& imm, Register pp);
@@ -754,6 +761,10 @@
 
   void LoadTaggedClassIdMayBeSmi(Register result, Register object);
 
+  // CheckClassIs fused with optimistic SmiUntag.
+  // Value in the register object is untagged optimistically.
+  void SmiUntagOrCheckClass(Register object, intptr_t class_id, Label* smi);
+
   /*
    * Misc. functionality.
    */
@@ -983,6 +994,7 @@
   };
 
   GrowableArray<CodeComment*> comments_;
+  bool allow_constant_pool_;
 
   intptr_t FindObject(const Object& obj, Patchability patchable);
   intptr_t FindExternalLabel(const ExternalLabel* label,
diff --git a/runtime/vm/bigint_test.cc b/runtime/vm/bigint_test.cc
new file mode 100644
index 0000000..b4e9cdd
--- /dev/null
+++ b/runtime/vm/bigint_test.cc
@@ -0,0 +1,656 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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/object.h"
+#include "vm/object_store.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+static uword ZoneAllocator(intptr_t size) {
+  Zone* zone = Isolate::Current()->current_zone();
+  return zone->AllocUnsafe(size);
+}
+
+
+TEST_CASE(BigintSmi) {
+  {
+    const Smi& smi = Smi::Handle(Smi::New(5));
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
+    EXPECT_EQ(5, bigint.AsInt64Value());
+    EXPECT(bigint.FitsIntoSmi());
+    Smi& smi_back = Smi::Handle();
+    smi_back ^= bigint.AsValidInteger();
+    EXPECT_EQ(5, smi_back.Value());
+  }
+
+  {
+    const Smi& smi = Smi::Handle(Smi::New(Smi::kMaxValue));
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
+    EXPECT(Smi::kMaxValue == bigint.AsInt64Value());
+    EXPECT(bigint.FitsIntoSmi());
+    Smi& smi_back = Smi::Handle();
+    smi_back ^= bigint.AsValidInteger();
+    EXPECT(Smi::kMaxValue == smi_back.Value());
+  }
+
+  {
+    const Smi& smi = Smi::Handle(Smi::New(Smi::kMinValue));
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
+    EXPECT(bigint.IsNegative());
+    EXPECT(Smi::kMinValue == bigint.AsInt64Value());
+    EXPECT(bigint.FitsIntoSmi());
+    Smi& smi_back = Smi::Handle();
+    smi_back ^= bigint.AsValidInteger();
+    EXPECT(Smi::kMinValue == smi_back.Value());
+  }
+
+  {
+    ASSERT(0xFFFFFFF < Smi::kMaxValue);
+    const Smi& smi = Smi::Handle(Smi::New(0xFFFFFFF));
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
+    EXPECT_EQ(0xFFFFFFF, bigint.AsInt64Value());
+    EXPECT(bigint.FitsIntoSmi());
+    Smi& smi_back = Smi::Handle();
+    smi_back ^= bigint.AsValidInteger();
+    EXPECT_EQ(0xFFFFFFF, smi_back.Value());
+  }
+
+  {
+    ASSERT(0x10000000 < Smi::kMaxValue);
+    const Smi& smi = Smi::Handle(Smi::New(0x10000000));
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
+    EXPECT_EQ(0x10000000, bigint.AsInt64Value());
+    EXPECT(bigint.FitsIntoSmi());
+    Smi& smi_back = Smi::Handle();
+    smi_back ^= bigint.AsValidInteger();
+    EXPECT(0x10000000 == smi_back.Value());
+  }
+}
+
+
+TEST_CASE(BigintInt64) {
+  const int64_t kValue = 100000000;
+  const int64_t kValue64 = kValue * kValue;
+  Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(kValue));
+  EXPECT_EQ(kValue, bigint.AsInt64Value());
+  bigint = Bigint::NewFromInt64(kValue64);
+  EXPECT_EQ(kValue64, bigint.AsInt64Value());
+  bigint = Bigint::NewFromInt64(-kValue64);
+  EXPECT_EQ(-kValue64, bigint.AsInt64Value());
+  bigint = Bigint::NewFromInt64(kMinInt64);
+  EXPECT(bigint.FitsIntoInt64());
+  EXPECT_EQ(kMinInt64, bigint.AsInt64Value());
+}
+
+
+TEST_CASE(BigintUint64) {
+  const Bigint& one = Bigint::Handle(Bigint::NewFromUint64(1));
+  EXPECT(one.FitsIntoInt64());
+  EXPECT(one.FitsIntoUint64());
+
+  const Bigint& big = Bigint::Handle(Bigint::NewFromUint64(kMaxUint64));
+  EXPECT(!big.FitsIntoInt64());
+  EXPECT(big.FitsIntoUint64());
+
+  uint64_t back = big.AsUint64Value();
+  EXPECT_EQ(kMaxUint64, back);
+}
+
+
+TEST_CASE(BigintDouble) {
+  Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(5));
+  EXPECT_EQ(5.0, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromInt64(0);
+  EXPECT_EQ(0.0, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromInt64(-12345678);
+  EXPECT_EQ(-1.2345678e+7, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("1");
+  EXPECT_EQ(1.0, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("123456");
+  EXPECT_EQ(123456.0, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("123456789");
+  EXPECT_EQ(123456789.0, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("12345678901234567");
+  EXPECT_EQ(12345678901234568.0, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("98765432109876");
+  EXPECT_EQ(9.8765432109876e+13, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x17777777777778");
+  EXPECT_EQ(6605279453476728.0, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x37777777777778");
+  EXPECT_EQ(15612478708217720.0, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x177777777777781234567");
+  EXPECT_EQ(1.7730912021014563e+24, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x177777777777788000000");
+  EXPECT_EQ(1.7730912021014563e+24, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x177777777777788000001");
+  EXPECT_EQ(1.7730912021014565e+24, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x177777777777798000000");
+  EXPECT_EQ(1.7730912021014568e+24, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x177777777777798000001");
+  EXPECT_EQ(1.7730912021014568e+24, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x377777777777790000000");
+  EXPECT_EQ(4.1909428413307146e+24, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x377777777777790000001");
+  EXPECT_EQ(4.190942841330715e+24, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x377777777777730000000");
+  EXPECT_EQ(4.1909428413307135e+24, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("0x377777777777730000001");
+  EXPECT_EQ(4.1909428413307135e+24, bigint.AsDoubleValue());
+
+  // Reduced precision.
+  bigint = Bigint::NewFromCString(
+      "9876543210987654321098765432109876543210");
+  EXPECT_EQ(9.8765432109876546e+39, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString(
+      "12345678901234567890123456789012345678901234567890"
+      "12345678901234567890123456789012345678901234567890"
+      "12345678901234567890123456789012345678901234567890"
+      "12345678901234567890123456789012345678901234567890"
+      "12345678901234567890123456789012345678901234567890"
+      "12345678901234567890123456789012345678901234567890"
+      "12345678901234567890123456789012345678901234567890"
+      "12345678901234567890123456789012345678901234567890"
+      "12345678901234567890123456789012345678901234567890"
+      "12345678901234567890123456789012345678901234567890");
+  double zero = 0.0;
+  EXPECT_EQ(1.0/zero, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString(
+      "17976931348623157081452742373170435679807056752584"
+      "49965989174768031572607800285387605895586327668781"
+      "71540458953514382464234321326889464182768467546703"
+      "53751698604991057655128207624549009038932894407586"
+      "85084551339423045832369032229481658085593321233482"
+      "74797826204144723168738177180919299881250404026184"
+      "124858368");
+  EXPECT_EQ(1.7976931348623157e308, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString(
+      "17976931348623159077293051907890247336179769789423"
+      "06572734300811577326758055009631327084773224075360"
+      "21120113879871393357658789768814416622492847430639"
+      "47412437776789342486548527630221960124609411945308"
+      "29520850057688381506823424628814739131105408272371"
+      "63350510684586298239947245938479716304835356329624"
+      "224137216");
+  EXPECT_EQ(1.0/zero, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString(
+      "17976931348623158079372897140530341507993413271003"
+      "78269361737789804449682927647509466490179775872070"
+      "96330286416692887910946555547851940402630657488671"
+      "50582068190890200070838367627385484581771153176447"
+      "57302700698555713669596228429148198608349364752927"
+      "19074168444365510704342711559699508093042880177904"
+      "174497792");
+  EXPECT_EQ(1.0/zero, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString(
+      "17976931348623158079372897140530341507993413271003"
+      "78269361737789804449682927647509466490179775872070"
+      "96330286416692887910946555547851940402630657488671"
+      "50582068190890200070838367627385484581771153176447"
+      "57302700698555713669596228429148198608349364752927"
+      "19074168444365510704342711559699508093042880177904"
+      "174497791");
+  EXPECT_EQ(1.7976931348623157e308, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("100000000000000000000000");
+  EXPECT_EQ(1e+23, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString("100000000000000000000001");
+  EXPECT_EQ(1.0000000000000001e+23, bigint.AsDoubleValue());
+
+  // Same but shifted 64 bits to the left.
+  bigint = Bigint::NewFromCString(
+      "1844674407370955161600000000000000000000000");
+  EXPECT_EQ(1.844674407370955e+42, bigint.AsDoubleValue());
+
+  bigint = Bigint::NewFromCString(
+      "1844674407370955161600000000000000000000001");
+  EXPECT_EQ(1.8446744073709553e+42, bigint.AsDoubleValue());
+}
+
+
+TEST_CASE(BigintHexStrings) {
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x0"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(0, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x1"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(1, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x123"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(0x123, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x123"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("0x123", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0xaBcEf"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("0xABCEF", str);
+  }
+
+  {
+    const char* in = "0x123456789";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(in, str);
+  }
+
+  {
+    const char* in = "0xFFFFFFF";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(in, str);
+  }
+
+  {
+    const char* in = "0x10000000";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(in, str);
+  }
+
+  {
+    const char* in = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(in, str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(-0x123, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("-0x123", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0xaBcEf"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("-0xABCEF", str);
+  }
+
+  {
+    const char* in = "-0x123456789";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(in, str);
+  }
+
+  {
+    const char* in = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(in, str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x00000123"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(0x123, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(
+        Bigint::NewFromCString("0x000000123"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("0x123", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(
+        Bigint::NewFromCString("0x0000aBcEf"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("0xABCEF", str);
+  }
+
+  {
+    const char* in = "0x00000000000000000000000000000000000000000000123456789";
+    const char* out =                                            "0x123456789";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(out, str);
+  }
+
+  {
+    const char* in = "0x00000123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const char* out =     "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(out, str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(
+        Bigint::NewFromCString("-0x00000123"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(-0x123, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(
+        Bigint::NewFromCString("-0x00000123"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("-0x123", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(
+        Bigint::NewFromCString("-0x000aBcEf"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("-0xABCEF", str);
+  }
+
+  {
+    const char* in = "-0x00000000000000000000000000000000000000000000123456789";
+    const char* out =                                            "-0x123456789";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(out, str);
+  }
+
+  {
+    const char* in = "-0x0000123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const char* out =    "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(out, str);
+  }
+  {
+    const char* test = "12345678901234567890";
+    const char* out = "0xAB54A98CEB1F0AD2";
+    const Bigint& bigint = Bigint::Handle(
+        Bigint::NewFromCString(test));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(out, str);
+  }
+  {
+    const char* test = "-12345678901234567890";
+    const char* out = "-0xAB54A98CEB1F0AD2";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(test));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ(out, str);
+  }
+}
+
+
+TEST_CASE(BigintDecStrings) {
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x0"));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("0", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x123"));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("291", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0xaBcEf"));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("703727", str);
+  }
+
+  {
+    const char* in = "0x123456789";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("4886718345", str);
+  }
+
+  {
+    const char* in = "0xFFFFFFF";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("268435455", str);
+  }
+
+  {
+    const char* in = "0x10000000";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("268435456", str);
+  }
+
+  {
+    const char* in = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("7141946863373290020600059860922167424469804758405880798960",
+        str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(-291, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("-291", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0xaBcEf"));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("-703727", str);
+  }
+
+  {
+    const char* in = "-0x123456789";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("-4886718345", str);
+  }
+
+  {
+    const char* in = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("-7141946863373290020600059860922167424469804758405880798960",
+        str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x00000123"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(0x123, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(
+        Bigint::NewFromCString("0x000000123"));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("291", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(
+        Bigint::NewFromCString("100000000000000000000000000000000"));
+    const char* str = bigint.ToDecCString(&ZoneAllocator);
+    EXPECT_STREQ("100000000000000000000000000000000", str);
+  }
+}
+
+
+static void TestBigintCompare(const char* a, const char* b, int compare) {
+  const Bigint& bigint_a = Bigint::Handle(Bigint::NewFromCString(a));
+  const Bigint& bigint_b = Bigint::Handle(Bigint::NewFromCString(b));
+  const Integer& int_a = Integer::Handle(bigint_a.AsValidInteger());
+  const Integer& int_b = Integer::Handle(bigint_b.AsValidInteger());
+  int computed_compare = int_a.CompareWith(int_b);
+  int inverted_compare = int_b.CompareWith(int_a);
+  if (compare == 0) {
+    EXPECT(computed_compare == 0);
+    EXPECT(inverted_compare == 0);
+  } else if (compare < 0) {
+    ASSERT(computed_compare < 0);
+    EXPECT(computed_compare < 0);
+    EXPECT(inverted_compare > 0);
+  } else {
+    ASSERT(compare > 0);
+    EXPECT(computed_compare > 0);
+    EXPECT(inverted_compare < 0);
+  }
+}
+
+
+TEST_CASE(BigintCompare) {
+  TestBigintCompare("0x0", "0x0", 0);
+  TestBigintCompare("0x1", "0x1", 0);
+  TestBigintCompare("-0x1", "-0x1", 0);
+  TestBigintCompare("0x1234567", "0x1234567", 0);
+  TestBigintCompare("-0x1234567", "-0x1234567", 0);
+  TestBigintCompare("0x12345678", "0x12345678", 0);
+  TestBigintCompare("-0x12345678", "-0x12345678", 0);
+  TestBigintCompare("0x123456789ABCDEF0", "0x123456789ABCDEF0", 0);
+  TestBigintCompare("-0x123456789ABCDEF0", "-0x123456789ABCDEF0", 0);
+  TestBigintCompare("0x123456789ABCDEF01", "0x123456789ABCDEF01", 0);
+  TestBigintCompare("-0x123456789ABCDEF01", "-0x123456789ABCDEF01", 0);
+  TestBigintCompare("0x1", "0x0", 1);
+  TestBigintCompare("-0x1", "-0x2", 1);
+  TestBigintCompare("0x1234567", "0x1234566", 1);
+  TestBigintCompare("-0x1234567", "-0x1234568", 1);
+  TestBigintCompare("0x12345678", "0x12345677", 1);
+  TestBigintCompare("-0x12345678", "-0x12345679", 1);
+  TestBigintCompare("0x123456789ABCDEF1", "0x123456789ABCDEF0", 1);
+  TestBigintCompare("-0x123456789ABCDEF0", "-0x123456789ABCDEF1", 1);
+  TestBigintCompare("0x123456789ABCDEF02", "0x123456789ABCDEF01", 1);
+  TestBigintCompare("-0x123456789ABCDEF00", "-0x123456789ABCDEF01", 1);
+  TestBigintCompare("0x10000000", "0xFFFFFFF", 1);
+  TestBigintCompare("-0x10000000", "-0xFFFFFFF", -1);
+  TestBigintCompare("0x100000000", "0xFFFFFFFF", 1);
+  TestBigintCompare("-0x100000000", "-0xFFFFFFFF", -1);
+  TestBigintCompare("0x10000000000000000", "0xFFFFFFFFFFFFFFFF", 1);
+  TestBigintCompare("-0x10000000000000000", "-0xFFFFFFFFFFFFFFFF", -1);
+  TestBigintCompare("0x10000000000000000", "0x0", 1);
+  TestBigintCompare("-0x10000000000000000", "0x0", -1);
+  TestBigintCompare("-0x1234567", "0x1234566", -1);
+  TestBigintCompare("-0x1234567", "0x1234568", -1);
+  TestBigintCompare("-0x12345678", "0x12345677", -1);
+  TestBigintCompare("-0x12345678", "0x12345670", -1);
+  TestBigintCompare("-0x123456789ABCDEF1", "0x123456789ABCDEF0", -1);
+  TestBigintCompare("-0x123456789ABCDEF0", "0x123456789ABCDEF1", -1);
+  TestBigintCompare("-0x123456789ABCDEF02", "0x123456789ABCDEF01", -1);
+  TestBigintCompare("-0x123456789ABCDEF00", "0x123456789ABCDEF01", -1);
+  TestBigintCompare("-0x10000000", "0xFFFFFFF", -1);
+  TestBigintCompare("-0x10000000", "0xFFFFFFF", -1);
+  TestBigintCompare("-0x100000000", "0xFFFFFFFF", -1);
+  TestBigintCompare("-0x100000000", "0xFFFFFFFF", -1);
+  TestBigintCompare("-0x10000000000000000", "0xFFFFFFFFFFFFFFFF", -1);
+  TestBigintCompare("-0x10000000000000000", "0xFFFFFFFFFFFFFFFF", -1);
+  TestBigintCompare("-0x10000000000000000", "0x0", -1);
+  TestBigintCompare("-0x10000000000000000", "0x0", -1);
+}
+
+
+TEST_CASE(BigintDecimalStrings) {
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(0, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("1"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(1, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("703710"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("0xABCDE", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("11259375"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("0xABCDEF", str);
+  }
+
+  {
+    const Bigint& bigint =
+        Bigint::Handle(Bigint::NewFromCString("1311768467463790320"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("0x123456789ABCDEF0", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(0, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-1"));
+    EXPECT(bigint.FitsIntoSmi());
+    EXPECT_EQ(-1, bigint.AsInt64Value());
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-703710"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("-0xABCDE", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-11259375"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("-0xABCDEF", str);
+  }
+
+  {
+    const Bigint& bigint = Bigint::Handle(
+        Bigint::NewFromCString("-1311768467463790320"));
+    const char* str = bigint.ToHexCString(&ZoneAllocator);
+    EXPECT_STREQ("-0x123456789ABCDEF0", str);
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index b6ffb8c..6f1b882 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -252,12 +252,12 @@
 
 RawError* Bootstrap::LoadandCompileScripts() {
   Isolate* isolate = Isolate::Current();
-  String& uri = String::Handle();
-  String& patch_uri = String::Handle();
-  String& source = String::Handle();
-  Script& script = Script::Handle();
-  Library& lib = Library::Handle();
-  Error& error = Error::Handle();
+  String& uri = String::Handle(isolate);
+  String& patch_uri = String::Handle(isolate);
+  String& source = String::Handle(isolate);
+  Script& script = Script::Handle(isolate);
+  Library& lib = Library::Handle(isolate);
+  Error& error = Error::Handle(isolate);
   Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler();
 
   // Set the library tag handler for the isolate to the bootstrap
@@ -317,6 +317,15 @@
     ClassFinalizer::ProcessPendingClasses();
   }
 
+  Class& cls = Class::Handle(isolate);
+  // Eagerly compile the function implementation class as it is the super
+  // class of signature classes. This allows us to just finalize signature
+  // classes without going through the hoops of trying to compile them.
+  const Type& type =
+      Type::Handle(isolate, isolate->object_store()->function_impl_type());
+  cls = type.type_class();
+  Compiler::CompileClass(cls);
+
   // Restore the library tag handler for the isolate.
   isolate->set_library_tag_handler(saved_tag_handler);
 
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 4cbcc1e..d6edcc9 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1292,10 +1292,11 @@
 DEFINE_RUNTIME_ENTRY(FixCallersTarget, 0) {
   StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
   StackFrame* frame = iterator.NextFrame();
-  while (frame != NULL && (frame->IsStubFrame() || frame->IsExitFrame())) {
-    frame = iterator.NextFrame();
-  }
   ASSERT(frame != NULL);
+  while (frame->IsStubFrame() || frame->IsExitFrame()) {
+    frame = iterator.NextFrame();
+    ASSERT(frame != NULL);
+  }
   if (frame->IsEntryFrame()) {
     // Since function's current code is always unpatched, the entry frame always
     // calls to unpatched code.
@@ -1341,6 +1342,51 @@
 }
 
 
+// The caller tried to allocate an instance via an invalidated allocation
+// stub.
+DEFINE_RUNTIME_ENTRY(FixAllocationStubTarget, 0) {
+  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
+  StackFrame* frame = iterator.NextFrame();
+  ASSERT(frame != NULL);
+  while (frame->IsStubFrame() || frame->IsExitFrame()) {
+    frame = iterator.NextFrame();
+    ASSERT(frame != NULL);
+  }
+  if (frame->IsEntryFrame()) {
+    // There must be a valid Dart frame.
+    UNREACHABLE();
+  }
+  ASSERT(frame->IsDartFrame());
+  const Code& caller_code = Code::Handle(isolate, frame->LookupDartCode());
+  ASSERT(!caller_code.IsNull());
+  const uword target =
+      CodePatcher::GetStaticCallTargetAt(frame->pc(), caller_code);
+  const Code& stub = Code::Handle(isolate, Code::LookupCode(target));
+  Class& alloc_class = Class::ZoneHandle(isolate);
+  alloc_class ^= stub.owner();
+  Code& alloc_stub = Code::Handle(isolate, alloc_class.allocation_stub());
+  if (alloc_stub.IsNull()) {
+    alloc_stub = isolate->stub_code()->GetAllocationStubForClass(alloc_class);
+    ASSERT(!CodePatcher::IsEntryPatched(alloc_stub));
+  }
+  const Instructions& instrs =
+      Instructions::Handle(isolate, caller_code.instructions());
+  {
+    WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
+    CodePatcher::PatchStaticCallAt(frame->pc(),
+                                   caller_code,
+                                   alloc_stub.EntryPoint());
+  }
+  if (FLAG_trace_patching) {
+    OS::PrintErr("FixAllocationStubTarget: caller %#" Px " "
+        " -> %#" Px "\n",
+        frame->pc(),
+        alloc_stub.EntryPoint());
+  }
+  arguments.SetReturn(alloc_stub);
+}
+
+
 const char* DeoptReasonToCString(ICData::DeoptReasonId deopt_reason) {
   switch (deopt_reason) {
 #define DEOPT_REASON_TO_TEXT(name) case ICData::kDeopt##name: return #name;
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index 52ac679..f1d3190 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -24,6 +24,7 @@
 DECLARE_RUNTIME_ENTRY(CloneContext);
 DECLARE_RUNTIME_ENTRY(Deoptimize);
 DECLARE_RUNTIME_ENTRY(FixCallersTarget);
+DECLARE_RUNTIME_ENTRY(FixAllocationStubTarget);
 DECLARE_RUNTIME_ENTRY(InlineCacheMissHandlerOneArg);
 DECLARE_RUNTIME_ENTRY(InlineCacheMissHandlerTwoArgs);
 DECLARE_RUNTIME_ENTRY(InlineCacheMissHandlerThreeArgs);
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 06c0b25..c2ad811 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -157,6 +157,27 @@
   if (cls.is_marked_for_parsing()) {
     return Error::null();
   }
+  // If the class is a signature class there is no need to try and
+  // compile it. Just finalize it directly.
+  if (cls.IsSignatureClass()) {
+#if defined(DEBUG)
+    const Type& type = Type::Handle(
+        Isolate::Current()->object_store()->function_impl_type());
+    const Class& type_cls = Class::Handle(type.type_class());
+    ASSERT(type_cls.is_finalized());
+#endif
+    LongJumpScope jump;
+    if (setjmp(*jump.Set()) == 0) {
+      ClassFinalizer::FinalizeClass(cls);
+      return Error::null();
+    } else {
+      Isolate* isolate = Isolate::Current();
+      Error& error = Error::Handle(isolate);
+      error = isolate->object_store()->sticky_error();
+      isolate->object_store()->clear_sticky_error();
+      return error.raw();
+    }
+  }
 
   Isolate* isolate = Isolate::Current();
   // We remember all the classes that are being compiled in these lists. This
@@ -304,8 +325,7 @@
         FlowGraphBuilder builder(parsed_function,
                                  *ic_data_array,
                                  NULL,  // NULL = not inlining.
-                                 osr_id,
-                                 optimized);
+                                 osr_id);
         flow_graph = builder.BuildGraph();
       }
 
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index 1939a28..3c0d507 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -4,6 +4,7 @@
 
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
+#include "vm/code_patcher.h"
 #include "vm/compiler.h"
 #include "vm/dart_api_impl.h"
 #include "vm/object.h"
@@ -68,6 +69,37 @@
 }
 
 
+TEST_CASE(RegenerateAllocStubs) {
+  const char* kScriptChars =
+            "class A {\n"
+            "}\n"
+            "unOpt() => new A(); \n"
+            "optIt() => new A(); \n"
+            "main() {\n"
+            "  return unOpt();\n"
+            "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+  RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(lib));
+  Library& lib_handle = Library::ZoneHandle(raw_library);
+  Class& cls = Class::Handle(
+      lib_handle.LookupClass(String::Handle(Symbols::New("A"))));
+  EXPECT(!cls.IsNull());
+
+  Isolate* isolate = Isolate::Current();
+  StubCode* stub_code = isolate->stub_code();
+  const Code& stub = Code::Handle(isolate,
+                                  stub_code->GetAllocationStubForClass(cls));
+  Class& owner = Class::Handle();
+  owner ^= stub.owner();
+  owner.DisableAllocationStub();
+  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+}
+
+
 TEST_CASE(EvalExpression) {
   const char* kScriptChars =
       "int ten = 2 * 5;              \n"
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index b276707..66395c4 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -236,6 +236,7 @@
 const Register SPREG = SP;  // Stack pointer register.
 const Register FPREG = FP;  // Frame pointer register.
 const Register ICREG = R5;  // IC data register.
+const Register ARGS_DESC_REG = R4;
 
 // Exception object is passed in this register to the catch handlers when an
 // exception is thrown.
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 6fe74ee..ffe2303 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -115,6 +115,7 @@
 const Register FPREG = FP;  // Frame pointer register.
 const Register SPREG = R18;  // Stack pointer register.
 const Register ICREG = R5;  // IC data register.
+const Register ARGS_DESC_REG = R4;  // Arguments descriptor register.
 
 // Exception object is passed in this register to the catch handlers when an
 // exception is thrown.
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 6593d23..175f5ae 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -67,6 +67,7 @@
 const Register SPREG = ESP;  // Stack pointer register.
 const Register FPREG = EBP;  // Frame pointer register.
 const Register ICREG = ECX;  // IC data register.
+const Register ARGS_DESC_REG = EDX;  // Arguments descriptor register.
 
 // Exception object is passed in this register to the catch handlers when an
 // exception is thrown.
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
index 4fa1898..8aae537 100644
--- a/runtime/vm/constants_mips.h
+++ b/runtime/vm/constants_mips.h
@@ -182,6 +182,7 @@
 const Register SPREG = SP;  // Stack pointer register.
 const Register FPREG = FP;  // Frame pointer register.
 const Register ICREG = S5;  // IC data register.
+const Register ARGS_DESC_REG = S4;
 
 // The code that generates a comparison can be far away from the code that
 // generates the branch that uses the result of that comparison. In this case,
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 7874083..593e8eb 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -92,6 +92,7 @@
 const Register SPREG = RSP;  // Stack pointer register.
 const Register FPREG = RBP;  // Frame pointer register.
 const Register ICREG = RBX;  // IC data register.
+const Register ARGS_DESC_REG = R10;  // Arguments descriptor register.
 
 // Exception object is passed in this register to the catch handlers when an
 // exception is thrown.
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 50ffd40..d354726 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -2306,7 +2306,7 @@
   intptr_t str_len = str_obj.Length();
   intptr_t copy_len = (str_len > *length) ? *length : str_len;
   for (intptr_t i = 0; i < copy_len; i++) {
-    utf16_array[i] = static_cast<uint16_t>(str_obj.CharAt(i));
+    utf16_array[i] = str_obj.CharAt(i);
   }
   *length = copy_len;
   return Api::Success();
@@ -2373,7 +2373,7 @@
       ASSERT(length >= (copy_len * str_obj.CharSize()));
       uint16_t* utf16_array = reinterpret_cast<uint16_t*>(array);
       for (intptr_t i = 0; i < copy_len; i++) {
-        utf16_array[i] = static_cast<uint16_t>(str_obj.CharAt(i));
+        utf16_array[i] = str_obj.CharAt(i);
       }
       TwoByteString::SetPeer(str_obj, peer, cback);
     }
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index 62d99a4..f5c0a6b 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -308,6 +308,19 @@
   return Api::Success();
 }
 
+DART_EXPORT Dart_Handle Dart_ActivationFrameGetFramePointer(
+                            Dart_ActivationFrame activation_frame,
+                            uintptr_t* frame_pointer) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  CHECK_AND_CAST(ActivationFrame, frame, activation_frame);
+
+  if (frame_pointer != NULL) {
+    *frame_pointer = static_cast<uintptr_t>(frame->fp());
+  }
+  return Api::Success();
+}
+
 
 DART_EXPORT Dart_Handle Dart_GetFunctionOrigin(Dart_Handle function_in) {
   Isolate* isolate = Isolate::Current();
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 8077011..c736248 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -271,10 +271,20 @@
   intptr_t trace_len;
   Dart_Handle res = Dart_StackTraceLength(trace, &trace_len);
   EXPECT_TRUE(res);
+  uintptr_t last_frame_pointer = 0;
+  uintptr_t frame_pointer;
   for (int i = 0; i < trace_len; i++) {
     Dart_ActivationFrame frame;
     res = Dart_GetActivationFrame(trace, i, &frame);
     EXPECT_TRUE(res);
+
+    res = Dart_ActivationFrameGetFramePointer(frame, &frame_pointer);
+    EXPECT_TRUE(res);
+    if (i > 0) {
+      // We expect the stack to grow from high to low addresses.
+      EXPECT_GT(frame_pointer, last_frame_pointer);
+    }
+    last_frame_pointer = frame_pointer;
     if (i < expected_frames) {
       VerifyStackFrame(frame, func_names[i], local_vars[i], skip_null_expects);
     } else {
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index eedc520..45d64a7 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -91,7 +91,7 @@
   }
 
   // Function properties.
-  const ParsedFunction& parsed_function() const {
+  ParsedFunction& parsed_function() const {
     return parsed_function_;
   }
   intptr_t parameter_count() const {
@@ -317,7 +317,7 @@
 
   // Flow graph fields.
   const FlowGraphBuilder& builder_;
-  const ParsedFunction& parsed_function_;
+  ParsedFunction& parsed_function_;
   const intptr_t num_copied_params_;
   const intptr_t num_non_copied_params_;
   const intptr_t num_stack_locals_;
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 7dfecff..85ffc22 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -72,7 +72,8 @@
 }
 
 
-FlowGraphAllocator::FlowGraphAllocator(const FlowGraph& flow_graph)
+FlowGraphAllocator::FlowGraphAllocator(const FlowGraph& flow_graph,
+                                       bool intrinsic_mode)
   : flow_graph_(flow_graph),
     reaching_defs_(flow_graph),
     value_representations_(flow_graph.max_virtual_register_number()),
@@ -88,7 +89,8 @@
     number_of_registers_(0),
     registers_(),
     blocked_registers_(),
-    cpu_spill_slot_count_(0) {
+    cpu_spill_slot_count_(0),
+    intrinsic_mode_(intrinsic_mode) {
   for (intptr_t i = 0; i < vreg_count_; i++) {
     live_ranges_.Add(NULL);
   }
@@ -119,6 +121,13 @@
 
   // FpuTMP is used as scratch by optimized code and parallel move resolver.
   blocked_fpu_registers_[FpuTMP] = true;
+
+  // Block additional registers needed preserved when generating intrinsics.
+  // TODO(fschneider): Handle saving and restoring these registers when
+  // generating intrinsic code.
+  if (intrinsic_mode) {
+    blocked_cpu_registers_[ARGS_DESC_REG] = true;
+  }
 }
 
 
@@ -616,13 +625,18 @@
     // This might change in the future and, if so, the index will be wrong.
     ASSERT((flow_graph_.num_copied_params() == 0) ||
            (flow_graph_.num_non_copied_params() == 0));
-    // Slot index for the leftmost copied parameter is 0.
     intptr_t slot_index = param->index();
-    // Slot index for the rightmost fixed parameter is -1.
-    slot_index -= flow_graph_.num_non_copied_params();
+    ASSERT((param->base_reg() == FPREG) || (param->base_reg() == SPREG));
+    if (param->base_reg() == FPREG) {
+      // Slot index for the leftmost copied parameter is 0.
+      // Slot index for the rightmost fixed parameter is -1.
+      slot_index -= flow_graph_.num_non_copied_params();
+    }
 
-    range->set_assigned_location(Location::StackSlot(slot_index));
-    range->set_spill_slot(Location::StackSlot(slot_index));
+    range->set_assigned_location(Location::StackSlot(slot_index,
+                                                     param->base_reg()));
+    range->set_spill_slot(Location::StackSlot(slot_index,
+                                              param->base_reg()));
   } else {
     ConstantInstr* constant = defn->AsConstant();
     ASSERT(constant != NULL);
@@ -2628,6 +2642,12 @@
     AdvanceActiveIntervals(start);
 
     if (!AllocateFreeRegister(range)) {
+      if (intrinsic_mode_) {
+        // No spilling when compiling intrinsics.
+        // TODO(fschneider): Handle spilling in intrinsics. For now, the
+        // IR has to be built so that there are enough free registers.
+        UNREACHABLE();
+      }
       AllocateAnyRegister(range);
     }
   }
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index dc894cc..013eb6f 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -56,7 +56,8 @@
   // Number of stack slots needed for a fpu register spill slot.
   static const intptr_t kDoubleSpillFactor = kDoubleSize / kWordSize;
 
-  explicit FlowGraphAllocator(const FlowGraph& flow_graph);
+  explicit FlowGraphAllocator(const FlowGraph& flow_graph,
+                              bool intrinsic_mode = false);
 
   void AllocateRegisters();
 
@@ -324,6 +325,8 @@
 
   intptr_t cpu_spill_slot_count_;
 
+  const bool intrinsic_mode_;
+
   DISALLOW_COPY_AND_ASSIGN(FlowGraphAllocator);
 };
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 70a9905..cdefacb 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -239,8 +239,7 @@
     ParsedFunction* parsed_function,
     const ZoneGrowableArray<const ICData*>& ic_data_array,
     InlineExitCollector* exit_collector,
-    intptr_t osr_id,
-    bool is_optimizing) :
+    intptr_t osr_id) :
         parsed_function_(parsed_function),
         ic_data_array_(ic_data_array),
         num_copied_params_(parsed_function->num_copied_params()),
@@ -260,7 +259,6 @@
         args_pushed_(0),
         nesting_stack_(NULL),
         osr_id_(osr_id),
-        is_optimizing_(is_optimizing),
         jump_cnt_(0),
         await_joins_(new(I) ZoneGrowableArray<JoinEntryInstr*>()),
         await_levels_(new(I) ZoneGrowableArray<intptr_t>()) { }
@@ -2388,10 +2386,18 @@
 void EffectGraphVisitor::VisitStringInterpolateNode(
     StringInterpolateNode* node) {
   ValueGraphVisitor for_argument(owner());
-  node->value()->Visit(&for_argument);
+  ArrayNode* arguments = node->value();
+  bool is_singleton = false;
+  if (arguments->length() == 1) {
+    arguments->ElementAt(0)->Visit(&for_argument);
+    is_singleton = true;
+  } else {
+    arguments->Visit(&for_argument);
+  }
   Append(for_argument);
   StringInterpolateInstr* instr =
-      new(I) StringInterpolateInstr(for_argument.value(), node->token_pos());
+      new(I) StringInterpolateInstr(for_argument.value(), node->token_pos(),
+                                    is_singleton);
   ReturnDefinition(instr);
 }
 
@@ -3277,6 +3283,41 @@
             new CreateArrayInstr(node->token_pos(), element_type, length);
         return ReturnDefinition(create_array);
       }
+      case MethodRecognizer::kBigint_getDigits: {
+        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+        LoadFieldInstr* load = new(I) LoadFieldInstr(
+            receiver,
+            Bigint::digits_offset(),
+            Type::ZoneHandle(I, Type::DynamicType()),
+            node->token_pos());
+        // TODO(srdjan): Enabling the correct result type throws an NPE.
+        // load->set_result_cid(kTypedDataUint32ArrayCid);
+        load->set_result_cid(kDynamicCid);
+        load->set_recognized_kind(kind);
+        return ReturnDefinition(load);
+      }
+      case MethodRecognizer::kBigint_getUsed: {
+        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+        LoadFieldInstr* load = new(I) LoadFieldInstr(
+            receiver,
+            Bigint::used_offset(),
+            Type::ZoneHandle(I, Type::SmiType()),
+            node->token_pos());
+        load->set_result_cid(kSmiCid);
+        load->set_recognized_kind(kind);
+        return ReturnDefinition(load);
+      }
+      case MethodRecognizer::kBigint_getNeg: {
+        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+        LoadFieldInstr* load = new(I) LoadFieldInstr(
+            receiver,
+            Bigint::neg_offset(),
+            Type::ZoneHandle(I, Type::BoolType()),
+            node->token_pos());
+        load->set_result_cid(kBoolCid);
+        load->set_recognized_kind(kind);
+        return ReturnDefinition(load);
+      }
       default:
         break;
     }
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 74742d1..e466172 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -145,8 +145,7 @@
   FlowGraphBuilder(ParsedFunction* parsed_function,
                    const ZoneGrowableArray<const ICData*>& ic_data_array,
                    InlineExitCollector* exit_collector,
-                   intptr_t osr_id,
-                   bool is_optimizing);
+                   intptr_t osr_id);
 
   FlowGraph* BuildGraph();
 
@@ -201,8 +200,6 @@
   bool IsInlining() const { return (exit_collector_ != NULL); }
   InlineExitCollector* exit_collector() const { return exit_collector_; }
 
-  bool is_optimizing() const { return is_optimizing_; }
-
   ZoneGrowableArray<const Field*>* guarded_fields() const {
     return guarded_fields_;
   }
@@ -234,6 +231,7 @@
 
  private:
   friend class NestedStatement;  // Explicit access to nesting_stack_.
+  friend class Intrinsifier;
 
   intptr_t parameter_count() const {
     return num_copied_params_ + num_non_copied_params_;
@@ -270,10 +268,6 @@
   // for OSR.
   const intptr_t osr_id_;
 
-  // The graph is being rebuilt for the optimizing compiler.
-  // Do not generate a different graph based on this flag.
-  const bool is_optimizing_;
-
   intptr_t jump_cnt_;
   ZoneGrowableArray<JoinEntryInstr*>* await_joins_;
   ZoneGrowableArray<intptr_t>* await_levels_;
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 84b7aac..7469440 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -98,6 +98,7 @@
           GrowableObjectArray::New())),
       is_optimizing_(is_optimizing),
       may_reoptimize_(false),
+      intrinsic_mode_(false),
       double_class_(Class::ZoneHandle(
           isolate_->object_store()->double_class())),
       mint_class_(Class::ZoneHandle(
@@ -280,12 +281,7 @@
 
 void FlowGraphCompiler::EmitInstructionPrologue(Instruction* instr) {
   if (!is_optimizing()) {
-    if (FLAG_enable_type_checks && instr->IsAssertAssignable()) {
-      AssertAssignableInstr* assert = instr->AsAssertAssignable();
-      AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                           assert->deopt_id(),
-                           assert->token_pos());
-    } else if (instr->CanBecomeDeoptimizationTarget() && !instr->IsGoto()) {
+    if (instr->CanBecomeDeoptimizationTarget() && !instr->IsGoto()) {
       // Instructions that can be deoptimization targets need to record kDeopt
       // PcDescriptor corresponding to their deopt id. GotoInstr records its
       // own so that it can control the placement.
@@ -547,6 +543,7 @@
 void FlowGraphCompiler::AddDeoptIndexAtCall(intptr_t deopt_id,
                                             intptr_t token_pos) {
   ASSERT(is_optimizing());
+  ASSERT(!intrinsic_mode());
   CompilerDeoptInfo* info =
       new CompilerDeoptInfo(deopt_id,
                             ICData::kDeoptAtCall,
@@ -727,6 +724,10 @@
 
 Label* FlowGraphCompiler::AddDeoptStub(intptr_t deopt_id,
                                        ICData::DeoptReasonId reason) {
+  if (intrinsic_mode()) {
+    return &intrinsic_slow_path_label_;
+  }
+
   ASSERT(is_optimizing_);
   CompilerDeoptInfoWithStub* stub =
       new CompilerDeoptInfoWithStub(deopt_id,
@@ -855,9 +856,19 @@
       }
     }
   }
-  // Even if an intrinsified version of the function was successfully
-  // generated, it may fall through to the non-intrinsified method body.
-  Intrinsifier::Intrinsify(parsed_function().function(), assembler());
+
+  EnterIntrinsicMode();
+
+  Intrinsifier::Intrinsify(&parsed_function(), this);
+
+  ExitIntrinsicMode();
+  // "Deoptimization" from intrinsic continues here. All deoptimization
+  // branches from intrinsic code redirect to here where the slow-path
+  // (normal function body) starts.
+  // This means that there must not be any side-effects in intrinsic code
+  // before any deoptimization point.
+  ASSERT(!intrinsic_slow_path_label_.IsBound());
+  assembler()->Bind(&intrinsic_slow_path_label_);
 }
 
 
@@ -1359,6 +1370,10 @@
                      | MaskBit(TMP)
                      | MaskBit(TMP2)
                      | MaskBit(PP);
+  if (resolver->compiler_->intrinsic_mode()) {
+    // Block additional registers that must be preserved for intrinsics.
+    blocked_mask |= MaskBit(ARGS_DESC_REG);
+  }
   reg_ = static_cast<Register>(
       resolver_->AllocateScratchRegister(Location::kRegister,
                                          blocked_mask,
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 89d66bac..9ce9f47 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -273,7 +273,7 @@
 
   // Accessors.
   Assembler* assembler() const { return assembler_; }
-  const ParsedFunction& parsed_function() const { return parsed_function_; }
+  ParsedFunction& parsed_function() const { return parsed_function_; }
   const GrowableArray<BlockEntryInstr*>& block_order() const {
     return block_order_;
   }
@@ -292,6 +292,14 @@
   bool CanOSRFunction() const;
   bool is_optimizing() const { return is_optimizing_; }
 
+  void EnterIntrinsicMode();
+  void ExitIntrinsicMode();
+  bool intrinsic_mode() const { return intrinsic_mode_; }
+
+  Label* intrinsic_slow_path_label() {
+    return &intrinsic_slow_path_label_;
+  }
+
   bool ForceSlowPathForStackOverflow() const;
 
   const GrowableArray<BlockInfo*>& block_info() const { return block_info_; }
@@ -601,7 +609,7 @@
 
   Isolate* isolate_;
   Assembler* assembler_;
-  const ParsedFunction& parsed_function_;
+  ParsedFunction& parsed_function_;
   const FlowGraph& flow_graph_;
   const GrowableArray<BlockEntryInstr*>& block_order_;
 
@@ -620,6 +628,9 @@
   const bool is_optimizing_;
   // Set to true if optimized code has IC calls.
   bool may_reoptimize_;
+  // True while emitting intrinsic code.
+  bool intrinsic_mode_;
+  Label intrinsic_slow_path_label_;
 
   const Class& double_class_;
   const Class& mint_class_;
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index b9af83a..67c26ed 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -58,6 +58,20 @@
 }
 
 
+void FlowGraphCompiler::EnterIntrinsicMode() {
+  ASSERT(!intrinsic_mode());
+  intrinsic_mode_ = true;
+  assembler()->set_allow_constant_pool(false);
+}
+
+
+void FlowGraphCompiler::ExitIntrinsicMode() {
+  ASSERT(intrinsic_mode());
+  intrinsic_mode_ = false;
+  assembler()->set_allow_constant_pool(true);
+}
+
+
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index f0c85dc..4ec8260 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -55,6 +55,20 @@
 }
 
 
+void FlowGraphCompiler::EnterIntrinsicMode() {
+  ASSERT(!intrinsic_mode());
+  intrinsic_mode_ = true;
+  assembler()->set_allow_constant_pool(false);
+}
+
+
+void FlowGraphCompiler::ExitIntrinsicMode() {
+  ASSERT(intrinsic_mode());
+  intrinsic_mode_ = false;
+  assembler()->set_allow_constant_pool(true);
+}
+
+
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 9922cb9..6236d5c8 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -59,6 +59,18 @@
 }
 
 
+void FlowGraphCompiler::EnterIntrinsicMode() {
+  ASSERT(!intrinsic_mode());
+  intrinsic_mode_ = true;
+}
+
+
+void FlowGraphCompiler::ExitIntrinsicMode() {
+  ASSERT(intrinsic_mode());
+  intrinsic_mode_ = false;
+}
+
+
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 1b64073..8ed3f90 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -54,6 +54,20 @@
 }
 
 
+void FlowGraphCompiler::EnterIntrinsicMode() {
+  ASSERT(!intrinsic_mode());
+  intrinsic_mode_ = true;
+  assembler()->set_allow_constant_pool(false);
+}
+
+
+void FlowGraphCompiler::ExitIntrinsicMode() {
+  ASSERT(intrinsic_mode());
+  intrinsic_mode_ = false;
+  assembler()->set_allow_constant_pool(true);
+}
+
+
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 1cbb310..051dc85 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -57,6 +57,20 @@
 }
 
 
+void FlowGraphCompiler::EnterIntrinsicMode() {
+  ASSERT(!intrinsic_mode());
+  intrinsic_mode_ = true;
+  assembler()->set_allow_constant_pool(false);
+}
+
+
+void FlowGraphCompiler::ExitIntrinsicMode() {
+  ASSERT(intrinsic_mode());
+  intrinsic_mode_ = false;
+  assembler()->set_allow_constant_pool(true);
+}
+
+
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index ca7e504..59e84f0 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -649,8 +649,7 @@
       FlowGraphBuilder builder(parsed_function,
                                *ic_data_array,
                                exit_collector,
-                               Isolate::kNoDeoptId,
-                               true);
+                               Isolate::kNoDeoptId);
       builder.SetInitialBlockId(caller_graph_->max_block_id());
       FlowGraph* callee_graph;
       {
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index b92f4a9..cb830fa 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -1364,6 +1364,24 @@
                                     stored_value,
                                     NULL,
                                     FlowGraph::kValue);
+  } else if (array_cid == kTypedDataInt32ArrayCid) {
+    stored_value = new(I) UnboxInt32Instr(
+        new(I) Value(stored_value),
+        call->deopt_id());
+    stored_value->AsUnboxIntN()->mark_truncating();
+    cursor = flow_graph()->AppendTo(cursor,
+                                    stored_value,
+                                    call->env(),
+                                    FlowGraph::kValue);
+  } else if (array_cid == kTypedDataUint32ArrayCid) {
+    stored_value = new(I) UnboxUint32Instr(
+        new(I) Value(stored_value),
+        call->deopt_id());
+    ASSERT(stored_value->AsUnboxIntN()->is_truncating());
+    cursor = flow_graph()->AppendTo(cursor,
+                                    stored_value,
+                                    call->env(),
+                                    FlowGraph::kValue);
   }
 
   const intptr_t index_scale = Instance::ElementSizeFor(array_cid);
@@ -1446,17 +1464,10 @@
                               &ic_data, value_check, entry, last);
     case MethodRecognizer::kInt32ArraySetIndexed:
     case MethodRecognizer::kUint32ArraySetIndexed:
-      if (!CanUnboxInt32()) {
-        return false;
-      }
-      // Check that value is always smi or mint, if the platform has unboxed
-      // mints (ia32 with at least SSE 4.1).
+      // Check that value is always smi or mint. We use Int32/Uint32 unboxing
+      // which can only deal unbox these values.
       value_check = ic_data.AsUnaryClassChecksForArgNr(2);
-      if (FlowGraphCompiler::SupportsUnboxedMints()) {
-        if (!HasOnlySmiOrMint(value_check)) {
-          return false;
-        }
-      } else if (!HasOnlyOneSmi(value_check)) {
+      if (!HasOnlySmiOrMint(value_check)) {
         return false;
       }
       return InlineSetIndexed(kind, target, call, receiver, token_pos,
@@ -1570,16 +1581,10 @@
                                       kTypedDataUint16ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetInt32:
-      if (!CanUnboxInt32()) {
-        return false;
-      }
       return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
                                       kTypedDataInt32ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetUint32:
-      if (!CanUnboxInt32()) {
-        return false;
-      }
       return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
                                       kTypedDataUint32ArrayCid,
                                       ic_data, entry, last);
@@ -1842,7 +1847,7 @@
       const String& str = String::Cast(left_const->value());
       ASSERT(str.Length() == 1);
       ConstantInstr* char_code_left = flow_graph()->GetConstant(
-          Smi::ZoneHandle(I, Smi::New(str.CharAt(0))));
+          Smi::ZoneHandle(I, Smi::New(static_cast<intptr_t>(str.CharAt(0)))));
       left_val = new(I) Value(char_code_left);
     } else if (left->IsStringFromCharCode()) {
       // Use input of string-from-charcode as left value.
@@ -2957,6 +2962,57 @@
         GrowableObjectArray::length_offset(),
         new(I) Value(array),
         new(I) Value(value),
+        kNoStoreBarrier,
+        call->token_pos());
+    ReplaceCall(call, store);
+    return true;
+  }
+
+  if ((recognized_kind == MethodRecognizer::kBigint_setUsed) &&
+      (ic_data.NumberOfChecks() == 1) &&
+      (class_ids[0] == kBigintCid)) {
+    // This is an internal method, no need to check argument types nor
+    // range.
+    Definition* bigint = call->ArgumentAt(0);
+    Definition* value = call->ArgumentAt(1);
+    StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
+        Bigint::used_offset(),
+        new(I) Value(bigint),
+        new(I) Value(value),
+        kNoStoreBarrier,
+        call->token_pos());
+    ReplaceCall(call, store);
+    return true;
+  }
+
+  if ((recognized_kind == MethodRecognizer::kBigint_setDigits) &&
+      (ic_data.NumberOfChecks() == 1) &&
+      (class_ids[0] == kBigintCid)) {
+    // This is an internal method, no need to check argument types nor
+    // range.
+    Definition* bigint = call->ArgumentAt(0);
+    Definition* value = call->ArgumentAt(1);
+    StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
+        Bigint::digits_offset(),
+        new(I) Value(bigint),
+        new(I) Value(value),
+        kEmitStoreBarrier,
+        call->token_pos());
+    ReplaceCall(call, store);
+    return true;
+  }
+
+  if ((recognized_kind == MethodRecognizer::kBigint_setNeg) &&
+      (ic_data.NumberOfChecks() == 1) &&
+      (class_ids[0] == kBigintCid)) {
+    // This is an internal method, no need to check argument types nor
+    // range.
+    Definition* bigint = call->ArgumentAt(0);
+    Definition* value = call->ArgumentAt(1);
+    StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
+        Bigint::neg_offset(),
+        new(I) Value(bigint),
+        new(I) Value(value),
         kEmitStoreBarrier,
         call->token_pos());
     ReplaceCall(call, store);
@@ -3720,9 +3776,8 @@
     }
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-    // Prevent excessive deoptimization, assume full 32 bits used, and therefore
-    // generate Mint on 32-bit architectures.
-    if (kSmiBits >= 32) {
+      // On 64-bit platforms assume that stored value is always a smi.
+      if (kSmiBits >= 32) {
         value_check = ICData::New(flow_graph_->parsed_function().function(),
                                   i_call->function_name(),
                                   Object::empty_array(),  // Dummy args. descr.
@@ -3780,6 +3835,24 @@
                                     stored_value,
                                     NULL,
                                     FlowGraph::kValue);
+  } else if (view_cid == kTypedDataInt32ArrayCid) {
+    stored_value = new(I) UnboxInt32Instr(
+        new(I) Value(stored_value),
+        call->deopt_id());
+    stored_value->AsUnboxIntN()->mark_truncating();
+    cursor = flow_graph()->AppendTo(cursor,
+                                    stored_value,
+                                    call->env(),
+                                    FlowGraph::kValue);
+  } else if (view_cid == kTypedDataUint32ArrayCid) {
+    stored_value = new(I) UnboxUint32Instr(
+        new(I) Value(stored_value),
+        call->deopt_id());
+    ASSERT(stored_value->AsUnboxIntN()->is_truncating());
+    cursor = flow_graph()->AppendTo(cursor,
+                                    stored_value,
+                                    call->env(),
+                                    FlowGraph::kValue);
   }
 
   StoreBarrierType needs_store_barrier = kNoStoreBarrier;
@@ -7991,7 +8064,8 @@
     SetValue(instr, non_constant_);
   } else if (IsConstant(o)) {
     const String& str = String::Cast(o);
-    const intptr_t result = (str.Length() == 1) ? str.CharAt(0) : -1;
+    const intptr_t result =
+        (str.Length() == 1) ? static_cast<intptr_t>(str.CharAt(0)) : -1;
     SetValue(instr, Smi::ZoneHandle(I, Smi::New(result)));
   }
 }
@@ -8022,7 +8096,8 @@
       if (array_obj.IsString()) {
         const String& str = String::Cast(array_obj);
         if (str.Length() > index) {
-          SetValue(instr, Smi::Handle(I, Smi::New(str.CharAt(index))));
+          SetValue(instr, Smi::Handle(I,
+              Smi::New(static_cast<intptr_t>(str.CharAt(index)))));
           return;
         }
       } else if (array_obj.IsArray()) {
@@ -8283,15 +8358,11 @@
         }
         case Token::kSHL:
         case Token::kSHR:
-          if (left.IsSmi() && right.IsSmi()) {
+          if (left.IsSmi() &&
+              right.IsSmi() &&
+              (Smi::Cast(right).Value() >= 0)) {
             Instance& result = Integer::ZoneHandle(I,
                 Smi::Cast(left_int).ShiftOp(op_kind, Smi::Cast(right_int)));
-            if (result.IsNull()) {
-              // TODO(regis): A bigint operation is required. Invoke dart?
-              // Punt for now.
-              SetValue(instr, non_constant_);
-              break;
-            }
             result = result.CheckAndCanonicalize(NULL);
             ASSERT(!result.IsNull());
             SetValue(instr, result);
diff --git a/runtime/vm/flow_graph_range_analysis.cc b/runtime/vm/flow_graph_range_analysis.cc
index be3e1e8..9d2da24 100644
--- a/runtime/vm/flow_graph_range_analysis.cc
+++ b/runtime/vm/flow_graph_range_analysis.cc
@@ -1822,6 +1822,13 @@
 }
 
 
+// A definition dominates a phi if its block dominates the phi's block
+// and the two blocks are different.
+static bool DominatesPhi(BlockEntryInstr* a, BlockEntryInstr* phi_block) {
+  return a->Dominates(phi_block) && (a != phi_block);
+}
+
+
 // When assigning range to a phi we must take care to avoid self-reference
 // cycles when phi's range depends on the phi itself.
 // To prevent such cases we impose additional restriction on symbols that
@@ -1830,14 +1837,14 @@
 static RangeBoundary EnsureAcyclicSymbol(BlockEntryInstr* phi_block,
                                          const RangeBoundary& a,
                                          const RangeBoundary& limit) {
-  if (!a.IsSymbol() || a.symbol()->GetBlock()->Dominates(phi_block)) {
+  if (!a.IsSymbol() || DominatesPhi(a.symbol()->GetBlock(), phi_block)) {
     return a;
   }
 
   // Symbol does not dominate phi. Try unwrapping constraint and check again.
   Definition* unwrapped = UnwrapConstraint(a.symbol());
   if ((unwrapped != a.symbol()) &&
-      unwrapped->GetBlock()->Dominates(phi_block)) {
+      DominatesPhi(unwrapped->GetBlock(), phi_block)) {
     return RangeBoundary::FromDefinition(unwrapped, a.offset());
   }
 
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 2616814..4afa845 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -112,16 +112,19 @@
 
 
 void CompileType::PrintTo(BufferFormatter* f) const {
-  f->Print("T{");
-  f->Print("%s, ", is_nullable_ ? "null" : "not-null");
-  if (cid_ != kIllegalCid) {
+  const char* type_name = "?";
+  if ((cid_ != kIllegalCid) && (cid_ != kDynamicCid)) {
     const Class& cls =
       Class::Handle(Isolate::Current()->class_table()->At(cid_));
-    f->Print("%s, ", String::Handle(cls.Name()).ToCString());
-  } else {
-    f->Print("?, ");
+    type_name = String::Handle(cls.PrettyName()).ToCString();
+  } else if (type_ != NULL &&
+             !type_->Equals(Type::Handle(Type::DynamicType()))) {
+    type_name = type_->ToCString();
+  } else if (!is_nullable()) {
+    type_name = "!null";
   }
-  f->Print("%s}", (type_ != NULL) ? type_->ToCString() : "?");
+
+  f->Print("T{%s%s}", type_name, is_nullable_ ? "?" : "");
 }
 
 
@@ -223,7 +226,8 @@
     range_->PrintTo(f);
   }
 
-  if (type_ != NULL) {
+  if (type_ != NULL &&
+      ((type_->ToNullableCid() != kDynamicCid) || !type_->is_nullable())) {
     f->Print(" ");
     type_->PrintTo(f);
   }
@@ -1043,10 +1047,19 @@
 }
 
 
+void UnboxIntNInstr::PrintOperandsTo(BufferFormatter* f) const {
+  if (is_truncating()) {
+    f->Print("[tr], ");
+  }
+  Definition::PrintOperandsTo(f);
+}
+
+
 void UnboxedIntConverterInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s->%s, ",
+  f->Print("%s->%s%s, ",
            RepresentationToCString(from()),
-           RepresentationToCString(to()));
+           RepresentationToCString(to()),
+           is_truncating() ? "[tr]" : "");
   Definition::PrintOperandsTo(f);
 }
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 32f1323..3c12e4b 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -1168,6 +1168,7 @@
 
 bool UnboxedIntConverterInstr::CanDeoptimize() const {
   return (to() == kUnboxedInt32) &&
+      !is_truncating() &&
       !RangeUtils::Fits(value()->definition()->range(),
                         RangeBoundary::kRangeBoundaryInt32);
 }
@@ -1176,10 +1177,14 @@
 bool UnboxInt32Instr::CanDeoptimize() const {
   const intptr_t value_cid = value()->Type()->ToCid();
   if (value_cid == kSmiCid) {
-    return false;
+    return (kSmiBits > 32) &&
+        !is_truncating() &&
+        !RangeUtils::Fits(value()->definition()->range(),
+                          RangeBoundary::kRangeBoundaryInt32);
   } else if (value_cid == kMintCid) {
-    return !RangeUtils::Fits(value()->definition()->range(),
-                             RangeBoundary::kRangeBoundaryInt32);
+    return !is_truncating() &&
+        !RangeUtils::Fits(value()->definition()->range(),
+                          RangeBoundary::kRangeBoundaryInt32);
   } else {
     return true;
   }
@@ -1743,6 +1748,9 @@
           representation(),
           box_defn->value()->CopyWithType(),
           representation() == kUnboxedInt32 ? deopt_id_ : Isolate::kNoDeoptId);
+      if ((representation() == kUnboxedInt32) && is_truncating()) {
+        converter->mark_truncating();
+      }
       flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue);
       return converter;
     }
@@ -1767,6 +1775,9 @@
         representation(),
         box_defn->value()->CopyWithType(),
         to() == kUnboxedInt32 ? deopt_id_ : NULL);
+    if ((representation() == kUnboxedInt32) && is_truncating()) {
+      converter->mark_truncating();
+    }
     flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue);
     return converter;
   }
@@ -1781,6 +1792,9 @@
     // these instructions close to each other instead of fusing them.
     Definition* replacement =
         new UnboxInt32Instr(unbox_defn->value()->CopyWithType(), deopt_id_);
+    if (is_truncating()) {
+      replacement->AsUnboxInt32()->mark_truncating();
+    }
     flow_graph->InsertBefore(this,
                              replacement,
                              env(),
@@ -1800,6 +1814,15 @@
 
   ConstantInstr* c = value()->definition()->AsConstant();
   if ((c != NULL) && c->value().IsSmi()) {
+    if (!is_truncating() && (kSmiBits > 32)) {
+      // Check that constant fits into 32-bit integer.
+      const int64_t value =
+          static_cast<int64_t>(Smi::Cast(c->value()).Value());
+      if (!Utils::IsInt(32, value)) {
+        return this;
+      }
+    }
+
     UnboxedConstantInstr* uc =
         new UnboxedConstantInstr(c->value(), kUnboxedInt32);
     flow_graph->InsertBefore(this, uc, NULL, FlowGraph::kValue);
@@ -2270,17 +2293,30 @@
 
 LocationSummary* TargetEntryInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool optimizing) const {
-  // FlowGraphCompiler::EmitInstructionPrologue is not called for block
-  // entry instructions, so this function is unused.  If it becomes
-  // reachable, note that the deoptimization descriptor in unoptimized code
-  // comes after the point of local register allocation due to pattern
-  // matching the edge counter code backwards (as a code reuse convenience
-  // on some platforms).
   UNREACHABLE();
   return NULL;
 }
 
 
+void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  __ Bind(compiler->GetJumpLabel(this));
+  if (!compiler->is_optimizing()) {
+    if (compiler->NeedsEdgeCounter(this)) {
+      compiler->EmitEdgeCounter();
+    }
+    // The deoptimization descriptor points after the edge counter code for
+    // uniformity with ARM and MIPS, where we can reuse pattern matching
+    // code that matches backwards from the end of the pattern.
+    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
+                                   deopt_id_,
+                                   Scanner::kNoSourcePos);
+  }
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+}
+
+
 LocationSummary* PhiInstr::MakeLocationSummary(Isolate* isolate,
                                                bool optimizing) const {
   UNREACHABLE();
@@ -2513,9 +2549,6 @@
   } else {
     // Unoptimized code.
     ASSERT(!HasICData());
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id(),
-                                   token_pos());
     bool is_smi_two_args_op = false;
     const uword label_address = TwoArgsSmiOpInlineCacheEntry(token_kind());
     if (label_address != 0) {
@@ -2613,13 +2646,6 @@
   } 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.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id(),
-                                   token_pos());
-  }
   compiler->GenerateStaticCall(deopt_id(),
                                token_pos(),
                                function(),
@@ -2859,7 +2885,9 @@
     function_ =
         Resolver::ResolveStatic(
             cls,
-            Library::PrivateCoreLibName(Symbols::Interpolate()),
+            is_singleton_
+                ? Library::PrivateCoreLibName(Symbols::InterpolateSingle())
+                : Library::PrivateCoreLibName(Symbols::Interpolate()),
             kNumberOfArguments,
             kNoArgumentNames);
   }
@@ -2878,12 +2906,35 @@
   //   StoreIndexed(v2, v3, v4)   -- v3:constant index, v4: value.
   //   ..
   //   v8 <- StringInterpolate(v2)
+  // or for a single element:
+  //   v2 <- StringInterpolateSingle(v0)
 
   // Don't compile-time fold when optimizing the interpolation function itself.
   if (flow_graph->parsed_function().function().raw() == CallFunction().raw()) {
     return this;
   }
 
+  if (is_singleton_) {
+    Value* value = this->value();
+    if (!value->definition()->IsConstant()) return this;
+    const Object& obj = value->definition()->AsConstant()->value();
+    if (!obj.IsNumber() && !obj.IsString() && !obj.IsBool() && !obj.IsNull()) {
+      return this;
+    }
+    // This is only really useful for numbers, so we don't bother optimizing
+    // for strings, bool or null.
+    const Array& interpolate_arg = Array::Handle(Array::New(1));
+    interpolate_arg.SetAt(0, obj);
+    const Object& result = Object::Handle(
+        DartEntry::InvokeFunction(CallFunction(), interpolate_arg));
+    if (result.IsUnhandledException()) {
+      return this;
+    }
+    ASSERT(result.IsString());
+    const String& converted =
+        String::ZoneHandle(Symbols::New(String::Cast(result)));
+    return flow_graph->GetConstant(converted);
+  }
   CreateArrayInstr* create_array = value()->definition()->AsCreateArray();
   ASSERT(create_array != NULL);
   // Check if the string interpolation has only constant inputs.
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index e081354..4325952 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -564,15 +564,21 @@
 
 
 // Functions required in all concrete instruction classes.
-#define DECLARE_INSTRUCTION(type)                                              \
+#define DECLARE_INSTRUCTION_NO_BACKEND(type)                                   \
   virtual Tag tag() const { return k##type; }                                  \
   virtual void Accept(FlowGraphVisitor* visitor);                              \
   virtual type##Instr* As##type() { return this; }                             \
   virtual const char* DebugName() const { return #type; }                      \
+
+#define DECLARE_INSTRUCTION_BACKEND(type)                                      \
   virtual LocationSummary* MakeLocationSummary(Isolate* isolate,               \
                                                bool optimizing) const;         \
   virtual void EmitNativeCode(FlowGraphCompiler* compiler);                    \
 
+// Functions required in all concrete instruction classes.
+#define DECLARE_INSTRUCTION(type)                                              \
+  DECLARE_INSTRUCTION_NO_BACKEND(type)                                         \
+  DECLARE_INSTRUCTION_BACKEND(type)                                            \
 
 class Instruction : public ZoneAllocated {
  public:
@@ -1909,12 +1915,15 @@
 
 class ParameterInstr : public Definition {
  public:
-  ParameterInstr(intptr_t index, BlockEntryInstr* block)
-      : index_(index), block_(block) { }
+  ParameterInstr(intptr_t index,
+                 BlockEntryInstr* block,
+                 Register base_reg = FPREG)
+      : index_(index), base_reg_(base_reg), block_(block) { }
 
   DECLARE_INSTRUCTION(Parameter)
 
   intptr_t index() const { return index_; }
+  Register base_reg() const { return base_reg_; }
 
   // Get the block entry for that instruction.
   virtual BlockEntryInstr* GetBlock() const { return block_; }
@@ -1947,6 +1956,7 @@
   virtual void RawSetInputAt(intptr_t i, Value* value) { UNREACHABLE(); }
 
   const intptr_t index_;
+  const Register base_reg_;
   BlockEntryInstr* block_;
 
   DISALLOW_COPY_AND_ASSIGN(ParameterInstr);
@@ -2494,6 +2504,12 @@
 
   virtual bool CanDeoptimize() const { return true; }
 
+  virtual bool CanBecomeDeoptimizationTarget() const {
+    // AssertAssignable instructions that are specialized by the optimizer
+    // (e.g. replaced with CheckClass) need a deoptimization descriptor before.
+    return true;
+  }
+
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   virtual bool AllowsCSE() const { return true; }
@@ -2661,6 +2677,12 @@
 
   virtual bool CanDeoptimize() const { return true; }
 
+  virtual bool CanBecomeDeoptimizationTarget() const {
+    // Instance calls that are specialized by the optimizer need a
+    // deoptimization descriptor before the call.
+    return true;
+  }
+
   virtual EffectSet Effects() const { return EffectSet::All(); }
 
   virtual bool MayThrow() const { return true; }
@@ -3133,6 +3155,12 @@
 
   virtual bool CanDeoptimize() const { return true; }
 
+  virtual bool CanBecomeDeoptimizationTarget() const {
+    // Static calls that are specialized by the optimizer (e.g. sqrt) need a
+    // deoptimization descriptor before the call.
+    return true;
+  }
+
   virtual EffectSet Effects() const { return EffectSet::All(); }
 
   void set_result_cid(intptr_t value) { result_cid_ = value; }
@@ -3772,8 +3800,10 @@
 
 class StringInterpolateInstr : public TemplateDefinition<1> {
  public:
-  StringInterpolateInstr(Value* value, intptr_t token_pos)
-      : token_pos_(token_pos), function_(Function::Handle()) {
+  StringInterpolateInstr(Value* value, intptr_t token_pos, bool is_singleton)
+      : token_pos_(token_pos),
+        function_(Function::Handle()),
+        is_singleton_(is_singleton) {
     SetInputAt(0, value);
   }
 
@@ -3795,6 +3825,7 @@
  private:
   const intptr_t token_pos_;
   Function& function_;
+  const bool is_singleton_;
 
   DISALLOW_COPY_AND_ASSIGN(StringInterpolateInstr);
 };
@@ -7675,7 +7706,6 @@
  public:
   CheckSmiInstr(Value* value, intptr_t original_deopt_id, intptr_t token_pos)
       : token_pos_(token_pos) {
-    ASSERT(original_deopt_id != Isolate::kNoDeoptId);
     SetInputAt(0, value);
     deopt_id_ = original_deopt_id;
   }
@@ -7963,10 +7993,12 @@
 class BoxIntNInstr : public TemplateDefinition<1> {
  public:
   BoxIntNInstr(Representation representation, Value* value)
-      : representation_(representation) {
+      : from_representation_(representation) {
     SetInputAt(0, value);
   }
 
+  Representation from_representation() const { return from_representation_; }
+
   Value* value() const { return inputs_[0]; }
   virtual bool ValueFitsSmi() const;
 
@@ -7981,14 +8013,14 @@
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
-    return representation_;
+    return from_representation_;
   }
 
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
-    return other->AsBoxIntN()->representation_ == representation_;
+    return other->AsBoxIntN()->from_representation_ == from_representation_;
   }
 
   virtual bool MayThrow() const { return false; }
@@ -7997,8 +8029,10 @@
 
   virtual BoxIntNInstr* AsBoxIntN() { return this; }
 
+  DECLARE_INSTRUCTION_BACKEND(BoxIntN)
+
  private:
-  const Representation representation_;
+  const Representation from_representation_;
 
   DISALLOW_COPY_AND_ASSIGN(BoxIntNInstr);
 };
@@ -8009,7 +8043,7 @@
   explicit BoxUint32Instr(Value* value)
       : BoxIntNInstr(kUnboxedUint32, value) { }
 
-  DECLARE_INSTRUCTION(BoxUint32)
+  DECLARE_INSTRUCTION_NO_BACKEND(BoxUint32)
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BoxUint32Instr);
@@ -8023,7 +8057,7 @@
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
-  DECLARE_INSTRUCTION(BoxInt32)
+  DECLARE_INSTRUCTION_NO_BACKEND(BoxInt32)
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BoxInt32Instr);
@@ -8035,13 +8069,17 @@
   UnboxIntNInstr(Representation representation,
                  Value* value,
                  intptr_t deopt_id)
-      : representation_(representation) {
+      : representation_(representation),
+        is_truncating_(representation == kUnboxedUint32) {
     SetInputAt(0, value);
     deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
 
+  bool is_truncating() const { return is_truncating_; }
+  void mark_truncating() { is_truncating_ = true; }
+
   virtual Representation representation() const {
     return representation_;
   }
@@ -8052,7 +8090,9 @@
   virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
-    return other->AsUnboxIntN()->representation_ == representation_;
+    UnboxIntNInstr* other_unbox = other->AsUnboxIntN();
+    return (other_unbox->representation_ == representation_) &&
+        (other_unbox->is_truncating_ == is_truncating_);
   }
 
   virtual bool MayThrow() const { return false; }
@@ -8061,8 +8101,13 @@
 
   virtual UnboxIntNInstr* AsUnboxIntN() { return this; }
 
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  DECLARE_INSTRUCTION_BACKEND(UnboxIntNInstr);
+
  private:
   const Representation representation_;
+  bool is_truncating_;
 
   DISALLOW_COPY_AND_ASSIGN(UnboxIntNInstr);
 };
@@ -8072,6 +8117,7 @@
  public:
   UnboxUint32Instr(Value* value, intptr_t deopt_id)
       : UnboxIntNInstr(kUnboxedUint32, value, deopt_id) {
+    ASSERT(is_truncating());
   }
 
   virtual bool CanDeoptimize() const {
@@ -8079,7 +8125,7 @@
         && (value()->Type()->ToCid() != kMintCid);
   }
 
-  DECLARE_INSTRUCTION(UnboxUint32)
+  DECLARE_INSTRUCTION_NO_BACKEND(UnboxUint32)
 
  private:
   DISALLOW_COPY_AND_ASSIGN(UnboxUint32Instr);
@@ -8098,7 +8144,7 @@
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  DECLARE_INSTRUCTION(UnboxInt32)
+  DECLARE_INSTRUCTION_NO_BACKEND(UnboxInt32)
 
  private:
   DISALLOW_COPY_AND_ASSIGN(UnboxInt32Instr);
@@ -8112,7 +8158,8 @@
                            Value* value,
                            intptr_t deopt_id)
       : from_representation_(from),
-        to_representation_(to) {
+        to_representation_(to),
+        is_truncating_(to == kUnboxedUint32) {
     ASSERT(from != to);
     ASSERT((from == kUnboxedMint) ||
            (from == kUnboxedUint32) ||
@@ -8129,6 +8176,9 @@
 
   Representation from() const { return from_representation_; }
   Representation to() const { return to_representation_; }
+  bool is_truncating() const { return is_truncating_; }
+
+  void mark_truncating() { is_truncating_ = true; }
 
   Definition* Canonicalize(FlowGraph* flow_graph);
 
@@ -8148,7 +8198,9 @@
   virtual bool AttributesEqual(Instruction* other) const {
     ASSERT(other->IsUnboxedIntConverter());
     UnboxedIntConverterInstr* converter = other->AsUnboxedIntConverter();
-    return (converter->from() == from()) && (converter->to() == to());
+    return (converter->from() == from()) &&
+        (converter->to() == to()) &&
+        (converter->is_truncating() == is_truncating());
   }
 
   virtual bool MayThrow() const { return false; }
@@ -8162,6 +8214,8 @@
  private:
   const Representation from_representation_;
   const Representation to_representation_;
+  bool is_truncating_;
+
   DISALLOW_COPY_AND_ASSIGN(UnboxedIntConverterInstr);
 };
 
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 42cc95f..1716228 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -63,7 +63,7 @@
     } else {
       ASSERT(value.IsStackSlot());
       const intptr_t value_offset = value.ToStackSlotOffset();
-      __ LoadFromOffset(kWord, IP, FP, value_offset);
+      __ LoadFromOffset(kWord, IP, value.base_reg(), value_offset);
       __ Push(IP);
     }
   }
@@ -87,6 +87,13 @@
 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register result = locs()->in(0).reg();
   ASSERT(result == R0);
+
+  if (compiler->intrinsic_mode()) {
+    // Intrinsics don't have a frame.
+    __ Ret();
+    return;
+  }
+
 #if defined(DEBUG)
   Label stack_ok;
   __ Comment("Stack Check");
@@ -296,8 +303,13 @@
   const intptr_t kNumTemps = (representation_ == kUnboxedInt32) ? 0 : 1;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_out(0, Location::RequiresFpuRegister());
-  if (representation_ != kUnboxedInt32) {
+  if (representation_ == kUnboxedInt32) {
+    locs->set_out(0, Location::RequiresRegister());
+  } else {
+    ASSERT(representation_ == kUnboxedDouble);
+    locs->set_out(0, Location::RequiresFpuRegister());
+  }
+  if (kNumTemps > 0) {
     locs->set_temp(0, Location::RequiresRegister());
   }
   return locs;
@@ -1367,8 +1379,9 @@
     case kTypedDataUint16ArrayCid:
       return kTagged;
     case kTypedDataInt32ArrayCid:
+      return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
-      return value()->IsSmiValue() ? kTagged : kUnboxedMint;
+      return kUnboxedUint32;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1426,19 +1439,9 @@
     case kOneByteStringCid:
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
-      locs->set_in(2, Location::RequiresRegister());
-      break;
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // Smis are untagged in TMP register. Mints are stored in register pairs.
-      if (value()->IsSmiValue()) {
-        locs->set_in(2, Location::RequiresRegister());
-      } else {
-        // We only move the lower 32-bits so we don't care where the high bits
-        // are located.
-        locs->set_in(2, Location::Pair(Location::RequiresRegister(),
-                                       Location::Any()));
-      }
+      locs->set_in(2, Location::RequiresRegister());
       break;
     case kTypedDataFloat32ArrayCid:
       // Need low register (<= Q7).
@@ -1537,17 +1540,8 @@
     }
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid: {
-      if (value()->IsSmiValue()) {
-        ASSERT(RequiredInputRepresentation(2) == kTagged);
-        const Register value = locs()->in(2).reg();
-        __ SmiUntag(IP, value);
-        __ str(IP, element_address);
-      } else {
-        ASSERT(RequiredInputRepresentation(2) == kUnboxedMint);
-        PairLocation* value_pair = locs()->in(2).AsPairLocation();
-        Register value1 = value_pair->At(0).reg();
-        __ str(value1, element_address);
-      }
+      const Register value = locs()->in(2).reg();
+      __ str(value, element_address);
       break;
     }
     case kTypedDataFloat32ArrayCid: {
@@ -1854,7 +1848,6 @@
                  String::Handle(cls_.PrettyName()).ToCString());
     }
     __ Bind(entry_label());
-
     const Code& stub =
         Code::Handle(isolate, stub_code->GetAllocationStubForClass(cls_));
     const ExternalLabel label(stub.EntryPoint());
@@ -1870,7 +1863,6 @@
                            locs);
     __ MoveRegister(result_, R0);
     compiler->RestoreLiveRegisters(locs);
-
     __ b(exit_label());
   }
 
@@ -1879,21 +1871,28 @@
                        const Class& cls,
                        Register result,
                        Register temp) {
-    BoxAllocationSlowPath* slow_path =
-        new BoxAllocationSlowPath(instruction, cls, result);
-    compiler->AddSlowPathCode(slow_path);
+    if (compiler->intrinsic_mode()) {
+      __ TryAllocate(cls,
+                     compiler->intrinsic_slow_path_label(),
+                     result,
+                     temp);
+    } else {
+      BoxAllocationSlowPath* slow_path =
+          new BoxAllocationSlowPath(instruction, cls, result);
+      compiler->AddSlowPathCode(slow_path);
 
-    __ TryAllocate(cls,
-                   slow_path->entry_label(),
-                   result,
-                   temp);
-    __ Bind(slow_path->exit_label());
+      __ TryAllocate(cls,
+                     slow_path->entry_label(),
+                     result,
+                     temp);
+      __ Bind(slow_path->exit_label());
+    }
   }
 
  private:
   Instruction* instruction_;
   const Class& cls_;
-  Register result_;
+  const Register result_;
 };
 
 
@@ -6691,110 +6690,10 @@
 }
 
 
-LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
-                                                     bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register value = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
-  Register temp = locs()->temp(0).reg();
-  ASSERT(value != out);
-
-  Label not_smi, done;
-
-  // TODO(johnmccutchan): Use range information to fast path smi / mint boxing.
-
-  // Test if this value is <= kSmiMax.
-  __ CompareImmediate(value, kSmiMax);
-  __ b(&not_smi, HI);
-  // Smi.
-  __ mov(out, Operand(value));
-  __ SmiTag(out);
-  __ b(&done);
-  __ Bind(&not_smi);
-  // Allocate a mint.
-  BoxAllocationSlowPath::Allocate(
-      compiler,
-      this,
-      compiler->mint_class(),
-      out,
-      temp);
-  // Copy low word into mint.
-  __ StoreToOffset(kWord,
-                   value,
-                   out,
-                   Mint::value_offset() - kHeapObjectTag);
-  // Zero high word.
-  __ eor(temp, temp, Operand(temp));
-  __ StoreToOffset(kWord,
-                   temp,
-                   out,
-                   Mint::value_offset() - kHeapObjectTag + kWordSize);
-  __ Bind(&done);
-}
-
-
-
-LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps =
-      ((value_cid == kMintCid) || (value_cid == kSmiCid)) ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const Register out = locs()->out(0).reg();
-  ASSERT(value != out);
-
-  // TODO(johnmccutchan): Emit better code for constant inputs.
-  if (value_cid == kMintCid) {
-    __ LoadFromOffset(kWord, out, value, Mint::value_offset() - kHeapObjectTag);
-  } else if (value_cid == kSmiCid) {
-    __ mov(out, Operand(value));
-    __ SmiUntag(out);
-  } else {
-    Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
-                                          ICData::kDeoptUnboxInteger);
-    Label done;
-    __ tst(value, Operand(kSmiTagMask));
-    // Smi case.
-    __ mov(out, Operand(value), EQ);
-    __ SmiUntag(out, EQ);
-    __ b(&done, EQ);
-    // Mint case.
-    __ CompareClassId(value, kMintCid, temp);
-    __ b(deopt, NE);
-    __ LoadFromOffset(kWord, out, value, Mint::value_offset() - kHeapObjectTag);
-    __ Bind(&done);
-  }
-}
-
-
-LocationSummary* BoxInt32Instr::MakeLocationSummary(Isolate* isolate,
-                                                     bool opt) const {
+LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   LocationSummary* summary = new(isolate) LocationSummary(
@@ -6812,16 +6711,23 @@
 }
 
 
-void BoxInt32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
   Register out = locs()->out(0).reg();
   ASSERT(value != out);
 
-  __ Lsl(out, value, 1);
+  __ SmiTag(out, value);
   if (!ValueFitsSmi()) {
     Register temp = locs()->temp(0).reg();
     Label done;
-    __ cmp(value, Operand(out, ASR, 1));
+    if (from_representation() == kUnboxedInt32) {
+      __ cmp(value, Operand(out, ASR, 1));
+    } else {
+      ASSERT(from_representation() == kUnboxedUint32);
+      // Note: better to test upper bits instead of comparing with
+      // kSmiMax as kSmiMax does not fit into immediate operand.
+      __ TestImmediate(value, 0xC0000000);
+    }
     __ b(&done, EQ);
     BoxAllocationSlowPath::Allocate(
         compiler,
@@ -6829,7 +6735,12 @@
         compiler->mint_class(),
         out,
         temp);
-    __ Asr(temp, value, kBitsPerWord - 1);
+    if (from_representation() == kUnboxedInt32) {
+      __ Asr(temp, value, kBitsPerWord - 1);
+    } else {
+      ASSERT(from_representation() == kUnboxedUint32);
+      __ eor(temp, temp, Operand(temp));
+    }
     __ StoreToOffset(kWord,
                      value,
                      out,
@@ -6843,24 +6754,6 @@
 }
 
 
-
-LocationSummary* UnboxInt32Instr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps =
-      ((value_cid == kMintCid) || (value_cid == kSmiCid)) ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
 static void LoadInt32FromMint(FlowGraphCompiler* compiler,
                               Register mint,
                               Register result,
@@ -6881,41 +6774,44 @@
 }
 
 
-void UnboxInt32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
+  ASSERT((representation() == kUnboxedInt32) ||
+         (representation() == kUnboxedUint32));
+  ASSERT((representation() != kUnboxedUint32) || is_truncating());
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = CanDeoptimize() ? 1 : 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  if (kNumTemps > 0) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->Type()->ToCid();
   const Register value = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
+  const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
+  Label* deopt = CanDeoptimize() ?
+        compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+  Label* out_of_range = !is_truncating() ? deopt : NULL;
   ASSERT(value != out);
 
-  if (value_cid == kMintCid) {
-    Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
-    Label* deopt = CanDeoptimize() ?
-        compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
-    LoadInt32FromMint(compiler,
-                      value,
-                      out,
-                      temp,
-                      deopt);
-  } else if (value_cid == kSmiCid) {
+  if (value_cid == kSmiCid) {
     __ SmiUntag(out, value);
+  } else if (value_cid == kMintCid) {
+    LoadInt32FromMint(compiler, value, out, temp, out_of_range);
   } else {
-    Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
-                                          ICData::kDeoptUnboxInteger);
     Label done;
-    __ tst(value, Operand(kSmiTagMask));
-    // Smi case.
-    __ mov(out, Operand(value), EQ);
-    __ SmiUntag(out, EQ);
-    __ b(&done, EQ);
-    // Mint case.
+    __ SmiUntag(out, value, &done);
     __ CompareClassId(value, kMintCid, temp);
     __ b(deopt, NE);
-    LoadInt32FromMint(compiler,
-                      value,
-                      out,
-                      temp,
-                      deopt);
+    LoadInt32FromMint(compiler, value, out, temp, out_of_range);
     __ Bind(&done);
   }
 }
@@ -7037,26 +6933,6 @@
 }
 
 
-void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ Bind(compiler->GetJumpLabel(this));
-  if (!compiler->is_optimizing()) {
-    if (compiler->NeedsEdgeCounter(this)) {
-      compiler->EmitEdgeCounter();
-    }
-    // Add an edge counter.
-    // On ARM the deoptimization descriptor points after the edge counter
-    // code so that we can reuse the same pattern matching code as at call
-    // sites, which matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id_,
-                                   Scanner::kNoSourcePos);
-  }
-  if (HasParallelMove()) {
-    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
-  }
-}
-
-
 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
                                                 bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index fa89081..c977a8e 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -61,7 +61,7 @@
     } else {
       ASSERT(value.IsStackSlot());
       const intptr_t value_offset = value.ToStackSlotOffset();
-      __ LoadFromOffset(TMP, FP, value_offset, PP);
+      __ LoadFromOffset(TMP, value.base_reg(), value_offset, PP);
       __ Push(TMP);
     }
   }
@@ -85,6 +85,13 @@
 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register result = locs()->in(0).reg();
   ASSERT(result == R0);
+
+  if (compiler->intrinsic_mode()) {
+    // Intrinsics don't have a frame.
+    __ ret();
+    return;
+  }
+
 #if defined(DEBUG)
   Label stack_ok;
   __ Comment("Stack Check");
@@ -288,22 +295,35 @@
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
+  const Location out = (representation_ == kUnboxedInt32) ?
+      Location::RequiresRegister() : Location::RequiresFpuRegister();
   return LocationSummary::Make(isolate,
                                kNumInputs,
-                               Location::RequiresFpuRegister(),
+                               out,
                                LocationSummary::kNoCall);
 }
 
 
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ASSERT(representation_ == kUnboxedDouble);
   if (!locs()->out(0).IsInvalid()) {
-    if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
-      const VRegister dst = locs()->out(0).fpu_reg();
-      __ veor(dst, dst, dst);
-    } else {
-      const VRegister dst = locs()->out(0).fpu_reg();
-      __ LoadDImmediate(dst, Double::Cast(value()).value(), PP);
+    switch (representation_) {
+      case kUnboxedDouble:
+        if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+          const VRegister dst = locs()->out(0).fpu_reg();
+          __ veor(dst, dst, dst);
+        } else {
+          const VRegister dst = locs()->out(0).fpu_reg();
+          __ LoadDImmediate(dst, Double::Cast(value()).value(), PP);
+        }
+        break;
+      case kUnboxedInt32:
+        __ LoadImmediate(locs()->out(0).reg(),
+                         static_cast<int32_t>(Smi::Cast(value()).Value()),
+                         PP);
+        break;
+      default:
+        UNREACHABLE();
+        break;
     }
   }
 }
@@ -1130,9 +1150,11 @@
     case kExternalTypedDataUint8ClampedArrayCid:
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
-    case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid:
       return kTagged;
+    case kTypedDataInt32ArrayCid:
+      return kUnboxedInt32;
+    case kTypedDataUint32ArrayCid:
+      return kUnboxedUint32;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1271,8 +1293,7 @@
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid: {
       const Register value = locs()->in(2).reg();
-      __ SmiUntag(TMP, value);
-      __ str(TMP, element_address, kUnsignedWord);
+      __ str(value, element_address, kUnsignedWord);
       break;
     }
     case kTypedDataFloat32ArrayCid: {
@@ -1590,7 +1611,6 @@
                  String::Handle(cls_.PrettyName()).ToCString());
     }
     __ Bind(entry_label());
-
     const Code& stub =
         Code::Handle(isolate, stub_code->GetAllocationStubForClass(cls_));
     const ExternalLabel label(stub.EntryPoint());
@@ -1606,7 +1626,6 @@
                            locs);
     __ mov(result_, R0);
     compiler->RestoreLiveRegisters(locs);
-
     __ b(exit_label());
   }
 
@@ -1615,22 +1634,30 @@
                        const Class& cls,
                        Register result,
                        Register temp) {
-    BoxAllocationSlowPath* slow_path =
-        new BoxAllocationSlowPath(instruction, cls, result);
-    compiler->AddSlowPathCode(slow_path);
+    if (compiler->intrinsic_mode()) {
+      __ TryAllocate(cls,
+                     compiler->intrinsic_slow_path_label(),
+                     result,
+                     temp,
+                     PP);
+    } else {
+      BoxAllocationSlowPath* slow_path =
+          new BoxAllocationSlowPath(instruction, cls, result);
+      compiler->AddSlowPathCode(slow_path);
 
-    __ TryAllocate(cls,
-                   slow_path->entry_label(),
-                   result,
-                   temp,
-                   PP);
-    __ Bind(slow_path->exit_label());
+      __ TryAllocate(cls,
+                     slow_path->entry_label(),
+                     result,
+                     temp,
+                     PP);
+      __ Bind(slow_path->exit_label());
+    }
   }
 
  private:
   Instruction* instruction_;
   const Class& cls_;
-  Register result_;
+  const Register result_;
 };
 
 
@@ -5157,38 +5184,140 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr)
 DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr)
 DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt32Instr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxInt32Instr)
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxUint32Instr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxedIntConverterInstr)
 
 
-LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::SameAsFirstInput());
+  summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 
-void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->Type()->ToCid();
+  const Register out = locs()->out(0).reg();
   const Register value = locs()->in(0).reg();
-  ASSERT(value == locs()->out(0).reg());
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
 
   if (value_cid == kSmiCid) {
-    __ SmiUntag(value);
+    __ SmiUntag(out, value);
+  } else if (value_cid == kMintCid) {
+    __ LoadFieldFromOffset(out, value, Mint::value_offset(), PP);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
-                                          ICData::kDeoptUnboxInteger);
-    __ tsti(value, kSmiTagMask);
+    Label done;
+    __ SmiUntag(out, value);
+    __ TestImmediate(value, kSmiTagMask, PP);
+    __ b(&done, EQ);
+    __ CompareClassId(value, kMintCid, PP);
     __ b(deopt, NE);
-    __ SmiUntag(value);
+    __ LoadFieldFromOffset(out, value, Mint::value_offset(), PP);
+    __ Bind(&done);
+  }
+
+  // TODO(vegorov): as it is implemented right now truncating unboxing would
+  // leave "garbage" in the higher word.
+  if (!is_truncating() && (deopt != NULL)) {
+    ASSERT(representation() == kUnboxedInt32);
+    __ cmp(out, Operand(out, SXTW, 0));
+    __ b(deopt, NE);
+  }
+}
+
+
+LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  ASSERT(kSmiTagSize == 1);
+  // TODO(vegorov) implement and use UBFM/SBFM for this.
+  __ Lsl(out, value, 32);
+  if (from_representation() == kUnboxedInt32) {
+    __ Asr(out, out, 32 - kSmiTagSize);
+  } else {
+    ASSERT(from_representation() == kUnboxedUint32);
+    __ Lsr(out, out, 32 - kSmiTagSize);
+  }
+}
+
+
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  if (from() == kUnboxedMint) {
+    UNREACHABLE();
+  } else if (to() == kUnboxedMint) {
+    UNREACHABLE();
+  } else {
+    ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_out(0, Location::RequiresRegister());
+  }
+  return summary;
+}
+
+
+void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (from() == kUnboxedInt32 && to() == kUnboxedUint32) {
+    const Register value = locs()->in(0).reg();
+    const Register out = locs()->out(0).reg();
+    // Representations are bitwise equivalent but we want to normalize
+    // upperbits for safety reasons.
+    // TODO(vegorov) if we ensure that we never use kDoubleWord size
+    // with it then we could avoid this.
+    // TODO(vegorov) implement and use UBFM for zero extension.
+    __ Lsl(out, value, 32);
+    __ Lsr(out, out, 32);
+  } else if (from() == kUnboxedUint32 && to() == kUnboxedInt32) {
+    // Representations are bitwise equivalent.
+    // TODO(vegorov) if we ensure that we never use kDoubleWord size
+    // with it then we could avoid this.
+    // TODO(vegorov) implement and use SBFM for sign extension.
+    const Register value = locs()->in(0).reg();
+    const Register out = locs()->out(0).reg();
+    __ Lsl(out, value, 32);
+    __ Asr(out, out, 32);
+    if (CanDeoptimize()) {
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
+      __ cmp(out, Operand(value, UXTW, 0));
+      __ b(deopt, NE);
+    }
+  } else if (from() == kUnboxedMint) {
+    UNREACHABLE();
+  } else if (to() == kUnboxedMint) {
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
+    UNREACHABLE();
+  } else {
+    UNREACHABLE();
   }
 }
 
@@ -5233,26 +5362,6 @@
 }
 
 
-void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ Bind(compiler->GetJumpLabel(this));
-  if (!compiler->is_optimizing()) {
-    if (compiler->NeedsEdgeCounter(this)) {
-      compiler->EmitEdgeCounter();
-    }
-    // Add an edge counter.
-    // On ARM64 the deoptimization descriptor points after the edge counter
-    // code so that we can reuse the same pattern matching code as at call
-    // sites, which matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id_,
-                                   Scanner::kNoSourcePos);
-  }
-  if (HasParallelMove()) {
-    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
-  }
-}
-
-
 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
                                                 bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 19ffac3..629a225 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -84,6 +84,13 @@
 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register result = locs()->in(0).reg();
   ASSERT(result == EAX);
+
+  if (compiler->intrinsic_mode()) {
+    // Intrinsics don't have a frame.
+    __ ret();
+    return;
+  }
+
 #if defined(DEBUG)
   __ Comment("Stack Check");
   Label done;
@@ -161,10 +168,16 @@
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = (constant_address() == 0) ? 1 : 0;
+  const intptr_t kNumTemps =
+      (constant_address() == 0) && (representation() != kUnboxedInt32) ? 1 : 0;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_out(0, Location::RequiresFpuRegister());
+  if (representation() == kUnboxedDouble) {
+    locs->set_out(0, Location::RequiresFpuRegister());
+  } else {
+    ASSERT(representation() == kUnboxedInt32);
+    locs->set_out(0, Location::RequiresRegister());
+  }
   if (kNumTemps == 1) {
     locs->set_temp(0, Location::RequiresRegister());
   }
@@ -930,7 +943,7 @@
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(isolate,
                                kNumInputs,
-                               Location::RequiresRegister(),
+                               Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
 
@@ -1221,8 +1234,9 @@
     case kTypedDataUint16ArrayCid:
       return kTagged;
     case kTypedDataInt32ArrayCid:
+      return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
-      return value()->IsSmiValue() ? kTagged : kUnboxedMint;
+      return kUnboxedUint32;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1279,16 +1293,7 @@
       break;
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // For smis, use a writable register because the value must be untagged
-      // before storing. Mints are stored in registers pairs.
-      if (value()->IsSmiValue()) {
-        locs->set_in(2, Location::WritableRegister());
-      } else {
-        // We only move the lower 32-bits so we don't care where the high bits
-        // are located.
-        locs->set_in(2, Location::Pair(Location::RequiresRegister(),
-                                       Location::Any()));
-      }
+      locs->set_in(2, Location::RequiresRegister());
       break;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
@@ -1389,17 +1394,7 @@
     }
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      if (value()->IsSmiValue()) {
-        ASSERT(RequiredInputRepresentation(2) == kTagged);
-        Register value = locs()->in(2).reg();
-        __ SmiUntag(value);
-        __ movl(element_address, value);
-      } else {
-        ASSERT(RequiredInputRepresentation(2) == kUnboxedMint);
-        PairLocation* value_pair = locs()->in(2).AsPairLocation();
-        Register value1 = value_pair->At(0).reg();
-        __ movl(element_address, value1);
-      }
+      __ movl(element_address, locs()->in(2).reg());
       break;
     case kTypedDataFloat32ArrayCid:
       __ movss(element_address, locs()->in(2).fpu_reg());
@@ -1689,7 +1684,6 @@
                  String::Handle(cls_.PrettyName()).ToCString());
     }
     __ Bind(entry_label());
-
     const Code& stub =
         Code::Handle(isolate, stub_code->GetAllocationStubForClass(cls_));
     const ExternalLabel label(stub.EntryPoint());
@@ -1713,22 +1707,30 @@
                        const Class& cls,
                        Register result,
                        Register temp) {
-    BoxAllocationSlowPath* slow_path =
-        new BoxAllocationSlowPath(instruction, cls, result);
-    compiler->AddSlowPathCode(slow_path);
+    if (compiler->intrinsic_mode()) {
+      __ TryAllocate(cls,
+                     compiler->intrinsic_slow_path_label(),
+                     Assembler::kFarJump,
+                     result,
+                     temp);
+    } else {
+      BoxAllocationSlowPath* slow_path =
+          new BoxAllocationSlowPath(instruction, cls, result);
+      compiler->AddSlowPathCode(slow_path);
 
-    __ TryAllocate(cls,
-                   slow_path->entry_label(),
-                   Assembler::kFarJump,
-                   result,
-                   temp);
-    __ Bind(slow_path->exit_label());
+      __ TryAllocate(cls,
+                     slow_path->entry_label(),
+                     Assembler::kFarJump,
+                     result,
+                     temp);
+      __ Bind(slow_path->exit_label());
+    }
   }
 
  private:
   Instruction* instruction_;
   const Class& cls_;
-  Register result_;
+  const Register result_;
 };
 
 
@@ -6394,54 +6396,7 @@
 }
 
 
-LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
-                                                     bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
-      kNumInputs,
-      kNumTemps,
-      ValueFitsSmi() ? LocationSummary::kNoCall
-                     : LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, ValueFitsSmi() ? Location::SameAsFirstInput()
-                                     : Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register value = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
-
-  Label not_smi, done;
-
-  if (ValueFitsSmi()) {
-    ASSERT(value == out);
-    __ SmiTag(value);
-  } else {
-    ASSERT(value != out);
-    __ cmpl(value, Immediate(kSmiMax));
-    __ j(ABOVE, &not_smi);
-    // Smi.
-    __ movl(out, value);
-    __ SmiTag(out);
-    __ jmp(&done);
-    __ Bind(&not_smi);
-    // Allocate a mint.
-    BoxAllocationSlowPath::Allocate(
-        compiler, this, compiler->mint_class(), out, kNoRegister);
-    // Copy low word into mint.
-    __ movl(FieldAddress(out, Mint::value_offset()), value);
-    // Zero high word.
-    __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), Immediate(0));
-    __ Bind(&done);
-  }
-}
-
-
-LocationSummary* BoxInt32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -6449,25 +6404,32 @@
       isolate, kNumInputs, kNumTemps,
       ValueFitsSmi() ? LocationSummary::kNoCall
                      : LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, ValueFitsSmi() ? Location::RequiresRegister()
-                                    : Location::WritableRegister());
+  const bool needs_writable_input = ValueFitsSmi() ||
+      (from_representation() == kUnboxedUint32);
+  summary->set_in(0, needs_writable_input ? Location::RequiresRegister()
+                                          : Location::WritableRegister());
   summary->set_out(0, ValueFitsSmi() ? Location::SameAsFirstInput()
                                      : Location::RequiresRegister());
   return summary;
 }
 
 
-void BoxInt32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register value = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
+void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
 
-  if (out != value) {
-    __ movl(out, value);
-  }
-  __ shll(out, Immediate(1));
+  __ MoveRegister(out, value);
+  __ shll(out, Immediate(kSmiTagSize));
   if (!ValueFitsSmi()) {
     Label done;
-    __ j(NO_OVERFLOW, &done);
+    ASSERT(value != out);
+    if (from_representation() == kUnboxedInt32) {
+      __ j(NO_OVERFLOW, &done);
+    } else {
+      __ testl(value, Immediate(0xC0000000));
+      __ j(ZERO, &done);
+    }
+
     // Allocate a mint.
     // Value input is writable register and has to be manually preserved
     // on the slow path.
@@ -6475,126 +6437,102 @@
     BoxAllocationSlowPath::Allocate(
         compiler, this, compiler->mint_class(), out, kNoRegister);
     __ movl(FieldAddress(out, Mint::value_offset()), value);
-    __ sarl(value, Immediate(31));  // Sign extend.
-    __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), value);
+    if (from_representation() == kUnboxedInt32) {
+      __ sarl(value, Immediate(31));  // Sign extend.
+      __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), value);
+    } else {
+      __ movl(FieldAddress(out, Mint::value_offset() + kWordSize),
+              Immediate(0));
+    }
     __ Bind(&done);
   }
 }
 
 
-LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t value_cid = value()->Type()->ToCid();
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps =
-      ((value_cid == kMintCid) || (value_cid == kSmiCid)) ? 0 : 1;
+  intptr_t kNumTemps = 0;
+
+  if (CanDeoptimize()) {
+    if ((value_cid != kSmiCid) &&
+        (value_cid != kMintCid) &&
+        !is_truncating()) {
+      kNumTemps = 2;
+    } else {
+      kNumTemps = 1;
+    }
+  }
+
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    summary->set_temp(0, Location::RequiresRegister());
+  for (int i = 0; i < kNumTemps; i++) {
+    summary->set_temp(i, Location::RequiresRegister());
   }
-  summary->set_out(0, Location::SameAsFirstInput());
-  return summary;
-}
-
-
-void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  ASSERT(value == locs()->out(0).reg());
-
-  // TODO(johnmccutchan): Emit better code for constant inputs.
-  if (value_cid == kMintCid) {
-    __ movl(value, FieldAddress(value, Mint::value_offset()));
-  } else if (value_cid == kSmiCid) {
-    __ SmiUntag(value);
-  } else {
-    Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
-                                          ICData::kDeoptUnboxInteger);
-    Label is_smi, done;
-    __ testl(value, Immediate(kSmiTagMask));
-    __ j(ZERO, &is_smi);
-    __ CompareClassId(value, kMintCid, temp);
-    __ j(NOT_EQUAL, deopt);
-    __ movl(value, FieldAddress(value, Mint::value_offset()));
-    __ jmp(&done);
-    __ Bind(&is_smi);
-    __ SmiUntag(value);
-    __ Bind(&done);
-  }
-}
-
-
-LocationSummary* UnboxInt32Instr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = CanDeoptimize() ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, (value_cid == kSmiCid) ? Location::SameAsFirstInput()
-                                             : Location::RequiresRegister());
+  summary->set_out(0, ((value_cid == kSmiCid) || (value_cid != kMintCid)) ?
+      Location::SameAsFirstInput() : Location::RequiresRegister());
   return summary;
 }
 
 
 static void LoadInt32FromMint(FlowGraphCompiler* compiler,
-                              Register mint,
                               Register result,
+                              const Address& lo,
+                              const Address& hi,
                               Register temp,
                               Label* deopt) {
-  __ movl(result, FieldAddress(mint, Mint::value_offset()));
+  __ movl(result, lo);
   if (deopt != NULL) {
+    ASSERT(temp != result);
     __ movl(temp, result);
     __ sarl(temp, Immediate(31));
-    __ cmpl(temp, FieldAddress(mint, Mint::value_offset() + kWordSize));
+    __ cmpl(temp, hi);
     __ j(NOT_EQUAL, deopt);
   }
 }
 
 
-void UnboxInt32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
+  Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
+  const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+  Label* out_of_range = !is_truncating() ? deopt : NULL;
 
-  // TODO(johnmccutchan): Emit better code for constant inputs.
-  if (value_cid == kMintCid) {
-    Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
-    Label* deopt = CanDeoptimize() ?
-        compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
-    LoadInt32FromMint(compiler,
-                      value,
-                      result,
-                      temp,
-                      deopt);
-  } else if (value_cid == kSmiCid) {
+  const intptr_t lo_offset = Mint::value_offset();
+  const intptr_t hi_offset = Mint::value_offset() + kWordSize;
+
+  if (value_cid == kSmiCid) {
     ASSERT(value == result);
     __ SmiUntag(value);
-  } else {
-    Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
-                                          ICData::kDeoptUnboxInteger);
-    Label is_smi, done;
-    __ testl(value, Immediate(kSmiTagMask));
-    __ j(ZERO, &is_smi);
-    __ CompareClassId(value, kMintCid, temp);
-    __ j(NOT_EQUAL, deopt);
+  } else if (value_cid == kMintCid) {
+    ASSERT((value != result) || (out_of_range == NULL));
     LoadInt32FromMint(compiler,
-                      value,
                       result,
+                      FieldAddress(value, lo_offset),
+                      FieldAddress(value, hi_offset),
                       temp,
-                      deopt);
-    __ movl(value, FieldAddress(value, Mint::value_offset()));
-    __ jmp(&done);
-    __ Bind(&is_smi);
-    __ SmiUntag(value);
+                      out_of_range);
+  } else {
+    ASSERT(value == result);
+    Label done;
+    __ SmiUntagOrCheckClass(value, kMintCid, temp, &done);
+    __ j(NOT_EQUAL, deopt);
+    if (out_of_range != NULL) {
+      Register value_temp = locs()->temp(1).reg();
+      __ movl(value_temp, value);
+      value = value_temp;
+    }
+    LoadInt32FromMint(compiler,
+                      result,
+                      Address(value, TIMES_2, lo_offset),
+                      Address(value, TIMES_2, hi_offset),
+                      temp,
+                      out_of_range);
     __ Bind(&done);
   }
 }
@@ -6726,25 +6664,6 @@
 }
 
 
-void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ Bind(compiler->GetJumpLabel(this));
-  if (!compiler->is_optimizing()) {
-    if (compiler->NeedsEdgeCounter(this)) {
-      compiler->EmitEdgeCounter();
-    }
-    // The deoptimization descriptor points after the edge counter code for
-    // uniformity with ARM and MIPS, where we can reuse pattern matching
-    // code that matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id_,
-                                   Scanner::kNoSourcePos);
-  }
-  if (HasParallelMove()) {
-    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
-  }
-}
-
-
 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
                                                 bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 3e64712..4462f6e 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -88,6 +88,13 @@
   __ TraceSimMsg("ReturnInstr");
   Register result = locs()->in(0).reg();
   ASSERT(result == V0);
+
+  if (compiler->intrinsic_mode()) {
+    // Intrinsics don't have a frame.
+    __ Ret();
+    return;
+  }
+
 #if defined(DEBUG)
   Label stack_ok;
   __ Comment("Stack Check");
@@ -316,25 +323,44 @@
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = (representation_ == kUnboxedInt32) ? 0 : 1;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_out(0, Location::RequiresFpuRegister());
-  locs->set_temp(0, Location::RequiresRegister());
+  if (representation_ == kUnboxedInt32) {
+    locs->set_out(0, Location::RequiresRegister());
+  } else {
+    ASSERT(representation_ == kUnboxedDouble);
+    locs->set_out(0, Location::RequiresFpuRegister());
+  }
+  if (kNumTemps > 0) {
+    locs->set_temp(0, Location::RequiresRegister());
+  }
   return locs;
 }
 
 
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ASSERT(representation_ == kUnboxedDouble);
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
-    ASSERT(value().IsDouble());
-    const Register const_value = locs()->temp(0).reg();
-    const DRegister result = locs()->out(0).fpu_reg();
-    __ LoadObject(const_value, value());
-    __ LoadDFromOffset(result, const_value,
-        Double::value_offset() - kHeapObjectTag);
+    switch (representation_) {
+      case kUnboxedDouble: {
+        ASSERT(value().IsDouble());
+        const Register const_value = locs()->temp(0).reg();
+        const DRegister result = locs()->out(0).fpu_reg();
+        __ LoadObject(const_value, value());
+        __ LoadDFromOffset(result, const_value,
+            Double::value_offset() - kHeapObjectTag);
+        break;
+      }
+
+      case kUnboxedInt32:
+        __ LoadImmediate(locs()->out(0).reg(),
+                         Smi::Cast(value()).Value());
+        break;
+
+      default:
+        UNREACHABLE();
+    }
   }
 }
 
@@ -1252,8 +1278,9 @@
     case kTypedDataUint16ArrayCid:
       return kTagged;
     case kTypedDataInt32ArrayCid:
+      return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
-      return value()->IsSmiValue() ? kTagged : kUnboxedMint;
+      return kUnboxedUint32;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1389,14 +1416,7 @@
     }
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid: {
-      if (value()->IsSmiValue()) {
-        ASSERT(RequiredInputRepresentation(2) == kTagged);
-        Register value = locs()->in(2).reg();
-        __ SmiUntag(TMP, value);
-        __ sw(TMP, element_address);
-      } else {
-        UNIMPLEMENTED();
-      }
+      __ sw(locs()->in(2).reg(), element_address);
       break;
     }
     case kTypedDataFloat32ArrayCid: {
@@ -1706,7 +1726,6 @@
       __ mov(result_, V0);
     }
     compiler->RestoreLiveRegisters(locs);
-
     __ b(exit_label());
   }
 
@@ -1715,21 +1734,28 @@
                        const Class& cls,
                        Register result,
                        Register temp) {
-    BoxAllocationSlowPath* slow_path =
-        new BoxAllocationSlowPath(instruction, cls, result);
-    compiler->AddSlowPathCode(slow_path);
+    if (compiler->intrinsic_mode()) {
+      __ TryAllocate(cls,
+                     compiler->intrinsic_slow_path_label(),
+                     result,
+                     temp);
+    } else {
+      BoxAllocationSlowPath* slow_path =
+          new BoxAllocationSlowPath(instruction, cls, result);
+      compiler->AddSlowPathCode(slow_path);
 
-    __ TryAllocate(cls,
-                   slow_path->entry_label(),
-                   result,
-                   temp);
-    __ Bind(slow_path->exit_label());
+      __ TryAllocate(cls,
+                     slow_path->entry_label(),
+                     result,
+                     temp);
+      __ Bind(slow_path->exit_label());
+    }
   }
 
  private:
   Instruction* instruction_;
   const Class& cls_;
-  Register result_;
+  const Register result_;
 };
 
 
@@ -4569,12 +4595,166 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr)
 DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr)
 DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt32Instr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxInt32Instr)
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxUint32Instr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxUint32Instr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxedIntConverterInstr)
+
+
+LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_temp(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  Label done;
+  __ SmiTag(out, value);
+  if (!ValueFitsSmi()) {
+    Register temp = locs()->temp(0).reg();
+    if (from_representation() == kUnboxedInt32) {
+      __ SmiUntag(CMPRES1, out);
+      __ BranchEqual(CMPRES1, value, &done);
+    } else {
+      ASSERT(from_representation() == kUnboxedUint32);
+      __ AndImmediate(CMPRES1, value, 0xC0000000);
+      __ BranchEqual(CMPRES1, ZR, &done);
+    }
+    BoxAllocationSlowPath::Allocate(
+        compiler,
+        this,
+        compiler->mint_class(),
+        out,
+        temp);
+    Register hi;
+    if (from_representation() == kUnboxedInt32) {
+      hi = temp;
+      __ sra(hi, value, kBitsPerWord - 1);
+    } else {
+      ASSERT(from_representation() == kUnboxedUint32);
+      hi = ZR;
+    }
+    __ StoreToOffset(value,
+                     out,
+                     Mint::value_offset() - kHeapObjectTag);
+    __ StoreToOffset(hi,
+                     out,
+                     Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ Bind(&done);
+  }
+}
+
+
+LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
+  ASSERT((representation() == kUnboxedInt32) ||
+         (representation() == kUnboxedUint32));
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+static void LoadInt32FromMint(FlowGraphCompiler* compiler,
+                              Register mint,
+                              Register result,
+                              Label* deopt) {
+  __ LoadFromOffset(result,
+                    mint,
+                    Mint::value_offset() - kHeapObjectTag);
+  if (deopt != NULL) {
+    __ LoadFromOffset(CMPRES1,
+                      mint,
+                      Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ sra(CMPRES2, result, kBitsPerWord - 1);
+    __ BranchNotEqual(CMPRES1, CMPRES2, deopt);
+  }
+}
+
+
+void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  Label* deopt = CanDeoptimize() ?
+        compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+  Label* out_of_range = !is_truncating() ? deopt : NULL;
+  ASSERT(value != out);
+
+  if (value_cid == kSmiCid) {
+    __ SmiUntag(out, value);
+  } else if (value_cid == kMintCid) {
+    LoadInt32FromMint(compiler, value, out, out_of_range);
+  } else {
+    Label done;
+    __ SmiUntag(out, value);
+    __ andi(CMPRES1, value, Immediate(kSmiTagMask));
+    __ beq(CMPRES1, ZR, &done);
+    __ LoadClassId(CMPRES1, value);
+    __ BranchNotEqual(CMPRES1, kMintCid, deopt);
+    LoadInt32FromMint(compiler, value, out, out_of_range);
+    __ Bind(&done);
+  }
+}
+
+
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  if (from() == kUnboxedMint) {
+    UNREACHABLE();
+  } else if (to() == kUnboxedMint) {
+    UNREACHABLE();
+  } else {
+    ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_out(0, Location::SameAsFirstInput());
+  }
+  return summary;
+}
+
+
+void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (from() == kUnboxedInt32 && to() == kUnboxedUint32) {
+    const Register out = locs()->out(0).reg();
+    // Representations are bitwise equivalent.
+    ASSERT(out == locs()->in(0).reg());
+  } else if (from() == kUnboxedUint32 && to() == kUnboxedInt32) {
+    const Register out = locs()->out(0).reg();
+    // Representations are bitwise equivalent.
+    ASSERT(out == locs()->in(0).reg());
+    if (CanDeoptimize()) {
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
+      __ BranchSignedLess(out, 0, deopt);
+    }
+  } else if (from() == kUnboxedMint) {
+    UNREACHABLE();
+  } else if (to() == kUnboxedMint) {
+    ASSERT(from() == kUnboxedUint32 || from() == kUnboxedInt32);
+    UNREACHABLE();
+  } else {
+    UNREACHABLE();
+  }
+}
 
 
 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
@@ -4618,25 +4798,6 @@
 }
 
 
-void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ Bind(compiler->GetJumpLabel(this));
-  if (!compiler->is_optimizing()) {
-    if (compiler->NeedsEdgeCounter(this)) {
-      compiler->EmitEdgeCounter();
-    }
-    // On MIPS the deoptimization descriptor points after the edge counter
-    // code so that we can reuse the same pattern matching code as at call
-    // sites, which matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id_,
-                                   Scanner::kNoSourcePos);
-  }
-  if (HasParallelMove()) {
-    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
-  }
-}
-
-
 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
                                                 bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 0468d64..93b0492 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -83,6 +83,13 @@
 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register result = locs()->in(0).reg();
   ASSERT(result == RAX);
+
+  if (compiler->intrinsic_mode()) {
+    // Intrinsics don't have a frame.
+    __ ret();
+    return;
+  }
+
 #if defined(DEBUG)
   __ Comment("Stack Check");
   Label done;
@@ -247,21 +254,41 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_out(0, Location::RequiresFpuRegister());
+  switch (representation()) {
+    case kUnboxedDouble:
+      locs->set_out(0, Location::RequiresFpuRegister());
+      break;
+    case kUnboxedInt32:
+      locs->set_out(0, Location::RequiresRegister());
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
   return locs;
 }
 
 
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ASSERT(representation_ == kUnboxedDouble);
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
-    XmmRegister result = locs()->out(0).fpu_reg();
-    if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
-      __ xorps(result, result);
-    } else {
-      __ LoadObject(TMP, value(), PP);
-      __ movsd(result, FieldAddress(TMP, Double::value_offset()));
+    switch (representation()) {
+      case kUnboxedDouble: {
+        XmmRegister result = locs()->out(0).fpu_reg();
+        if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+          __ xorps(result, result);
+        } else {
+          __ LoadObject(TMP, value(), PP);
+          __ movsd(result, FieldAddress(TMP, Double::value_offset()));
+        }
+        break;
+      }
+      case kUnboxedInt32:
+        __ movl(locs()->out(0).reg(),
+                Immediate(static_cast<int32_t>(Smi::Cast(value()).Value())));
+        break;
+      default:
+        UNREACHABLE();
     }
   }
 }
@@ -1082,9 +1109,11 @@
     case kExternalTypedDataUint8ClampedArrayCid:
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
-    case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid:
       return kTagged;
+    case kTypedDataInt32ArrayCid:
+      return kUnboxedInt32;
+    case kTypedDataUint32ArrayCid:
+      return kUnboxedUint32;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1242,7 +1271,6 @@
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid: {
       Register value = locs()->in(2).reg();
-      __ SmiUntag(value);
       __ movl(element_address, value);
         break;
     }
@@ -1523,7 +1551,6 @@
                  String::Handle(cls_.PrettyName()).ToCString());
     }
     __ Bind(entry_label());
-
     const Code& stub =
         Code::Handle(isolate, stub_code->GetAllocationStubForClass(cls_));
     const ExternalLabel label(stub.EntryPoint());
@@ -1546,22 +1573,30 @@
                        Instruction* instruction,
                        const Class& cls,
                        Register result) {
-    BoxAllocationSlowPath* slow_path =
-        new BoxAllocationSlowPath(instruction, cls, result);
-    compiler->AddSlowPathCode(slow_path);
+    if (compiler->intrinsic_mode()) {
+      __ TryAllocate(cls,
+                     compiler->intrinsic_slow_path_label(),
+                     Assembler::kFarJump,
+                     result,
+                     PP);
+    } else {
+      BoxAllocationSlowPath* slow_path =
+          new BoxAllocationSlowPath(instruction, cls, result);
+      compiler->AddSlowPathCode(slow_path);
 
-    __ TryAllocate(cls,
-                   slow_path->entry_label(),
-                   Assembler::kFarJump,
-                   result,
-                   PP);
-    __ Bind(slow_path->exit_label());
+      __ TryAllocate(cls,
+                     slow_path->entry_label(),
+                     Assembler::kFarJump,
+                     result,
+                     PP);
+      __ Bind(slow_path->exit_label());
+    }
   }
 
  private:
   Instruction* instruction_;
   const Class& cls_;
-  Register result_;
+  const Register result_;
 };
 
 
@@ -5520,38 +5555,137 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr)
 DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr)
 DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt32Instr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxInt32Instr)
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxUint32Instr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxedIntConverterInstr)
 
 
-LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
+LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
+  const intptr_t kNumTemps = (!is_truncating() && CanDeoptimize()) ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
+  if (kNumTemps > 0) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
   return summary;
 }
 
 
-void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->Type()->ToCid();
   const Register value = locs()->in(0).reg();
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
   ASSERT(value == locs()->out(0).reg());
 
   if (value_cid == kSmiCid) {
     __ SmiUntag(value);
+  } else if (value_cid == kMintCid) {
+    __ movq(value, FieldAddress(value, Mint::value_offset()));
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
-                                          ICData::kDeoptUnboxInteger);
-    __ testq(value, Immediate(kSmiTagMask));
-    __ j(NOT_ZERO, deopt);
-    __ SmiUntag(value);
+    Label done;
+    // Optimistically untag value.
+    __ SmiUntagOrCheckClass(value, kMintCid, &done);
+    __ j(NOT_EQUAL, deopt);
+    // Undo untagging by multiplying value with 2.
+    __ movq(value, Address(value, TIMES_2, Mint::value_offset()));
+    __ Bind(&done);
+  }
+
+  // TODO(vegorov): as it is implemented right now truncating unboxing would
+  // leave "garbage" in the higher word.
+  if (!is_truncating() && (deopt != NULL)) {
+    ASSERT(representation() == kUnboxedInt32);
+    Register temp = locs()->temp(0).reg();
+    __ movsxd(temp, value);
+    __ cmpq(temp, value);
+    __ j(NOT_EQUAL, deopt);
+  }
+}
+
+
+LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  ASSERT(kSmiTagSize == 1);
+  if (from_representation() == kUnboxedInt32) {
+    __ movsxd(out, value);
+  } else {
+    ASSERT(from_representation() == kUnboxedUint32);
+    __ movl(out, value);
+  }
+  __ SmiTag(out);
+}
+
+
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  if (from() == kUnboxedMint) {
+    UNREACHABLE();
+  } else if (to() == kUnboxedMint) {
+    UNREACHABLE();
+  } else {
+    ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_out(0, Location::SameAsFirstInput());
+  }
+  return summary;
+}
+
+
+void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (from() == kUnboxedInt32 && to() == kUnboxedUint32) {
+    const Register value = locs()->in(0).reg();
+    const Register out = locs()->out(0).reg();
+    // Representations are bitwise equivalent but we want to normalize
+    // upperbits for safety reasons.
+    // TODO(vegorov) if we ensure that we never use upperbits we could
+    // avoid this.
+    __ movl(out, value);
+  } else if (from() == kUnboxedUint32 && to() == kUnboxedInt32) {
+    // Representations are bitwise equivalent.
+    const Register value = locs()->in(0).reg();
+    const Register out = locs()->out(0).reg();
+    __ movsxd(out, value);
+    if (CanDeoptimize()) {
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
+      __ testl(out, out);
+      __ j(NEGATIVE, deopt);
+    }
+  } else if (from() == kUnboxedMint) {
+    UNREACHABLE();
+  } else if (to() == kUnboxedMint) {
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
+    UNREACHABLE();
+  } else {
+    UNREACHABLE();
   }
 }
 
@@ -5596,25 +5730,6 @@
 }
 
 
-void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ Bind(compiler->GetJumpLabel(this));
-  if (!compiler->is_optimizing()) {
-    if (compiler->NeedsEdgeCounter(this)) {
-      compiler->EmitEdgeCounter();
-    }
-    // The deoptimization descriptor points after the edge counter code for
-    // uniformity with ARM and MIPS, where we can reuse pattern matching
-    // code that matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id_,
-                                   Scanner::kNoSourcePos);
-  }
-  if (HasParallelMove()) {
-    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
-  }
-}
-
-
 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
                                                 bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index d0a58b7..119eb9d 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -9,10 +9,21 @@
 #include "vm/object.h"
 #include "vm/symbols.h"
 
+#include "vm/flow_graph.h"
+#include "vm/flow_graph_compiler.h"
+#include "vm/flow_graph_allocator.h"
+#include "vm/flow_graph_builder.h"
+#include "vm/il_printer.h"
+#include "vm/intermediate_language.h"
+#include "vm/parser.h"
+
 namespace dart {
 
 DEFINE_FLAG(bool, intrinsify, true, "Instrinsify when possible");
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
+DECLARE_FLAG(bool, code_comments);
+DECLARE_FLAG(bool, print_flow_graph);
+DECLARE_FLAG(bool, print_flow_graph_optimized);
 
 bool Intrinsifier::CanIntrinsify(const Function& function) {
   if (!FLAG_intrinsify) return false;
@@ -59,6 +70,7 @@
   ASSERT(!lib.IsNull());
   CORE_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
   CORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
+  GRAPH_CORE_INTRINSICS_LIST(SETUP_FUNCTION);
 
   // Set up all math lib functions that can be intrisified.
   lib = Library::MathLibrary();
@@ -69,6 +81,7 @@
   lib = Library::TypedDataLibrary();
   ASSERT(!lib.IsNull());
   TYPED_DATA_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
+  GRAPH_TYPED_DATA_INTRINSICS_LIST(SETUP_FUNCTION);
 
   // Setup all dart:profiler lib functions that can be intrinsified.
   lib = Library::ProfilerLibrary();
@@ -79,14 +92,103 @@
 }
 
 
-void Intrinsifier::Intrinsify(const Function& function, Assembler* assembler) {
-  if (!CanIntrinsify(function)) return;
+static void EmitCodeFor(FlowGraphCompiler* compiler,
+                        FlowGraph* graph) {
+  // The FlowGraph here is constructed by the intrinsics builder methods, and
+  // is different from compiler->flow_graph(), the original method's flow graph.
+  compiler->assembler()->Comment("Graph intrinsic");
+  for (intptr_t i = 0; i < graph->reverse_postorder().length(); i++) {
+    BlockEntryInstr* block = graph->reverse_postorder()[i];
+    if (block->IsGraphEntry()) continue;  // No code for graph entry needed.
+
+    if (block->HasParallelMove()) {
+      compiler->parallel_move_resolver()->EmitNativeCode(
+          block->parallel_move());
+    }
+
+    for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
+      Instruction* instr = it.Current();
+      if (FLAG_code_comments) compiler->EmitComment(instr);
+      if (instr->IsParallelMove()) {
+        compiler->parallel_move_resolver()->EmitNativeCode(
+            instr->AsParallelMove());
+      } else {
+        ASSERT(instr->locs() != NULL);
+        // Calls are not supported in intrinsics code.
+        ASSERT(!instr->locs()->always_calls());
+        instr->EmitNativeCode(compiler);
+      }
+    }
+  }
+}
+
+
+bool Intrinsifier::GraphIntrinsify(ParsedFunction* parsed_function,
+                                   FlowGraphCompiler* compiler) {
+  ZoneGrowableArray<const ICData*>* ic_data_array =
+      new ZoneGrowableArray<const ICData*>();
+  FlowGraphBuilder builder(parsed_function,
+                           *ic_data_array,
+                           NULL,  // NULL = not inlining.
+                           Isolate::kNoDeoptId);  // No OSR id.
+
+  intptr_t block_id = builder.AllocateBlockId();
+  TargetEntryInstr* normal_entry =
+      new TargetEntryInstr(block_id,
+                           CatchClauseNode::kInvalidTryIndex);
+  GraphEntryInstr* graph_entry = new GraphEntryInstr(
+      parsed_function, normal_entry, Isolate::kNoDeoptId);  // No OSR id.
+  FlowGraph* graph = new FlowGraph(builder, graph_entry, block_id);
+  const Function& function = parsed_function->function();
+  switch (function.recognized_kind()) {
+#define EMIT_CASE(test_class_name, test_function_name, enum_name, fp)          \
+    case MethodRecognizer::k##enum_name:                                       \
+      ASSERT(function.CheckSourceFingerprint(fp));                             \
+      if (!Build_##enum_name(graph)) return false;                             \
+      break;
+
+    GRAPH_INTRINSICS_LIST(EMIT_CASE);
+    default:
+      return false;
+#undef EMIT_CASE
+  }
+
+  if (FLAG_print_flow_graph || FLAG_print_flow_graph_optimized) {
+    OS::Print("Intrinsic graph before\n");
+    FlowGraphPrinter printer(*graph);
+    printer.PrintBlocks();
+  }
+
+  // Perform register allocation on the SSA graph.
+  FlowGraphAllocator allocator(*graph, true);  // Intrinsic mode.
+  allocator.AllocateRegisters();
+
+  if (FLAG_print_flow_graph || FLAG_print_flow_graph_optimized) {
+    OS::Print("Intrinsic graph after\n");
+    FlowGraphPrinter printer(*graph);
+    printer.PrintBlocks();
+  }
+  EmitCodeFor(compiler, graph);
+  return true;
+}
+
+
+void Intrinsifier::Intrinsify(ParsedFunction* parsed_function,
+                              FlowGraphCompiler* compiler) {
+  const Function& function = parsed_function->function();
+  if (!CanIntrinsify(function)) {
+    return;
+  }
+
+  if (GraphIntrinsify(parsed_function, compiler)) {
+    return;
+  }
 
 #define EMIT_CASE(test_class_name, test_function_name, enum_name, fp)          \
     case MethodRecognizer::k##enum_name:                                       \
       ASSERT(function.CheckSourceFingerprint(fp));                             \
-      assembler->Comment("Intrinsic");                                         \
-      enum_name(assembler);                                                    \
+      compiler->assembler()->Comment("Intrinsic");                             \
+      enum_name(compiler->assembler());                                        \
       break;
 
   if (FLAG_throw_on_javascript_int_overflow && (Smi::kBits >= 32)) {
@@ -94,20 +196,13 @@
     // intrinsify when Smi > 32 bits if we are looking for javascript integer
     // overflow.
     switch (function.recognized_kind()) {
-      CORE_LIB_INTRINSIC_LIST(EMIT_CASE);
-      MATH_LIB_INTRINSIC_LIST(EMIT_CASE);
-      TYPED_DATA_LIB_INTRINSIC_LIST(EMIT_CASE);
-      PROFILER_LIB_INTRINSIC_LIST(EMIT_CASE);
+      ALL_INTRINSICS_NO_INTEGER_LIB_LIST(EMIT_CASE);
       default:
         break;
     }
   } else {
     switch (function.recognized_kind()) {
-      CORE_LIB_INTRINSIC_LIST(EMIT_CASE);
-      CORE_INTEGER_LIB_INTRINSIC_LIST(EMIT_CASE);
-      MATH_LIB_INTRINSIC_LIST(EMIT_CASE);
-      TYPED_DATA_LIB_INTRINSIC_LIST(EMIT_CASE);
-      PROFILER_LIB_INTRINSIC_LIST(EMIT_CASE);
+      ALL_INTRINSICS_LIST(EMIT_CASE);
       default:
         UNREACHABLE();
         break;
@@ -116,4 +211,356 @@
 #undef EMIT_INTRINSIC
 }
 
+
+class BlockBuilder : public ValueObject {
+ public:
+  BlockBuilder(FlowGraph* flow_graph, TargetEntryInstr* entry)
+      : flow_graph_(flow_graph), entry_(entry), current_(entry) { }
+
+  Definition* AddToInitialDefinitions(Definition* def) {
+    def->set_ssa_temp_index(flow_graph_->alloc_ssa_temp_index());
+    flow_graph_->AddToInitialDefinitions(def);
+    return def;
+  }
+
+  Definition* AddDefinition(Definition* def) {
+    def->set_ssa_temp_index(flow_graph_->alloc_ssa_temp_index());
+    current_ = current_->AppendInstruction(def);
+    return def;
+  }
+
+  Instruction* AddInstruction(Instruction* instr) {
+    current_ = current_->AppendInstruction(instr);
+    return instr;
+  }
+
+  void AddIntrinsicReturn(Value* value) {
+    ReturnInstr* instr = new ReturnInstr(TokenPos(), value);
+    AddInstruction(instr);
+    entry_->set_last_instruction(instr);
+  }
+
+  Definition* AddParameter(intptr_t index) {
+    intptr_t adjustment = Intrinsifier::ParameterSlotFromSp();
+    return AddToInitialDefinitions(
+      new ParameterInstr(adjustment + index,
+                         flow_graph_->graph_entry(),
+                         SPREG));
+  }
+
+  intptr_t TokenPos() {
+    return flow_graph_->parsed_function().function().token_pos();
+  }
+
+ private:
+  FlowGraph* flow_graph_;
+  BlockEntryInstr* entry_;
+  Instruction* current_;
+};
+
+
+static void PrepareIndexedOp(BlockBuilder* builder,
+                             Definition* array,
+                             Definition* index,
+                             intptr_t length_offset) {
+  intptr_t token_pos = builder->TokenPos();
+  builder->AddInstruction(
+      new CheckSmiInstr(new Value(index),
+                        Isolate::kNoDeoptId,
+                        token_pos));
+
+  Definition* length = builder->AddDefinition(
+      new LoadFieldInstr(new Value(array),
+                         length_offset,
+                         Type::ZoneHandle(Type::SmiType()),
+                         true));  // immutable
+  builder->AddInstruction(
+      new CheckArrayBoundInstr(new Value(length),
+                               new Value(index),
+                               Isolate::kNoDeoptId));
+}
+
+
+bool Intrinsifier::Build_ObjectArrayGetIndexed(FlowGraph* flow_graph) {
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* index = builder.AddParameter(1);
+  Definition* array = builder.AddParameter(2);
+
+  PrepareIndexedOp(&builder, array, index, Array::length_offset());
+
+  Definition* result = builder.AddDefinition(
+      new LoadIndexedInstr(new Value(array),
+                           new Value(index),
+                           Instance::ElementSizeFor(kArrayCid),  // index scale
+                           kArrayCid,
+                           Isolate::kNoDeoptId,
+                           builder.TokenPos()));
+  builder.AddIntrinsicReturn(new Value(result));
+  return true;
+}
+
+
+bool Intrinsifier::Build_ImmutableArrayGetIndexed(FlowGraph* flow_graph) {
+  return Build_ObjectArrayGetIndexed(flow_graph);
+}
+
+
+bool Intrinsifier::Build_Uint8ArrayGetIndexed(FlowGraph* flow_graph) {
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* index = builder.AddParameter(1);
+  Definition* array = builder.AddParameter(2);
+
+  PrepareIndexedOp(&builder, array, index, TypedData::length_offset());
+
+  Definition* result = builder.AddDefinition(
+      new LoadIndexedInstr(new Value(array),
+                           new Value(index),
+                           1,  // index scale
+                           kTypedDataUint8ArrayCid,
+                           Isolate::kNoDeoptId,
+                           builder.TokenPos()));
+  builder.AddIntrinsicReturn(new Value(result));
+  return true;
+}
+
+
+bool Intrinsifier::Build_ExternalUint8ArrayGetIndexed(FlowGraph* flow_graph) {
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* index = builder.AddParameter(1);
+  Definition* array = builder.AddParameter(2);
+
+  PrepareIndexedOp(&builder, array, index, ExternalTypedData::length_offset());
+
+  Definition* elements = builder.AddDefinition(
+      new LoadUntaggedInstr(new Value(array),
+                            ExternalTypedData::data_offset()));
+  Definition* result = builder.AddDefinition(
+      new LoadIndexedInstr(new Value(elements),
+                           new Value(index),
+                           1,  // index scale
+                           kExternalTypedDataUint8ArrayCid,
+                           Isolate::kNoDeoptId,
+                           builder.TokenPos()));
+  builder.AddIntrinsicReturn(new Value(result));
+  return true;
+}
+
+
+bool Intrinsifier::Build_Uint8ArraySetIndexed(FlowGraph* flow_graph) {
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* value = builder.AddParameter(1);
+  Definition* index = builder.AddParameter(2);
+  Definition* array = builder.AddParameter(3);
+
+  PrepareIndexedOp(&builder, array, index, TypedData::length_offset());
+
+  builder.AddInstruction(
+      new CheckSmiInstr(new Value(value),
+                        Isolate::kNoDeoptId,
+                        builder.TokenPos()));
+
+  builder.AddInstruction(
+      new StoreIndexedInstr(new Value(array),
+                            new Value(index),
+                            new Value(value),
+                            kNoStoreBarrier,
+                            1,  // index scale
+                            kTypedDataUint8ArrayCid,
+                            Isolate::kNoDeoptId,
+                            builder.TokenPos()));
+  // Return null.
+  Definition* null_def = builder.AddDefinition(
+      new ConstantInstr(Object::ZoneHandle(Object::null())));
+  builder.AddIntrinsicReturn(new Value(null_def));
+  return true;
+}
+
+
+bool Intrinsifier::Build_ExternalUint8ArraySetIndexed(FlowGraph* flow_graph) {
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* value = builder.AddParameter(1);
+  Definition* index = builder.AddParameter(2);
+  Definition* array = builder.AddParameter(3);
+
+  PrepareIndexedOp(&builder, array, index, ExternalTypedData::length_offset());
+
+  builder.AddInstruction(
+      new CheckSmiInstr(new Value(value),
+                        Isolate::kNoDeoptId,
+                        builder.TokenPos()));
+  Definition* elements = builder.AddDefinition(
+      new LoadUntaggedInstr(new Value(array),
+                            ExternalTypedData::data_offset()));
+  builder.AddInstruction(
+      new StoreIndexedInstr(new Value(elements),
+                            new Value(index),
+                            new Value(value),
+                            kNoStoreBarrier,
+                            1,  // index scale
+                            kExternalTypedDataUint8ArrayCid,
+                            Isolate::kNoDeoptId,
+                            builder.TokenPos()));
+  // Return null.
+  Definition* null_def = builder.AddDefinition(
+      new ConstantInstr(Object::ZoneHandle(Object::null())));
+  builder.AddIntrinsicReturn(new Value(null_def));
+  return true;
+}
+
+
+bool Intrinsifier::Build_Float64ArraySetIndexed(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* value = builder.AddParameter(1);
+  Definition* index = builder.AddParameter(2);
+  Definition* array = builder.AddParameter(3);
+
+  PrepareIndexedOp(&builder, array, index, TypedData::length_offset());
+
+  const ICData& value_check = ICData::ZoneHandle(ICData::New(
+      flow_graph->parsed_function().function(),
+      String::Handle(flow_graph->parsed_function().function().name()),
+      Object::empty_array(),  // Dummy args. descr.
+      Isolate::kNoDeoptId,
+      1));
+  value_check.AddReceiverCheck(kDoubleCid,
+                               flow_graph->parsed_function().function());
+  builder.AddInstruction(
+      new CheckClassInstr(new Value(value),
+                          Isolate::kNoDeoptId,
+                          value_check,
+                          builder.TokenPos()));
+  Definition* double_value = builder.AddDefinition(
+      new UnboxDoubleInstr(new Value(value), Isolate::kNoDeoptId));
+  // Manually adjust reaching type because there is no type propagation
+  // when building intrinsics.
+  double_value->AsUnboxDouble()->value()->SetReachingType(
+      ZoneCompileType::Wrap(CompileType::FromCid(kDoubleCid)));
+
+  builder.AddInstruction(
+      new StoreIndexedInstr(new Value(array),
+                            new Value(index),
+                            new Value(double_value),
+                            kNoStoreBarrier,
+                            8,  // index scale
+                            kTypedDataFloat64ArrayCid,
+                            Isolate::kNoDeoptId,
+                            builder.TokenPos()));
+  // Return null.
+  Definition* null_def = builder.AddDefinition(
+      new ConstantInstr(Object::ZoneHandle(Object::null())));
+  builder.AddIntrinsicReturn(new Value(null_def));
+  return true;
+}
+
+
+bool Intrinsifier::Build_Float64ArrayGetIndexed(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* index = builder.AddParameter(1);
+  Definition* array = builder.AddParameter(2);
+
+  PrepareIndexedOp(&builder, array, index, TypedData::length_offset());
+
+  Definition* unboxed_value = builder.AddDefinition(
+      new LoadIndexedInstr(new Value(array),
+                           new Value(index),
+                           8,  // index scale
+                           kTypedDataFloat64ArrayCid,
+                           Isolate::kNoDeoptId,
+                           builder.TokenPos()));
+  Definition* result = builder.AddDefinition(
+      new BoxDoubleInstr(new Value(unboxed_value)));
+  builder.AddIntrinsicReturn(new Value(result));
+  return true;
+}
+
+
+static bool BuildLoadField(FlowGraph* flow_graph, intptr_t offset) {
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* array = builder.AddParameter(1);
+
+  Definition* length = builder.AddDefinition(
+      new LoadFieldInstr(new Value(array),
+                         offset,
+                         Type::ZoneHandle(),
+                         builder.TokenPos()));
+  builder.AddIntrinsicReturn(new Value(length));
+  return true;
+}
+
+
+bool Intrinsifier::Build_ObjectArrayLength(FlowGraph* flow_graph) {
+  return BuildLoadField(flow_graph, Array::length_offset());
+}
+
+
+bool Intrinsifier::Build_ImmutableArrayLength(FlowGraph* flow_graph) {
+  return BuildLoadField(flow_graph, Array::length_offset());
+}
+
+
+bool Intrinsifier::Build_GrowableArrayLength(FlowGraph* flow_graph) {
+  return BuildLoadField(flow_graph, GrowableObjectArray::length_offset());
+}
+
+
+bool Intrinsifier::Build_StringBaseLength(FlowGraph* flow_graph) {
+  return BuildLoadField(flow_graph, String::length_offset());
+}
+
+
+bool Intrinsifier::Build_TypedDataLength(FlowGraph* flow_graph) {
+  return BuildLoadField(flow_graph, TypedData::length_offset());
+}
+
+
+bool Intrinsifier::Build_GrowableArrayCapacity(FlowGraph* flow_graph) {
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* array = builder.AddParameter(1);
+
+  Definition* backing_store = builder.AddDefinition(
+      new LoadFieldInstr(new Value(array),
+                         GrowableObjectArray::data_offset(),
+                         Type::ZoneHandle(),
+                         builder.TokenPos()));
+  Definition* capacity = builder.AddDefinition(
+      new LoadFieldInstr(new Value(backing_store),
+                         Array::length_offset(),
+                         Type::ZoneHandle(),
+                         builder.TokenPos()));
+  builder.AddIntrinsicReturn(new Value(capacity));
+  return true;
+}
+
+
 }  // namespace dart
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index 7c7671b..257cf22 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -13,25 +13,39 @@
 
 // Forward declarations.
 class Assembler;
+class FlowGraphCompiler;
 class Function;
+class TargetEntryInstr;
+class ParsedFunction;
+class FlowGraph;
 
 class Intrinsifier : public AllStatic {
  public:
-  // Try to intrinsify 'function'. Returns true if the function intrinsified
-  // completely and the code does not need to be generated (i.e., no slow
-  // path possible).
-  static void Intrinsify(const Function& function, Assembler* assembler);
+  static void Intrinsify(ParsedFunction* parsed_function,
+                         FlowGraphCompiler* compiler);
   static void InitializeState();
 
+  static bool GraphIntrinsify(ParsedFunction* parsed_function,
+                              FlowGraphCompiler* compiler);
+
+  static intptr_t ParameterSlotFromSp();
+
  private:
   static bool CanIntrinsify(const Function& function);
 
-#define DECLARE_FUNCTION(test_class_name, test_function_name, destination, fp) \
-  static void destination(Assembler* assembler);
+#define DECLARE_FUNCTION(test_class_name, test_function_name, enum_name, fp)   \
+  static void enum_name(Assembler* assembler);
 
   ALL_INTRINSICS_LIST(DECLARE_FUNCTION)
 
 #undef DECLARE_FUNCTION
+
+#define DECLARE_FUNCTION(test_class_name, test_function_name, enum_name, fp)   \
+  static bool Build_##enum_name(FlowGraph* flow_graph);
+
+  GRAPH_INTRINSICS_LIST(DECLARE_FUNCTION)
+
+#undef DECLARE_FUNCTION
 };
 
 }  // namespace dart
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index d07e2ff..e629f75 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -22,43 +22,7 @@
 #define __ assembler->
 
 
-void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, Array::length_offset()));
-  __ Ret();
-}
-
-
-void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
-  ObjectArrayLength(assembler);
-}
-
-
-void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
-  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array
-
-  __ tst(R0, Operand(kSmiTagMask));
-  __ b(&fall_through, NE);  // Index is not an smi, fall through
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, Array::length_offset()));
-  __ cmp(R0, Operand(R6));
-
-  ASSERT(kSmiTagShift == 1);
-  // array element at R1 + R0*2 + Array::data_offset - 1
-  __ add(R6, R1, Operand(R0, LSL, 1), CC);
-  __ ldr(R0, FieldAddress(R6, Array::data_offset()), CC);
-  __ bx(LR, CC);
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
-  ObjectArrayGetIndexed(assembler);
-}
+intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
 
 static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
@@ -173,21 +137,6 @@
 }
 
 
-void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, GrowableObjectArray::length_offset()));
-  __ Ret();
-}
-
-
-void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, GrowableObjectArray::data_offset()));
-  __ ldr(R0, FieldAddress(R0, Array::length_offset()));
-  __ Ret();
-}
-
-
 void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
@@ -392,134 +341,6 @@
   __ Bind(&fall_through);                                                      \
 
 
-// Gets the length of a TypedData.
-void Intrinsifier::TypedDataLength(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, TypedData::length_offset()));
-  __ Ret();
-}
-
-
-void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
-  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
-  __ tst(R0, Operand(kSmiTagMask));
-  __ b(&fall_through, NE);  // Index is not a smi, fall through.
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, TypedData::length_offset()));
-  __ cmp(R0, Operand(R6));
-  __ b(&fall_through, CS);
-
-  __ SmiUntag(R0);
-  __ AddImmediate(R1, TypedData::data_offset() - kHeapObjectTag);
-  __ ldrb(R0, Address(R1, R0));
-  __ SmiTag(R0);
-  __ Ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
-  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
-  __ tst(R0, Operand(kSmiTagMask));
-  __ b(&fall_through, NE);  // Index is not a smi, fall through.
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, TypedData::length_offset()));
-  __ cmp(R0, Operand(R6));
-  __ b(&fall_through, CS);
-
-  __ LoadFromOffset(kWord, R1, R1,
-      ExternalTypedData::data_offset() - kHeapObjectTag);
-  __ SmiUntag(R0);
-  __ ldrb(R0, Address(R1, R0));
-  __ SmiTag(R0);
-  __ Ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
-  if (!TargetCPUFeatures::vfp_supported()) {
-    return;
-  }
-  Label fall_through;
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
-  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
-  __ tst(R0, Operand(kSmiTagMask));
-  __ b(&fall_through, NE);  // Index is not a smi, fall through.
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, TypedData::length_offset()));
-  __ cmp(R0, Operand(R6));
-  __ b(&fall_through, CS);
-
-
-  Address element_address =
-      __ ElementAddressForRegIndex(true,  // Load.
-                                   false,  // Not external.
-                                   kTypedDataFloat64ArrayCid,  // Cid.
-                                   8,  // Index scale.
-                                   R1,  // Array.
-                                   R0);  // Index.
-
-  __ vldrd(D0, element_address);
-
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 R0,  // Result register.
-                 R1);
-  __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
-  __ Ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
-  if (!TargetCPUFeatures::vfp_supported()) {
-    return;
-  }
-  Label fall_through;
-  __ ldr(R0, Address(SP, + 1 * kWordSize));  // Index.
-  __ ldr(R1, Address(SP, + 2 * kWordSize));  // Array.
-  __ tst(R0, Operand(kSmiTagMask));
-  __ b(&fall_through, NE);  // Index is not a smi, fall through.
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, TypedData::length_offset()));
-  __ cmp(R0, Operand(R6));
-  __ b(&fall_through, CS);
-
-  __ ldr(R2, Address(SP, + 0 * kWordSize));  // Value.
-  __ tst(R2, Operand(kSmiTagMask));
-  __ b(&fall_through, EQ);  // Value is Smi, fall through.
-
-  __ LoadClassId(R3, R2);
-  __ CompareImmediate(R3, kDoubleCid);
-  __ b(&fall_through, NE);  // Not a Double, fall through.
-
-  __ LoadDFromOffset(D0, R2, Double::value_offset() - kHeapObjectTag);
-
-  Address element_address =
-      __ ElementAddressForRegIndex(false,  // Store.
-                                   false,  // Not external.
-                                   kTypedDataFloat64ArrayCid,  // Cid.
-                                   8,  // Index scale.
-                                   R1,  // Array.
-                                   R0);  // Index.
-  __ vstrd(D0, element_address);
-  __ Ret();
-  __ Bind(&fall_through);
-}
-
-
 static int GetScaleFactor(intptr_t size) {
   switch (size) {
     case 1: return 0;
@@ -1049,13 +870,6 @@
 }
 
 
-void Intrinsifier::Bigint_getNeg(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, Bigint::neg_offset()));
-  __ Ret();
-}
-
-
 void Intrinsifier::Bigint_setNeg(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
@@ -1064,13 +878,6 @@
 }
 
 
-void Intrinsifier::Bigint_getUsed(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, Bigint::used_offset()));
-  __ Ret();
-}
-
-
 void Intrinsifier::Bigint_setUsed(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
@@ -1079,13 +886,6 @@
 }
 
 
-void Intrinsifier::Bigint_getDigits(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, Bigint::digits_offset()));
-  __ Ret();
-}
-
-
 void Intrinsifier::Bigint_setDigits(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
@@ -1417,13 +1217,6 @@
 }
 
 
-void Intrinsifier::StringBaseLength(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, String::length_offset()));
-  __ Ret();
-}
-
-
 void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
 
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index dd54962..66c78f9 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -21,44 +21,7 @@
 #define __ assembler->
 
 
-void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, Array::length_offset()));
-  __ ret();
-}
-
-
-void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
-  ObjectArrayLength(assembler);
-}
-
-
-void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
-  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array
-
-  __ tsti(R0, kSmiTagMask);
-  __ b(&fall_through, NE);  // Index is not an smi, fall through.
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, Array::length_offset()));
-  __ cmp(R0, Operand(R6));
-  __ b(&fall_through, CS);
-
-  ASSERT(kSmiTagShift == 1);
-  // array element at R1 + R0*4 + Array::data_offset - 1
-  __ add(R6, R1, Operand(R0, LSL, 2));
-  __ ldr(R0, FieldAddress(R6, Array::data_offset()));
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
-  ObjectArrayGetIndexed(assembler);
-}
+intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
 
 static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
@@ -174,21 +137,6 @@
 }
 
 
-void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, GrowableObjectArray::length_offset()));
-  __ ret();
-}
-
-
-void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, GrowableObjectArray::data_offset()));
-  __ ldr(R0, FieldAddress(R0, Array::length_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
@@ -316,130 +264,6 @@
 }
 
 
-// Gets the length of a TypedData.
-void Intrinsifier::TypedDataLength(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, TypedData::length_offset()));
-  __ ret();
-}
-
-
-void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
-  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
-  __ tsti(R0, kSmiTagMask);
-  __ b(&fall_through, NE);  // Index is not a smi, fall through.
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, TypedData::length_offset()));
-  __ cmp(R0, Operand(R6));
-  __ b(&fall_through, CS);
-
-  // Array element at R1 + R0 + TypedData::data_offset - 1.
-  // Untag R0.
-  __ add(R1, R1, Operand(R0, LSR, 1));
-  __ ldr(R0, FieldAddress(R1, TypedData::data_offset()), kUnsignedByte);
-  __ SmiTag(R0);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
-  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
-  __ tsti(R0, kSmiTagMask);
-  __ b(&fall_through, NE);  // Index is not a smi, fall through.
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, TypedData::length_offset()));
-  __ cmp(R0, Operand(R6));
-  __ b(&fall_through, CS);
-
-  __ ldr(R1, FieldAddress(R1, ExternalTypedData::data_offset()));
-
-  // Untag R0.
-  __ add(R1, R1, Operand(R0, LSR, 1));
-  __ ldr(R0, Address(R1, 0), kUnsignedByte);
-  __ SmiTag(R0);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
-  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
-  __ tsti(R0, kSmiTagMask);
-  __ b(&fall_through, NE);  // Index is not a smi, fall through.
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, TypedData::length_offset()));
-  __ cmp(R0, Operand(R6));
-  __ b(&fall_through, CS);
-
-  Address element_address =
-      __ ElementAddressForRegIndex(true,  // Load.
-                                   false,  // Not external.
-                                   kTypedDataFloat64ArrayCid,  // Cid.
-                                   8,  // Index scale.
-                                   R1,  // Array.
-                                   R0);  // Index.
-
-  __ fldrd(V0, element_address);
-
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 R0,  // Result register.
-                 R1,  // Temp register.
-                 kNoPP);
-  __ StoreDFieldToOffset(V0, R0, Double::value_offset(), kNoPP);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ ldr(R0, Address(SP, + 1 * kWordSize));  // Index.
-  __ ldr(R1, Address(SP, + 2 * kWordSize));  // Array.
-  __ tsti(R0, kSmiTagMask);
-  __ b(&fall_through, NE);  // Index is not a smi, fall through.
-
-  // Range check.
-  __ ldr(R6, FieldAddress(R1, TypedData::length_offset()));
-  __ cmp(R0, Operand(R6));
-  __ b(&fall_through, CS);
-
-  __ ldr(R2, Address(SP, + 0 * kWordSize));  // Value.
-  __ tsti(R2, kSmiTagMask);
-  __ b(&fall_through, EQ);  // Value is Smi, fall through.
-
-  __ LoadClassId(R3, R2, kNoPP);
-  __ CompareImmediate(R3, kDoubleCid, kNoPP);
-  __ b(&fall_through, NE);  // Not a Double, fall through.
-
-  __ LoadDFieldFromOffset(V0, R2, Double::value_offset(), kNoPP);
-
-  Address element_address =
-      __ ElementAddressForRegIndex(false,  // Store.
-                                   false,  // Not external.
-                                   kTypedDataFloat64ArrayCid,  // Cid.
-                                   8,  // Index scale.
-                                   R1,  // Array.
-                                   R0);  // Index.
-  __ fstrd(V0, element_address);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
 static int GetScaleFactor(intptr_t size) {
   switch (size) {
     case 1: return 0;
@@ -953,13 +777,6 @@
 }
 
 
-void Intrinsifier::Bigint_getNeg(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, Bigint::neg_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::Bigint_setNeg(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
@@ -968,13 +785,6 @@
 }
 
 
-void Intrinsifier::Bigint_getUsed(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, Bigint::used_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::Bigint_setUsed(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
@@ -983,13 +793,6 @@
 }
 
 
-void Intrinsifier::Bigint_getDigits(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, Bigint::digits_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::Bigint_setDigits(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
@@ -1301,13 +1104,6 @@
 }
 
 
-void Intrinsifier::StringBaseLength(Assembler* assembler) {
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ ldr(R0, FieldAddress(R0, String::length_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
 
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 0aa3a5e..9d78b41 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -29,39 +29,7 @@
 #define __ assembler->
 
 
-void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ movl(EAX, FieldAddress(EAX, Array::length_offset()));
-  __ ret();
-}
-
-
-void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
-  ObjectArrayLength(assembler);
-}
-
-
-void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Array.
-  __ testl(EBX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpl(EBX, FieldAddress(EAX, Array::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-  // Note that EBX is Smi, i.e, times 2.
-  ASSERT(kSmiTagShift == 1);
-  __ movl(EAX, FieldAddress(EAX, EBX, TIMES_2, Array::data_offset()));
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
-  ObjectArrayGetIndexed(assembler);
-}
+intptr_t Intrinsifier::ParameterSlotFromSp() { return 0; }
 
 
 static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
@@ -173,25 +141,6 @@
 }
 
 
-// Get length of growable object array.
-// On stack: growable array (+1), return-address (+0).
-void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ movl(EAX, FieldAddress(EAX, GrowableObjectArray::length_offset()));
-  __ ret();
-}
-
-
-// Get capacity of growable object array.
-// On stack: growable array (+1), return-address (+0).
-void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ movl(EAX, FieldAddress(EAX, GrowableObjectArray::data_offset()));
-  __ movl(EAX, FieldAddress(EAX, Array::length_offset()));
-  __ ret();
-}
-
-
 // Access growable object array at specified index.
 // On stack: growable array (+2), index (+1), return-address (+0).
 void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
@@ -405,121 +354,6 @@
   __ Bind(&fall_through);                                                      \
 
 
-
-// Gets the length of a TypedData.
-void Intrinsifier::TypedDataLength(Assembler* assembler) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ movl(EAX, FieldAddress(EAX, TypedData::length_offset()));
-  __ ret();
-}
-
-
-void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Array.
-  __ testl(EBX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpl(EBX, FieldAddress(EAX, TypedData::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-
-  __ SmiUntag(EBX);
-  __ movzxb(EAX, FieldAddress(EAX, EBX, TIMES_1, TypedData::data_offset()));
-  __ SmiTag(EAX);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Array.
-  __ testl(EBX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpl(EBX, FieldAddress(EAX, TypedData::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-
-  __ movl(EAX, FieldAddress(EAX, ExternalTypedData::data_offset()));
-  __ SmiUntag(EBX);
-  __ movzxb(EAX, Address(EAX, EBX, TIMES_1, 0));
-  __ SmiTag(EAX);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Array.
-  __ testl(EBX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpl(EBX, FieldAddress(EAX, TypedData::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-
-  Address element_address =
-      Assembler::ElementAddressForRegIndex(false,  // Not external
-                                           kTypedDataFloat64ArrayCid,  // Cid.
-                                           8,  // Index scale.
-                                           EAX,  // Array.
-                                           EBX);  // Index.
-
-  __ movsd(XMM0, element_address);
-
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kNearJump,
-                 EAX,  // Result register.
-                 EBX);
-  __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movl(EBX, Address(ESP, + 2 * kWordSize));  // Index.
-  __ movl(EAX, Address(ESP, + 3 * kWordSize));  // Array.
-  __ testl(EBX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpl(EBX, FieldAddress(EAX, TypedData::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-
-  __ movl(ECX, Address(ESP, + 1 * kWordSize));  // Value.
-  __ testl(ECX, Immediate(kSmiTagMask));
-  __ j(ZERO, &fall_through, Assembler::kNearJump);  // Value is Smi.
-  __ LoadClassId(EDI, ECX);
-
-  __ cmpl(EDI, Immediate(kDoubleCid));
-  __ j(NOT_EQUAL, &fall_through, Assembler::kNearJump);  // Not a Double.
-
-  __ movsd(XMM0, FieldAddress(ECX, Double::value_offset()));
-
-  Address element_address =
-      Assembler::ElementAddressForRegIndex(false,  // Not external
-                                           kTypedDataFloat64ArrayCid,  // Cid.
-                                           8,  // Index scale.
-                                           EAX,  // Array.
-                                           EBX);  // Index.
-
-  __ movsd(element_address, XMM0);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
 static ScaleFactor GetScaleFactor(intptr_t size) {
   switch (size) {
     case 1: return TIMES_1;
@@ -1053,13 +887,6 @@
 }
 
 
-void Intrinsifier::Bigint_getNeg(Assembler* assembler) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ movl(EAX, FieldAddress(EAX, Bigint::neg_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::Bigint_setNeg(Assembler* assembler) {
   __ movl(EAX, Address(ESP, + 1 * kWordSize));
   __ movl(ECX, Address(ESP, + 2 * kWordSize));
@@ -1068,13 +895,6 @@
 }
 
 
-void Intrinsifier::Bigint_getUsed(Assembler* assembler) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ movl(EAX, FieldAddress(EAX, Bigint::used_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::Bigint_setUsed(Assembler* assembler) {
   __ movl(EAX, Address(ESP, + 1 * kWordSize));
   __ movl(ECX, Address(ESP, + 2 * kWordSize));
@@ -1083,13 +903,6 @@
 }
 
 
-void Intrinsifier::Bigint_getDigits(Assembler* assembler) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
-  __ movl(EAX, FieldAddress(EAX, Bigint::digits_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::Bigint_setDigits(Assembler* assembler) {
   __ movl(EAX, Address(ESP, + 1 * kWordSize));
   __ movl(ECX, Address(ESP, + 2 * kWordSize));
@@ -1413,13 +1226,6 @@
 }
 
 
-void Intrinsifier::StringBaseLength(Assembler* assembler) {
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));  // String object.
-  __ movl(EAX, FieldAddress(EAX, String::length_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 6ce089d..5cfce60 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -20,44 +20,7 @@
 #define __ assembler->
 
 
-void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
-  __ lw(V0, Address(SP, 0 * kWordSize));
-  __ Ret();
-  __ delay_slot()->lw(V0, FieldAddress(V0, Array::length_offset()));
-}
-
-
-void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
-  ObjectArrayLength(assembler);
-}
-
-
-void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-
-  __ lw(T0, Address(SP, + 0 * kWordSize));  // Index
-
-  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &fall_through);  // Index is not an smi, fall through
-  __ delay_slot()->lw(T1, Address(SP, + 1 * kWordSize));  // Array
-
-  // Range check.
-  __ lw(T2, FieldAddress(T1, Array::length_offset()));
-  __ BranchUnsignedGreaterEqual(T0, T2, &fall_through);
-
-  ASSERT(kSmiTagShift == 1);
-  // array element at T1 + T0*2 + Array::data_offset - 1
-  __ sll(T2, T0, 1);
-  __ addu(T2, T1, T2);
-  __ Ret();
-  __ delay_slot()->lw(V0, FieldAddress(T2, Array::data_offset()));
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
-  ObjectArrayGetIndexed(assembler);
-}
+intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
 
 static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
@@ -169,22 +132,6 @@
 }
 
 
-void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
-  __ lw(V0, Address(SP, 0 * kWordSize));
-  __ Ret();
-  __ delay_slot()->lw(V0,
-      FieldAddress(V0, GrowableObjectArray::length_offset()));
-}
-
-
-void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
-  __ lw(V0, Address(SP, 0 * kWordSize));
-  __ lw(V0, FieldAddress(V0, GrowableObjectArray::data_offset()));
-  __ Ret();
-  __ delay_slot()->lw(V0, FieldAddress(V0, Array::length_offset()));
-}
-
-
 void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
@@ -398,131 +345,6 @@
   __ Bind(&fall_through);                                                      \
 
 
-// Gets the length of a TypedData.
-void Intrinsifier::TypedDataLength(Assembler* assembler) {
-  __ lw(T0, Address(SP, 0 * kWordSize));
-  __ Ret();
-  __ delay_slot()->lw(V0, FieldAddress(T0, TypedData::length_offset()));
-}
-
-
-void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-
-  __ lw(T0, Address(SP, + 0 * kWordSize));  // Index.
-
-  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &fall_through);  // Index is not an smi, fall through.
-  __ delay_slot()->lw(T1, Address(SP, + 1 * kWordSize));  // Array.
-
-  // Range check.
-  __ lw(T2, FieldAddress(T1, TypedData::length_offset()));
-  __ BranchUnsignedGreaterEqual(T0, T2, &fall_through);
-
-  __ SmiUntag(T0);
-  __ addu(T1, T1, T0);
-  __ lbu(V0, FieldAddress(T1, TypedData::data_offset()));
-  __ Ret();
-  __ delay_slot()->SmiTag(V0);
-
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-
-  __ lw(T0, Address(SP, + 0 * kWordSize));  // Index.
-
-  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &fall_through);  // Index is not an smi, fall through.
-  __ delay_slot()->lw(T1, Address(SP, + 1 * kWordSize));  // Array.
-
-  // Range check.
-  __ lw(T2, FieldAddress(T1, TypedData::length_offset()));
-  __ BranchUnsignedGreaterEqual(T0, T2, &fall_through);
-
-  __ lw(T1, FieldAddress(T1, ExternalTypedData::data_offset()));
-  __ SmiUntag(T0);
-  __ addu(T1, T1, T0);
-  __ lbu(V0, Address(T1, 0));
-  __ Ret();
-  __ delay_slot()->SmiTag(V0);
-
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-
-  __ lw(T0, Address(SP, + 0 * kWordSize));  // Index.
-
-  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &fall_through);  // Index is not an smi, fall through.
-  __ delay_slot()->lw(T1, Address(SP, + 1 * kWordSize));  // Array.
-
-  // Range check.
-  __ lw(T2, FieldAddress(T1, TypedData::length_offset()));
-  __ BranchUnsignedGreaterEqual(T0, T2, &fall_through);
-
-  Address element_address =
-      __ ElementAddressForRegIndex(true,  // Load.
-                                   false,  // Not external.
-                                   kTypedDataFloat64ArrayCid,  // Cid.
-                                   8,  // Index scale.
-                                   T1,  // Array.
-                                   T0);  // Index.
-
-  __ LoadDFromOffset(D0, element_address.base(), element_address.offset());
-
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 V0,  // Result register.
-                 T1);
-  __ StoreDToOffset(D0, V0, Double::value_offset() - kHeapObjectTag);
-  __ Ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
-  Label fall_through;
-
-  __ lw(T0, Address(SP, + 1 * kWordSize));  // Index.
-
-  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &fall_through);  // Index is not an smi, fall through.
-  __ delay_slot()->lw(T1, Address(SP, + 2 * kWordSize));  // Array.
-
-  // Range check.
-  __ lw(T2, FieldAddress(T1, TypedData::length_offset()));
-  __ BranchUnsignedGreaterEqual(T0, T2, &fall_through);
-
-  __ lw(T2, Address(SP, + 0 * kWordSize));  // Value.
-  __ andi(CMPRES1, T2, Immediate(kSmiTagMask));
-  __ beq(CMPRES1, ZR, &fall_through);  // Value is a Smi. Fall through.
-
-  __ LoadClassId(T3, T2);
-  __ BranchNotEqual(T3, kDoubleCid, &fall_through);  // Not a Double.
-
-  __ LoadDFromOffset(D0, T2, Double::value_offset() - kHeapObjectTag);
-
-  Address element_address =
-      __ ElementAddressForRegIndex(false,  // Store.
-                                   false,  // Not external.
-                                   kTypedDataFloat64ArrayCid,  // Cid.
-                                   8,  // Index scale.
-                                   T1,  // Array.
-                                   T0);  // Index.
-  __ StoreDToOffset(D0, element_address.base(), element_address.offset());
-  __ Ret();
-  __ Bind(&fall_through);
-}
-
-
 static int GetScaleFactor(intptr_t size) {
   switch (size) {
     case 1: return 0;
@@ -1049,13 +871,6 @@
 }
 
 
-void Intrinsifier::Bigint_getNeg(Assembler* assembler) {
-  __ lw(V0, Address(SP, 0 * kWordSize));
-  __ Ret();
-  __ delay_slot()->lw(V0, FieldAddress(V0, Bigint::neg_offset()));
-}
-
-
 void Intrinsifier::Bigint_setNeg(Assembler* assembler) {
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ lw(T1, Address(SP, 1 * kWordSize));
@@ -1064,13 +879,6 @@
 }
 
 
-void Intrinsifier::Bigint_getUsed(Assembler* assembler) {
-  __ lw(V0, Address(SP, 0 * kWordSize));
-  __ Ret();
-  __ delay_slot()->lw(V0, FieldAddress(V0, Bigint::used_offset()));
-}
-
-
 void Intrinsifier::Bigint_setUsed(Assembler* assembler) {
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ lw(T1, Address(SP, 1 * kWordSize));
@@ -1079,13 +887,6 @@
 }
 
 
-void Intrinsifier::Bigint_getDigits(Assembler* assembler) {
-  __ lw(V0, Address(SP, 0 * kWordSize));
-  __ Ret();
-  __ delay_slot()->lw(V0, FieldAddress(V0, Bigint::digits_offset()));
-}
-
-
 void Intrinsifier::Bigint_setDigits(Assembler* assembler) {
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ lw(T1, Address(SP, 1 * kWordSize));
@@ -1450,13 +1251,6 @@
 }
 
 
-void Intrinsifier::StringBaseLength(Assembler* assembler) {
-  __ lw(T0, Address(SP, 0 * kWordSize));
-  __ Ret();
-  __ delay_slot()->lw(V0, FieldAddress(T0, String::length_offset()));
-}
-
-
 void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
 
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 20e3de0..41daa4d 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -27,39 +27,7 @@
 #define __ assembler->
 
 
-void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
-  __ movq(RAX, FieldAddress(RAX, Array::length_offset()));
-  __ ret();
-}
-
-
-void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
-  ObjectArrayLength(assembler);
-}
-
-
-void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Array.
-  __ testq(RCX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpq(RCX, FieldAddress(RAX, Array::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-  // Note that RBX is Smi, i.e, times 2.
-  ASSERT(kSmiTagShift == 1);
-  __ movq(RAX, FieldAddress(RAX, RCX, TIMES_4, Array::data_offset()));
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
-  ObjectArrayGetIndexed(assembler);
-}
+intptr_t Intrinsifier::ParameterSlotFromSp() { return 0; }
 
 
 void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
@@ -128,23 +96,6 @@
 }
 
 
-// Get length of growable object array.
-// On stack: growable array (+1), return-address (+0).
-void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
-  __ movq(RAX, FieldAddress(RAX, GrowableObjectArray::length_offset()));
-  __ ret();
-}
-
-
-void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
-  __ movq(RAX, FieldAddress(RAX, GrowableObjectArray::data_offset()));
-  __ movq(RAX, FieldAddress(RAX, Array::length_offset()));
-  __ ret();
-}
-
-
 // Access growable object array at specified index.
 // On stack: growable array (+2), index (+1), return-address (+0).
 void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
@@ -358,120 +309,6 @@
   __ Bind(&fall_through);                                                      \
 
 
-// Gets the length of a TypedData.
-void Intrinsifier::TypedDataLength(Assembler* assembler) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
-  __ movq(RAX, FieldAddress(RAX, TypedData::length_offset()));
-  __ ret();
-}
-
-
-void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Array.
-  __ testq(RCX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpq(RCX, FieldAddress(RAX, TypedData::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-
-  __ SmiUntag(RCX);
-  __ movzxb(RAX, FieldAddress(RAX, RCX, TIMES_1, TypedData::data_offset()));
-  __ SmiTag(RAX);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Array.
-  __ testq(RCX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpq(RCX, FieldAddress(RAX, TypedData::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-
-  __ movq(RAX, FieldAddress(RAX, ExternalTypedData::data_offset()));
-  __ SmiUntag(RCX);
-  __ movzxb(RAX, Address(RAX, RCX, TIMES_1, 0));
-  __ SmiTag(RAX);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Array.
-  __ testq(RCX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpq(RCX, FieldAddress(RAX, TypedData::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-
-  Address element_address =
-      Assembler::ElementAddressForRegIndex(false,  // Not external.
-                                           kTypedDataFloat64ArrayCid,
-                                           8,  // Index scale.
-                                           RAX,  // Array.
-                                           RCX);  // Index.
-
-  __ movsd(XMM0, element_address);
-
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class,
-                 &fall_through,
-                 Assembler::kNearJump,
-                 RAX,  // Result register.
-                 kNoRegister);
-  __ movsd(FieldAddress(RAX, Double::value_offset()), XMM0);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
-  Label fall_through;
-  __ movq(RCX, Address(RSP, + 2 * kWordSize));  // Index.
-  __ movq(RAX, Address(RSP, + 3 * kWordSize));  // Array.
-  __ testq(RCX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
-  // Range check.
-  __ cmpq(RCX, FieldAddress(RAX, TypedData::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
-
-  __ movq(RDX, Address(RSP, + 1 * kWordSize));  // Value
-  __ testq(RDX, Immediate(kSmiTagMask));
-  __ j(ZERO, &fall_through, Assembler::kNearJump);  // Value is Smi.
-
-  __ LoadClassId(RDI, RDX);
-  __ cmpq(RDI, Immediate(kTypedDataFloat64ArrayCid));
-  __ j(NOT_EQUAL, &fall_through, Assembler::kNearJump);
-
-  __ movsd(XMM0, FieldAddress(RDX, Double::value_offset()));
-
-  Address element_address =
-      Assembler::ElementAddressForRegIndex(false,  // Not external.
-                                           kTypedDataFloat64ArrayCid,
-                                           8,  // Index scale.
-                                           RAX,  // Array.
-                                           RCX);  // Index.
-
-  __ movsd(element_address, XMM0);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
 static ScaleFactor GetScaleFactor(intptr_t size) {
   switch (size) {
     case 1: return TIMES_1;
@@ -960,13 +797,6 @@
 }
 
 
-void Intrinsifier::Bigint_getNeg(Assembler* assembler) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
-  __ movq(RAX, FieldAddress(RAX, Bigint::neg_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::Bigint_setNeg(Assembler* assembler) {
   __ movq(RAX, Address(RSP, + 1 * kWordSize));
   __ movq(RCX, Address(RSP, + 2 * kWordSize));
@@ -975,13 +805,6 @@
 }
 
 
-void Intrinsifier::Bigint_getUsed(Assembler* assembler) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
-  __ movq(RAX, FieldAddress(RAX, Bigint::used_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::Bigint_setUsed(Assembler* assembler) {
   __ movq(RAX, Address(RSP, + 1 * kWordSize));
   __ movq(RCX, Address(RSP, + 2 * kWordSize));
@@ -990,13 +813,6 @@
 }
 
 
-void Intrinsifier::Bigint_getDigits(Assembler* assembler) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
-  __ movq(RAX, FieldAddress(RAX, Bigint::digits_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::Bigint_setDigits(Assembler* assembler) {
   __ movq(RAX, Address(RSP, + 1 * kWordSize));
   __ movq(RCX, Address(RSP, + 2 * kWordSize));
@@ -1315,13 +1131,6 @@
 }
 
 
-void Intrinsifier::StringBaseLength(Assembler* assembler) {
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));  // String object.
-  __ movq(RAX, FieldAddress(RAX, String::length_offset()));
-  __ ret();
-}
-
-
 void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index b77b01f..d87ca01 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -217,11 +217,12 @@
 }
 
 
-void JSONStream::PrintValue(const char* s, intptr_t len) {
+bool JSONStream::PrintValueStr(const String& s, intptr_t limit) {
   PrintCommaIfNeeded();
   buffer_.AddChar('"');
-  AddEscapedUTF8String(s, len);
+  bool did_truncate = AddDartString(s, limit);
   buffer_.AddChar('"');
+  return did_truncate;
 }
 
 
@@ -310,9 +311,11 @@
 }
 
 
-void JSONStream::PrintProperty(const char* name, const char* s, intptr_t len) {
+bool JSONStream::PrintPropertyStr(const char* name,
+                                  const String& s,
+                                  intptr_t limit) {
   PrintPropertyName(name);
-  PrintValue(s, len);
+  return PrintValueStr(s, limit);
 }
 
 
@@ -441,7 +444,7 @@
     int32_t ch = 0;
     int32_t ch_len = Utf8::Decode(&s8[i], len - i, &ch);
     ASSERT(ch_len != 0);
-    buffer_.AddEscapedChar(ch);
+    buffer_.EscapeAndAddCodeUnit(ch);
     // Move i forward.
     i += ch_len;
   }
@@ -449,6 +452,26 @@
 }
 
 
+bool JSONStream::AddDartString(const String& s, intptr_t limit) {
+  bool did_truncate = false;
+  intptr_t length = s.Length();
+  if (limit == -1) {
+    limit = length;
+  }
+  if (length <= limit) {
+    limit = length;
+  } else {
+    did_truncate = true;
+  }
+
+  for (intptr_t i = 0; i < limit; i++) {
+    intptr_t code_unit = s.CharAt(i);
+    buffer_.EscapeAndAddCodeUnit(code_unit);
+  }
+  return did_truncate;
+}
+
+
 JSONObject::JSONObject(const JSONArray* arr) : stream_(arr->stream_) {
   stream_->OpenObject();
 }
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 1e84368..8b4fc1e 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -93,13 +93,14 @@
   void PrintValue(const DebuggerEvent* event);
   void PrintValue(Metric* metric);
   void PrintValue(Isolate* isolate, bool ref = true);
+  bool PrintValueStr(const String& s, intptr_t limit);
 
   void PrintPropertyBool(const char* name, bool b);
   void PrintProperty(const char* name, intptr_t i);
   void PrintProperty64(const char* name, int64_t i);
   void PrintProperty(const char* name, double d);
   void PrintProperty(const char* name, const char* s);
-  void PrintProperty(const char* name, const char* s, intptr_t len);
+  bool PrintPropertyStr(const char* name, const String& s, intptr_t limit);
   void PrintPropertyNoEscape(const char* name, const char* s);
   void PrintfProperty(const char* name, const char* format, ...)
   PRINTF_ATTRIBUTE(3, 4);
@@ -113,6 +114,7 @@
   void PrintCommaIfNeeded();
   bool NeedComma();
 
+  bool AddDartString(const String& s, intptr_t limit);
   void AddEscapedUTF8String(const char* s);
   void AddEscapedUTF8String(const char* s, intptr_t len);
 
@@ -163,8 +165,10 @@
   void AddProperty(const char* name, const char* s) const {
     stream_->PrintProperty(name, s);
   }
-  void AddProperty(const char* name, const char* s, intptr_t len) const {
-    stream_->PrintProperty(name, s, len);
+  bool AddPropertyStr(const char* name,
+                      const String& s,
+                      intptr_t limit = -1) const {
+    return stream_->PrintPropertyStr(name, s, limit);
   }
   void AddPropertyNoEscape(const char* name, const char* s) const {
     stream_->PrintPropertyNoEscape(name, s);
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index 43e0dbc..2c2b4e2 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -6,6 +6,7 @@
 #include "platform/json.h"
 #include "vm/json_stream.h"
 #include "vm/unit_test.h"
+#include "vm/dart_api_impl.h"
 
 namespace dart {
 
@@ -315,6 +316,80 @@
 }
 
 
+TEST_CASE(JSON_JSONStream_DartString) {
+  const char* kScriptChars =
+      "var ascii = 'Hello, World!';\n"
+      "var unicode = '\\u00CE\\u00F1\\u0163\\u00E9r\\u00F1\\u00E5\\u0163"
+      "\\u00EE\\u00F6\\u00F1\\u00E5\\u013C\\u00EE\\u017E\\u00E5\\u0163"
+      "\\u00EE\\u1EDD\\u00F1';\n"
+      "var surrogates = '\\u{1D11E}\\u{1D11E}\\u{1D11E}\\u{1D11E}"
+      "\\u{1D11E}';\n"
+      "var nullInMiddle = 'This has\\u0000 four words.';";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(lib);
+
+  Dart_Handle result;
+  String& obj = String::Handle();
+
+  {
+    result = Dart_GetField(lib, NewString("ascii"));
+    EXPECT_VALID(result);
+    obj ^= Api::UnwrapHandle(result);
+
+    JSONStream js;
+    {
+      JSONObject jsobj(&js);
+      jsobj.AddPropertyStr("ascci", obj);;
+    }
+    EXPECT_STREQ("{\"ascci\":\"Hello, World!\"}", js.ToCString());
+  }
+
+  {
+    result = Dart_GetField(lib, NewString("unicode"));
+    EXPECT_VALID(result);
+    obj ^= Api::UnwrapHandle(result);
+
+    JSONStream js;
+    {
+      JSONObject jsobj(&js);
+      jsobj.AddPropertyStr("unicode", obj);
+    }
+    EXPECT_STREQ("{\"unicode\":\"\\u00CE\\u00F1\\u0163\\u00E9r\\u00F1\\u00E5"
+                 "\\u0163\\u00EE\\u00F6\\u00F1\\u00E5\\u013C\\u00EE\\u017E"
+                 "\\u00E5\\u0163\\u00EE\\u1EDD\\u00F1\"}", js.ToCString());
+  }
+
+  {
+    result = Dart_GetField(lib, NewString("surrogates"));
+    EXPECT_VALID(result);
+    obj ^= Api::UnwrapHandle(result);
+
+    JSONStream js;
+    {
+      JSONObject jsobj(&js);
+      jsobj.AddPropertyStr("surrogates", obj);
+    }
+    EXPECT_STREQ("{\"surrogates\":\"\\uD834\\uDD1E\\uD834\\uDD1E\\uD834\\uDD1E"
+                 "\\uD834\\uDD1E\\uD834\\uDD1E\"}", js.ToCString());
+  }
+
+  {
+    result = Dart_GetField(lib, NewString("nullInMiddle"));
+    EXPECT_VALID(result);
+    obj ^= Api::UnwrapHandle(result);
+
+    JSONStream js;
+    {
+      JSONObject jsobj(&js);
+      jsobj.AddPropertyStr("nullInMiddle", obj);
+    }
+    EXPECT_STREQ("{\"nullInMiddle\":\"This has\\u0000 four words.\"}",
+                 js.ToCString());
+  }
+}
+
+
 TEST_CASE(JSON_JSONStream_Options) {
   const char* arguments[] = {"a", "b", "c"};
   const char* option_keys[] = {"dog", "cat"};
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index e2a061d..1169a5c 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -122,10 +122,8 @@
   V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464)                    \
   V(_Int8Array, [], Int8ArrayGetIndexed, 321230586)                            \
   V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685)                          \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
   V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063)            \
   V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340)           \
-  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 918478513)         \
   V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
     1346536303)                                                                \
   V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
@@ -144,17 +142,17 @@
   V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 1021474038)                    \
   V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 288114492)                  \
   V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 941746736)                 \
+  V(_Bigint, get:_neg, Bigint_getNeg, 1151514099)                              \
+  V(_Bigint, get:_used, Bigint_getUsed, 1308529543)                            \
+  V(_Bigint, get:_digits, Bigint_getDigits, 1408062672)                        \
 
 // List of intrinsics:
 // (class-name, function-name, intrinsification method, fingerprint).
 #define CORE_LIB_INTRINSIC_LIST(V)                                             \
   V(_Smi, ~, Smi_bitNegate, 105519892)                                         \
   V(_Smi, get:bitLength, Smi_bitLength, 869956497)                             \
-  V(_Bigint, get:_neg, Bigint_getNeg, 1151514099)                              \
   V(_Bigint, set:_neg, Bigint_setNeg, 920204960)                               \
-  V(_Bigint, get:_used, Bigint_getUsed, 1308529543)                            \
   V(_Bigint, set:_used, Bigint_setUsed, 1857576743)                            \
-  V(_Bigint, get:_digits, Bigint_getDigits, 1408062672)                        \
   V(_Bigint, set:_digits, Bigint_setDigits, 1633805112)                        \
   V(_Double, >, Double_greaterThan, 381325711)                                 \
   V(_Double, >=, Double_greaterEqualThan, 1409267140)                          \
@@ -169,23 +167,16 @@
   V(_Double, get:isNegative, Double_getIsNegative, 1637875580)                 \
   V(_Double, _mulFromInteger, Double_mulFromInteger, 1594796483)               \
   V(_Double, .fromInteger, DoubleFromInteger, 999771940)                       \
-  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
-  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
   V(_List, []=, ObjectArraySetIndexed, 1288827575)                             \
   V(_GrowableList, .withData, GrowableArray_Allocate, 732923072)               \
-  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
-  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 555140075)            \
   V(_GrowableList, [], GrowableArrayGetIndexed, 919108233)                     \
   V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853)                   \
   V(_GrowableList, _setLength, GrowableArraySetLength, 89389299)               \
   V(_GrowableList, _setData, GrowableArraySetData, 2126927509)                 \
   V(_GrowableList, add, GrowableArray_add, 1899133961)                         \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
   V(Object, ==, ObjectEquals, 1068471689)                                      \
   V(_StringBase, get:hashCode, String_getHashCode, 2102906241)                 \
   V(_StringBase, get:isEmpty, StringBaseIsEmpty, 49873871)                     \
-  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
   V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324)                  \
   V(_StringBase, [], StringBaseCharAt, 1512210677)                             \
   V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1111837929)       \
@@ -241,7 +232,6 @@
 
 
 #define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
-  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
   V(_Int8Array, _new, TypedData_Int8Array_new, 1150131819)                     \
   V(_Uint8Array, _new, TypedData_Uint8Array_new, 2019665760)                   \
   V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 726412668)      \
@@ -270,27 +260,48 @@
   V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 1217848993)          \
   V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 100825417)               \
   V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 611308575)           \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
-  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1678777951)         \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
 
+#define GRAPH_TYPED_DATA_INTRINSICS_LIST(V) \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
+  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1678777951)         \
+  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 918478513)         \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
+  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
+
+#define GRAPH_CORE_INTRINSICS_LIST(V)                                          \
+  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
+  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
+  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
+  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 555140075)            \
+  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
+
+#define GRAPH_INTRINSICS_LIST(V)                                               \
+  GRAPH_CORE_INTRINSICS_LIST(V)                                                \
+  GRAPH_TYPED_DATA_INTRINSICS_LIST(V)                                          \
 
 #define PROFILER_LIB_INTRINSIC_LIST(V)                                         \
   V(_UserTag, makeCurrent, UserTag_makeCurrent, 370414636)                     \
   V(::, _getDefaultTag, UserTag_defaultTag, 1159885970)                        \
   V(::, _getCurrentTag, Profiler_getCurrentTag, 1182126114)                    \
 
-#define ALL_INTRINSICS_LIST(V)                                                 \
+#define ALL_INTRINSICS_NO_INTEGER_LIB_LIST(V)                                  \
   CORE_LIB_INTRINSIC_LIST(V)                                                   \
-  CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                           \
   MATH_LIB_INTRINSIC_LIST(V)                                                   \
   TYPED_DATA_LIB_INTRINSIC_LIST(V)                                             \
   PROFILER_LIB_INTRINSIC_LIST(V)
 
+#define ALL_INTRINSICS_LIST(V)                                                 \
+  ALL_INTRINSICS_NO_INTEGER_LIB_LIST(V)                                        \
+  CORE_INTEGER_LIB_INTRINSIC_LIST(V)
+
 #define RECOGNIZED_LIST(V)                                                     \
   OTHER_RECOGNIZED_LIST(V)                                                     \
-  ALL_INTRINSICS_LIST(V)
+  ALL_INTRINSICS_LIST(V)                                                       \
+  GRAPH_INTRINSICS_LIST(V)
 
 // A list of core function that should always be inlined.
 #define INLINE_WHITE_LIST(V)                                                   \
@@ -349,7 +360,10 @@
   V(::, sin, MathSin, 1741396147)                                              \
   V(::, sqrt, MathSqrt, 101545548)                                             \
   V(::, tan, MathTan, 982072809)                                               \
-  V(Lists, copy, ListsCopy, 902244797)
+  V(Lists, copy, ListsCopy, 902244797)                                         \
+  V(_Bigint, get:_neg, Bigint_getNeg, 1151514099)                              \
+  V(_Bigint, get:_used, Bigint_getUsed, 1308529543)                            \
+  V(_Bigint, get:_digits, Bigint_getDigits, 1408062672)                        \
 
 
 // A list of core functions that internally dispatch based on received id.
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index b1438cf..f677aa3 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -98,6 +98,7 @@
 Array* Object::empty_array_ = NULL;
 Array* Object::zero_array_ = NULL;
 PcDescriptors* Object::empty_descriptors_ = NULL;
+LocalVarDescriptors* Object::empty_var_descriptors_ = NULL;
 Instance* Object::sentinel_ = NULL;
 Instance* Object::transition_sentinel_ = NULL;
 Instance* Object::unknown_constant_ = NULL;
@@ -435,6 +436,7 @@
   empty_array_ = Array::ReadOnlyHandle();
   zero_array_ = Array::ReadOnlyHandle();
   empty_descriptors_ = PcDescriptors::ReadOnlyHandle();
+  empty_var_descriptors_ = LocalVarDescriptors::ReadOnlyHandle();
   sentinel_ = Instance::ReadOnlyHandle();
   transition_sentinel_ = Instance::ReadOnlyHandle();
   unknown_constant_ =  Instance::ReadOnlyHandle();
@@ -665,6 +667,18 @@
     empty_descriptors_->raw_ptr()->length_ = 0;
   }
 
+  // Allocate and initialize the canonical empty variable descriptor object.
+  {
+    uword address =
+        heap->Allocate(LocalVarDescriptors::InstanceSize(0), Heap::kOld);
+    InitializeObject(address,
+                     kLocalVarDescriptorsCid,
+                     LocalVarDescriptors::InstanceSize(0));
+    LocalVarDescriptors::initializeHandle(
+        empty_var_descriptors_,
+        reinterpret_cast<RawLocalVarDescriptors*>(address + kHeapObjectTag));
+    empty_var_descriptors_->raw_ptr()->num_entries_ = 0;
+  }
 
   cls = Class::New<Instance>(kDynamicCid);
   cls.set_is_abstract();
@@ -3617,6 +3631,15 @@
 }
 
 
+void Class::DisableAllocationStub() const {
+  const Code& alloc_stub = Code::Handle(allocation_stub());
+  if (!alloc_stub.IsNull()) {
+    CodePatcher::PatchEntry(alloc_stub);
+    StorePointer(&raw_ptr()->allocation_stub_, Code::null());
+  }
+}
+
+
 bool Class::IsFunctionClass() const {
   return raw() == Type::Handle(Type::Function()).type_class();
 }
@@ -7982,6 +8005,9 @@
   if (ref) {
     return;
   }
+  Class& cls = Class::Handle(this->clazz());
+  jsobj.AddProperty("class", cls);
+  jsobj.AddProperty("size", raw()->Size());
   const String& private_key = String::Handle(PrivateKey());
   jsobj.AddProperty("privateKey", private_key);
   // TODO(johnmccutchan): Add support for printing LiteralTokens and add
@@ -8525,14 +8551,14 @@
   intptr_t lib_index = (lib.IsNull()) ? -1 : lib.index();
   jsobj.AddPropertyF("id", "libraries/%" Pd "/scripts/%s",
       lib_index, encoded_url.ToCString());
-  jsobj.AddProperty("name", name.ToCString());
+  jsobj.AddPropertyStr("name", name);
   jsobj.AddProperty("kind", GetKindAsCString());
   if (ref) {
     return;
   }
   jsobj.AddProperty("owningLibrary", lib);
   const String& source = String::Handle(Source());
-  jsobj.AddProperty("source", source.ToCString());
+  jsobj.AddPropertyStr("source", source);
 
   // Print the line number table
   {
@@ -9812,8 +9838,8 @@
   AddTypeProperties(&jsobj, "Library", JSONType(), ref);
   jsobj.AddPropertyF("id", "libraries/%" Pd "", id);
   jsobj.AddProperty("name", library_name);
-  const char* library_url = String::Handle(url()).ToCString();
-  jsobj.AddProperty("url", library_url);
+  const String& library_url = String::Handle(url());
+  jsobj.AddPropertyStr("url", library_url);
   if (ref) {
     return;
   }
@@ -10605,6 +10631,9 @@
   if (ref) {
     return;
   }
+  Class& cls = Class::Handle(this->clazz());
+  jsobj->AddProperty("class", cls);
+  jsobj->AddProperty("size", raw()->Size());
   JSONArray members(jsobj, "members");
   Iterator iter(*this, RawPcDescriptors::kAnyKind);
   while (iter.MoveNext()) {
@@ -10769,11 +10798,8 @@
 
 RawString* LocalVarDescriptors::GetName(intptr_t var_index) const {
   ASSERT(var_index < Length());
-  const Array& names = Array::Handle(raw_ptr()->names_);
-  ASSERT(Length() == names.Length());
-  String& name = String::Handle();
-  name ^= names.At(var_index);
-  return name.raw();
+  ASSERT(Object::Handle(*raw()->nameAddrAt(var_index)).IsString());
+  return *raw()->nameAddrAt(var_index);
 }
 
 
@@ -10781,17 +10807,16 @@
                                  const String& name,
                                  RawLocalVarDescriptors::VarInfo* info) const {
   ASSERT(var_index < Length());
-  const Array& names = Array::Handle(raw_ptr()->names_);
-  ASSERT(Length() == names.Length());
-  names.SetAt(var_index, name);
-  raw_ptr()->data()[var_index] = *info;
+  ASSERT(!name.IsNull());
+  StorePointer(raw()->nameAddrAt(var_index), name.raw());
+  raw()->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()->data()[var_index];
 }
 
 
@@ -10870,9 +10895,6 @@
   for (intptr_t i = 0; i < Length(); i++) {
     RawLocalVarDescriptors::VarInfo info;
     var_name = GetName(i);
-    if (var_name.IsNull()) {
-      var_name = Symbols::Empty().raw();
-    }
     GetInfo(i, &info);
     len += PrintVarInfo(NULL, 0, i, var_name, info);
   }
@@ -10882,9 +10904,6 @@
   for (intptr_t i = 0; i < Length(); i++) {
     RawLocalVarDescriptors::VarInfo info;
     var_name = GetName(i);
-    if (var_name.IsNull()) {
-      var_name = Symbols::Empty().raw();
-    }
     GetInfo(i, &info);
     num_chars += PrintVarInfo((buffer + num_chars),
                               (len - num_chars),
@@ -10906,14 +10925,14 @@
   if (ref) {
     return;
   }
+  Class& cls = Class::Handle(this->clazz());
+  jsobj.AddProperty("class", cls);
+  jsobj.AddProperty("size", raw()->Size());
   JSONArray members(&jsobj, "members");
   String& var_name = String::Handle();
   for (intptr_t i = 0; i < Length(); i++) {
     RawLocalVarDescriptors::VarInfo info;
     var_name = GetName(i);
-    if (var_name.IsNull()) {
-      var_name = Symbols::Empty().raw();
-    }
     GetInfo(i, &info);
     JSONObject var(&members);
     var.AddProperty("name", var_name.ToCString());
@@ -10960,17 +10979,14 @@
                                       Heap::kOld);
     NoGCScope no_gc;
     result ^= raw;
-    result.raw_ptr()->length_ = num_variables;
+    result.raw_ptr()->num_entries_ = num_variables;
   }
-  const Array& names = (num_variables == 0) ? Object::empty_array() :
-      Array::Handle(Array::New(num_variables, Heap::kOld));
-  result.raw_ptr()->names_ = names.raw();
   return result.raw();
 }
 
 
 intptr_t LocalVarDescriptors::Length() const {
-  return raw_ptr()->length_;
+  return raw_ptr()->num_entries_;
 }
 
 
@@ -16498,7 +16514,7 @@
   const int64_t kLog10Dividend = 33219281;
   const int64_t kLog10Divisor = 10000000;
   result.EnsureLength((kLog10Dividend * str_length) /
-                      (kLog10Divisor * kBitsPerDigit), space);
+                      (kLog10Divisor * kBitsPerDigit) + 1, space);
 
   // Read first digit separately. This avoids a multiplication and addition.
   // The first digit might also not have kDecDigitsPerIteration decimal digits.
@@ -16819,8 +16835,7 @@
   intptr_t pos = 0;
   const intptr_t kDivisor = 100000000;
   const intptr_t kDigits = 8;
-  // TODO(regis): Fix Windows error reported for ambiguous call to 'pow'.
-  // ASSERT(pow(10.0, kDigits) == kDivisor);
+  ASSERT(pow(10.0, 1.0 * kDigits) == kDivisor);
   ASSERT(kDivisor < kDigitBase);
   ASSERT(Smi::IsValid(kDivisor));
   // Allocate a copy of the digits.
@@ -17040,7 +17055,7 @@
 }
 
 
-int32_t String::CharAt(intptr_t index) const {
+uint16_t String::CharAt(intptr_t index) const {
   intptr_t class_id = raw()->GetClassId();
   ASSERT(RawObject::IsStringClassId(class_id));
   NoGCScope no_gc;
@@ -17197,12 +17212,12 @@
   const intptr_t other_len = other.IsNull() ? 0 : other.Length();
   const intptr_t len = (this_len < other_len) ? this_len : other_len;
   for (intptr_t i = 0; i < len; i++) {
-    int32_t this_code_point = this->CharAt(i);
-    int32_t other_code_point = other.CharAt(i);
-    if (this_code_point < other_code_point) {
+    uint16_t this_code_unit = this->CharAt(i);
+    uint16_t other_code_unit = other.CharAt(i);
+    if (this_code_unit < other_code_unit) {
       return -1;
     }
-    if (this_code_point > other_code_point) {
+    if (this_code_unit > other_code_unit) {
       return 1;
     }
   }
@@ -17727,17 +17742,10 @@
 
 
 const char* String::ToCString() const {
-  intptr_t length;
-  return ToCString(&length);
-}
-
-
-const char* String::ToCString(intptr_t* length) const {
   if (IsOneByteString()) {
     // Quick conversion if OneByteString contains only ASCII characters.
     intptr_t len = Length();
     if (len == 0) {
-      *length = 0;
       return "";
     }
     Zone* zone = Isolate::Current()->current_zone();
@@ -17754,7 +17762,6 @@
     }
     if (len > 0) {
       result[len] = 0;
-      *length = len;
       return reinterpret_cast<const char*>(result);
     }
   }
@@ -17763,33 +17770,10 @@
   uint8_t* result = zone->Alloc<uint8_t>(len + 1);
   ToUTF8(result, len);
   result[len] = 0;
-  *length = len;
   return reinterpret_cast<const char*>(result);
 }
 
 
-const char* String::ToCStringTruncated(intptr_t max_len,
-                                       bool* did_truncate,
-                                       intptr_t* length) const {
-  if (Length() <= max_len) {
-    *did_truncate = false;
-    return ToCString(length);
-  }
-
-  intptr_t aligned_limit = max_len;
-  if (Utf16::IsLeadSurrogate(CharAt(max_len - 1))) {
-    // Don't let truncation split a surrogate pair.
-    aligned_limit--;
-  }
-  ASSERT(!Utf16::IsLeadSurrogate(CharAt(aligned_limit - 1)));
-
-  *did_truncate = true;
-  const String& truncated =
-      String::Handle(String::SubString(*this, 0, aligned_limit));
-  return truncated.ToCString(length);
-}
-
-
 void String::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   if (raw() == Symbols::OptimizedOut().raw()) {
@@ -17807,17 +17791,13 @@
   const intptr_t id = ring->GetIdForObject(raw());
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   if (ref) {
-    bool did_truncate = false;
-    intptr_t length = 0;
-    const char* cstr = ToCStringTruncated(128, &did_truncate, &length);
-    jsobj.AddProperty("valueAsString", cstr, length);
+    bool did_truncate = jsobj.AddPropertyStr("valueAsString", *this, 128);
     if (did_truncate) {
       jsobj.AddProperty("valueAsStringIsTruncated", did_truncate);
     }
   } else {
-    intptr_t length = 0;
-    const char* cstr = ToCString(&length);
-    jsobj.AddProperty("valueAsString", cstr, length);
+    bool did_truncate = jsobj.AddPropertyStr("valueAsString", *this);
+    ASSERT(!did_truncate);
   }
 }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 7fcebdb..6b88da2 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -393,6 +393,11 @@
     return *empty_descriptors_;
   }
 
+  static const LocalVarDescriptors& empty_var_descriptors() {
+    ASSERT(empty_var_descriptors_ != NULL);
+    return *empty_var_descriptors_;
+  }
+
   // The sentinel is a value that cannot be produced by Dart code.
   // It can be used to mark special values, for example to distinguish
   // "uninitialized" fields.
@@ -670,6 +675,7 @@
   static Array* empty_array_;
   static Array* zero_array_;
   static PcDescriptors* empty_descriptors_;
+  static LocalVarDescriptors* empty_var_descriptors_;
   static Instance* sentinel_;
   static Instance* transition_sentinel_;
   static Instance* unknown_constant_;
@@ -1131,6 +1137,8 @@
   }
   void set_allocation_stub(const Code& value) const;
 
+  void DisableAllocationStub() const;
+
   RawArray* constants() const;
 
   intptr_t FindInvocationDispatcherFunctionIndex(const Function& needle) const;
@@ -3083,13 +3091,14 @@
 
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawLocalVarDescriptors) ==
-        OFFSET_OF_RETURNED_VALUE(RawLocalVarDescriptors, data));
+        OFFSET_OF_RETURNED_VALUE(RawLocalVarDescriptors, names));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(
-        sizeof(RawLocalVarDescriptors) + (len * kBytesPerElement));
+    return RoundedAllocationSize(sizeof(RawLocalVarDescriptors)
+        + (len * kWordSize)  // RawStrings for names.
+        + (len * sizeof(RawLocalVarDescriptors::VarInfo)));
   }
 
   static RawLocalVarDescriptors* New(intptr_t num_variables);
@@ -3099,6 +3108,7 @@
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object);
   friend class Class;
+  friend class Object;
 };
 
 
@@ -5515,7 +5525,7 @@
 
   virtual RawObject* HashCode() const { return Integer::New(Hash()); }
 
-  int32_t CharAt(intptr_t index) const;
+  uint16_t CharAt(intptr_t index) const;
 
   Scanner::CharAtFunc CharAtFunc() const;
 
@@ -5583,16 +5593,6 @@
 
   void ToUTF8(uint8_t* utf8_array, intptr_t array_len) const;
 
-  // Creates a UTF-8, NUL-terminated string in the current zone. The size of the
-  // created string in UTF-8 code units (bytes) is answered in 'length'; this
-  // can be longer than strlen of the result when the string has internal NULs.
-  // For the truncating version, 'max_length' is in UTF-16 code units, and will
-  // be rounded down if necessary to prevent splitting a surrogate pair.
-  const char* ToCString(intptr_t *length) const;
-  const char* ToCStringTruncated(intptr_t max_len,
-                                 bool* did_truncate,
-                                 intptr_t *length) const;
-
   // Copies the string characters into the provided external array
   // and morphs the string object into an external string object.
   // The remaining unused part of the original string object is marked as
@@ -5755,12 +5755,12 @@
 
 class OneByteString : public AllStatic {
  public:
-  static int32_t CharAt(const String& str, intptr_t index) {
+  static uint16_t CharAt(const String& str, intptr_t index) {
     return *CharAddr(str, index);
   }
 
-  static void SetCharAt(const String& str, intptr_t index, uint8_t code_point) {
-    *CharAddr(str, index) = code_point;
+  static void SetCharAt(const String& str, intptr_t index, uint8_t code_unit) {
+    *CharAddr(str, index) = code_unit;
   }
   static RawOneByteString* EscapeSpecialCharacters(const String& str);
   // We use the same maximum elements for all strings.
@@ -5884,7 +5884,7 @@
 
 class TwoByteString : public AllStatic {
  public:
-  static int32_t CharAt(const String& str, intptr_t index) {
+  static uint16_t CharAt(const String& str, intptr_t index) {
     return *CharAddr(str, index);
   }
 
@@ -5984,7 +5984,7 @@
 
 class ExternalOneByteString : public AllStatic {
  public:
-  static int32_t CharAt(const String& str, intptr_t index) {
+  static uint16_t CharAt(const String& str, intptr_t index) {
     return *CharAddr(str, index);
   }
 
@@ -6061,7 +6061,7 @@
 
 class ExternalTwoByteString : public AllStatic {
  public:
-  static int32_t CharAt(const String& str, intptr_t index) {
+  static uint16_t CharAt(const String& str, intptr_t index) {
     return *CharAddr(str, index);
   }
 
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index f67f91b..c6773d0 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -4109,66 +4109,6 @@
 }
 
 
-TEST_CASE(ToCStringTruncated) {
-  const char* kScriptChars =
-      "var ascii = 'Hello, World!';\n"
-      "var unicode = '\\u00CE\\u00F1\\u0163\\u00E9r\\u00F1\\u00E5\\u0163"
-      "\\u00EE\\u00F6\\u00F1\\u00E5\\u013C\\u00EE\\u017E\\u00E5\\u0163"
-      "\\u00EE\\u1EDD\\u00F1';\n"
-      "var surrogates ='\\u{1D11E}\\u{1D11E}\\u{1D11E}\\u{1D11E}"\
-      "\\u{1D11E}';\n";
-
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  EXPECT_VALID(lib);
-
-  String& obj = String::Handle();
-  Dart_Handle result;
-  bool did_truncate;
-  intptr_t length;
-
-  result = Dart_GetField(lib, NewString("ascii"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("Hello, World!",
-               obj.ToCStringTruncated(100, &did_truncate, &length));
-  EXPECT(!did_truncate);
-  EXPECT_EQ(13, length);
-  EXPECT_STREQ("Hel", obj.ToCStringTruncated(3, &did_truncate, &length));
-  EXPECT(did_truncate);
-  EXPECT_EQ(3, length);
-
-  result = Dart_GetField(lib, NewString("unicode"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("\u00CE\u00F1\u0163\u00E9r\u00F1\u00E5\u0163"
-        "\u00EE\u00F6\u00F1\u00E5\u013C\u00EE\u017E\u00E5\u0163"
-        "\u00EE\u1EDD\u00F1",
-        obj.ToCStringTruncated(100, &did_truncate, &length));
-  EXPECT(!did_truncate);
-  EXPECT_EQ(40, length);
-  EXPECT_STREQ("\u00CE\u00F1\u0163",
-               obj.ToCStringTruncated(3, &did_truncate, &length));
-  EXPECT(did_truncate);
-  EXPECT_EQ(6, length);
-
-  result = Dart_GetField(lib, NewString("surrogates"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("\U0001D11E\U0001D11E\U0001D11E\U0001D11E\U0001D11E",
-               obj.ToCStringTruncated(100, &did_truncate, &length));
-  EXPECT(!did_truncate);
-  EXPECT_EQ(20, length);
-  EXPECT_STREQ("\U0001D11E",
-               obj.ToCStringTruncated(3, &did_truncate, &length));
-  EXPECT(did_truncate);
-  EXPECT_EQ(4, length);  // 3 code units would be in the middle of a surrogate
-                         // pair, so it gets rounded down 2 code units.
-  EXPECT_STREQ("\U0001D11E\U0001D11E",
-               obj.ToCStringTruncated(4, &did_truncate, &length));
-  EXPECT(did_truncate);
-  EXPECT_EQ(8, length);
-}
-
 class ObjectAccumulator : public ObjectVisitor {
  public:
   explicit ObjectAccumulator(GrowableArray<Object*>* objects)
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 0380d13..ba4e247 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -156,7 +156,7 @@
       case kLocalVarDescriptorsCid: {
         const RawLocalVarDescriptors* raw_descriptors =
             reinterpret_cast<const RawLocalVarDescriptors*>(this);
-        intptr_t num_descriptors = raw_descriptors->ptr()->length_;
+        intptr_t num_descriptors = raw_descriptors->ptr()->num_entries_;
         instance_size = LocalVarDescriptors::InstanceSize(num_descriptors);
         break;
       }
@@ -522,10 +522,9 @@
 
 intptr_t RawLocalVarDescriptors::VisitLocalVarDescriptorsPointers(
     RawLocalVarDescriptors* raw_obj, ObjectPointerVisitor* visitor) {
-  RawLocalVarDescriptors* obj = raw_obj->ptr();
-  intptr_t len = obj->length_;
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&obj->names_));
-  return LocalVarDescriptors::InstanceSize(len);
+  intptr_t num_entries = raw_obj->ptr()->num_entries_;
+  visitor->VisitPointers(raw_obj->from(), raw_obj->to(num_entries));
+  return LocalVarDescriptors::InstanceSize(num_entries);
 }
 
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index c6ac4b5..bf13fcb 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1097,11 +1097,29 @@
 
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors);
-  RawArray* names_;  // Array of [length_] variable names.
-  int32_t length_;  // Number of descriptors.
+  int32_t num_entries_;  // Number of descriptors.
 
-  // Variable info with [length_] entries.
-  VarInfo* data() { OPEN_ARRAY_START(VarInfo, int32_t); }
+  RawObject** from() {
+    return reinterpret_cast<RawObject**>(&ptr()->names()[0]);
+  }
+  RawString** names() {
+    // Array of [num_entries_] variable names.
+    OPEN_ARRAY_START(RawString*, RawString*);
+  }
+  RawString** nameAddrAt(intptr_t i) {
+    return &(ptr()->names()[i]);
+  }
+
+  RawObject** to(intptr_t num_entries) {
+    return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1));
+  }
+
+  // Variable info with [num_entries_] entries.
+  VarInfo* data() {
+    return reinterpret_cast<VarInfo*>(nameAddrAt(ptr()->num_entries_));
+  }
+
+  friend class Object;
 };
 
 
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
index 5dde147..2c5f64a 100644
--- a/runtime/vm/scanner.h
+++ b/runtime/vm/scanner.h
@@ -26,7 +26,7 @@
 // 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);
+  typedef uint16_t (*CharAtFunc)(const String& str, intptr_t index);
 
   // SourcePosition describes a text location in user friendly
   // terms of line number and column.
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index be699cf..dd3f1bd 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -266,6 +266,9 @@
   int16_t scope_id = 0;
   CollectLocalVariables(&vars, &scope_id);
 
+  if (vars.length() == 0) {
+    return Object::empty_var_descriptors().raw();
+  }
   const LocalVarDescriptors& var_desc =
       LocalVarDescriptors::Handle(LocalVarDescriptors::New(vars.length()));
   for (int i = 0; i < vars.length(); i++) {
@@ -294,7 +297,7 @@
     // This is the outermost scope with a context level or this scope's
     // context level differs from its parent's level.
     VarDesc desc;
-    desc.name = &String::Handle();  // No name.
+    desc.name = &Symbols::Empty();  // No name.
     desc.info.set_kind(RawLocalVarDescriptors::kContextLevel);
     desc.info.scope_id = *scope_id;
     desc.info.begin_pos = begin_token_pos();
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 515ab4e..4f4913c 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -30,7 +30,6 @@
 #include "vm/unicode.h"
 #include "vm/version.h"
 
-
 namespace dart {
 
 DEFINE_FLAG(bool, trace_service, false, "Trace VM service requests.");
@@ -262,64 +261,6 @@
 }
 
 
-struct VmServiceNativeEntry {
-  const char* name;
-  int num_arguments;
-  Dart_NativeFunction function;
-};
-
-
-static VmServiceNativeEntry _VmServiceNativeEntries[] = {
-  {"VMService_SendIsolateServiceMessage", 2, SendIsolateServiceMessage},
-  {"VMService_SendRootServiceMessage", 1, SendRootServiceMessage},
-  {"VMService_SetEventMask", 1, SetEventMask},
-};
-
-
-static Dart_NativeFunction VmServiceNativeResolver(Dart_Handle name,
-                                                   int num_arguments,
-                                                   bool* auto_setup_scope) {
-  const Object& obj = Object::Handle(Api::UnwrapHandle(name));
-  if (!obj.IsString()) {
-    return NULL;
-  }
-  const char* function_name = obj.ToCString();
-  ASSERT(function_name != NULL);
-  ASSERT(auto_setup_scope != NULL);
-  *auto_setup_scope = true;
-  intptr_t n =
-      sizeof(_VmServiceNativeEntries) / sizeof(_VmServiceNativeEntries[0]);
-  for (intptr_t i = 0; i < n; i++) {
-    VmServiceNativeEntry entry = _VmServiceNativeEntries[i];
-    if ((strcmp(function_name, entry.name) == 0) &&
-        (num_arguments == entry.num_arguments)) {
-      return entry.function;
-    }
-  }
-  return NULL;
-}
-
-
-EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL;
-EmbedderServiceHandler* Service::root_service_handler_head_ = NULL;
-Isolate* Service::service_isolate_ = NULL;
-Dart_LibraryTagHandler Service::embedder_provided_handler_ = NULL;
-Dart_Port Service::port_ = ILLEGAL_PORT;
-uint32_t Service::event_mask_ = 0;
-
-
-static Dart_Port ExtractPort(Dart_Handle receivePort) {
-  HANDLESCOPE(Isolate::Current());
-  const Object& unwrapped_rp = Object::Handle(Api::UnwrapHandle(receivePort));
-  const Instance& rp = Instance::Cast(unwrapped_rp);
-  // Extract RawReceivePort port id.
-  if (!rp.IsReceivePort()) {
-    return ILLEGAL_PORT;
-  }
-  return ReceivePort::Cast(rp).Id();
-}
-
-
 // These must be kept in sync with service/constants.dart
 #define VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID 1
 #define VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID 2
@@ -391,6 +332,89 @@
 };
 
 
+static Dart_Port ExtractPort(Isolate* isolate, Dart_Handle receivePort) {
+  const ReceivePort& rp = Api::UnwrapReceivePortHandle(isolate, receivePort);
+  if (rp.IsNull()) {
+    return ILLEGAL_PORT;
+  }
+  return rp.Id();
+}
+
+
+static void OnStart(Dart_NativeArguments args) {
+  NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  Isolate* isolate = arguments->isolate();
+  StackZone zone(isolate);
+  HANDLESCOPE(isolate);
+  {
+    // Boot the dart:vmservice library.
+    Dart_EnterScope();
+    Dart_Handle url_str =
+        Dart_NewStringFromCString(Symbols::Name(Symbols::kDartVMServiceId));
+    Dart_Handle library = Dart_LookupLibrary(url_str);
+    ASSERT(Dart_IsLibrary(library));
+    Dart_Handle result =
+        Dart_Invoke(library, Dart_NewStringFromCString("boot"), 0, NULL);
+    ASSERT(!Dart_IsError(result));
+    Dart_Port port = ExtractPort(isolate, result);
+    ASSERT(port != ILLEGAL_PORT);
+    Service::set_port(port);
+    Dart_ExitScope();
+  }
+  {
+    // Register running isolates with service.
+    RegisterRunningIsolatesVisitor register_isolates(isolate);
+    Isolate::VisitIsolates(&register_isolates);
+  }
+}
+
+
+struct VmServiceNativeEntry {
+  const char* name;
+  int num_arguments;
+  Dart_NativeFunction function;
+};
+
+
+static VmServiceNativeEntry _VmServiceNativeEntries[] = {
+  {"VMService_SendIsolateServiceMessage", 2, SendIsolateServiceMessage},
+  {"VMService_SendRootServiceMessage", 1, SendRootServiceMessage},
+  {"VMService_SetEventMask", 1, SetEventMask},
+  {"VMService_OnStart", 0, OnStart },
+};
+
+
+static Dart_NativeFunction VmServiceNativeResolver(Dart_Handle name,
+                                                   int num_arguments,
+                                                   bool* auto_setup_scope) {
+  const Object& obj = Object::Handle(Api::UnwrapHandle(name));
+  if (!obj.IsString()) {
+    return NULL;
+  }
+  const char* function_name = obj.ToCString();
+  ASSERT(function_name != NULL);
+  ASSERT(auto_setup_scope != NULL);
+  *auto_setup_scope = true;
+  intptr_t n =
+      sizeof(_VmServiceNativeEntries) / sizeof(_VmServiceNativeEntries[0]);
+  for (intptr_t i = 0; i < n; i++) {
+    VmServiceNativeEntry entry = _VmServiceNativeEntries[i];
+    if ((strcmp(function_name, entry.name) == 0) &&
+        (num_arguments == entry.num_arguments)) {
+      return entry.function;
+    }
+  }
+  return NULL;
+}
+
+
+EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL;
+EmbedderServiceHandler* Service::root_service_handler_head_ = NULL;
+Isolate* Service::service_isolate_ = NULL;
+Dart_LibraryTagHandler Service::embedder_provided_handler_ = NULL;
+Dart_Port Service::port_ = ILLEGAL_PORT;
+uint32_t Service::event_mask_ = 0;
+
 Isolate* Service::GetServiceIsolate(void* callback_data) {
   if (service_isolate_ != NULL) {
     // Already initialized, return service isolate.
@@ -403,8 +427,8 @@
   }
   Isolate::SetCurrent(NULL);
   char* error = NULL;
-  Isolate* isolate = reinterpret_cast<Isolate*>(
-      create_callback(callback_data, &error));
+  Isolate* isolate =
+      reinterpret_cast<Isolate*>(create_callback(callback_data, &error));
   if (isolate == NULL) {
     return NULL;
   }
@@ -452,27 +476,6 @@
     embedder_provided_handler_ = NULL;
     library.set_native_entry_resolver(VmServiceNativeResolver);
   }
-  {
-    // Boot the dart:vmservice library.
-    Dart_EnterScope();
-    Dart_Handle result;
-    Dart_Handle url_str =
-        Dart_NewStringFromCString(Symbols::Name(Symbols::kDartVMServiceId));
-    Dart_Handle library = Dart_LookupLibrary(url_str);
-    ASSERT(Dart_IsLibrary(library));
-    result = Dart_Invoke(library, Dart_NewStringFromCString("boot"), 0, NULL);
-    ASSERT(!Dart_IsError(result));
-    port_ = ExtractPort(result);
-    ASSERT(port_ != ILLEGAL_PORT);
-    Dart_ExitScope();
-  }
-  {
-    // Register existing isolates.
-    StackZone zone(isolate);
-    HANDLESCOPE(isolate);
-    RegisterRunningIsolatesVisitor register_isolates(isolate);
-    Isolate::VisitIsolates(&register_isolates);
-  }
   service_isolate_ = reinterpret_cast<Isolate*>(isolate);
   return service_isolate_;
 }
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 7270e24..ec3a807 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -38,6 +38,10 @@
     return port_ != ILLEGAL_PORT;
   }
 
+  static void set_port(Dart_Port port) {
+    port_ = port;
+  }
+
   static void SetEventMask(uint32_t mask);
 
   // Is the service interested in debugger events?
diff --git a/runtime/vm/service/vmservice.dart b/runtime/vm/service/vmservice.dart
index 3f53dbe..10e73c9 100644
--- a/runtime/vm/service/vmservice.dart
+++ b/runtime/vm/service/vmservice.dart
@@ -16,6 +16,9 @@
 part 'message.dart';
 part 'message_router.dart';
 
+final RawReceivePort isolateLifecyclePort = new RawReceivePort();
+final RawReceivePort scriptLoadPort = new RawReceivePort();
+
 class VMService extends MessageRouter {
   static VMService _instance;
   /// Collection of currently connected clients.
@@ -104,13 +107,14 @@
   }
 
   VMService._internal()
-      : eventPort = new RawReceivePort() {
+      : eventPort = isolateLifecyclePort {
     eventPort.handler = messageHandler;
   }
 
   factory VMService() {
     if (VMService._instance == null) {
       VMService._instance = new VMService._internal();
+      _onStart();
     }
     return _instance;
   }
@@ -142,9 +146,8 @@
 }
 
 RawReceivePort boot() {
-  // Boot the VMService.
   // Return the port we expect isolate startup and shutdown messages on.
-  return new VMService().eventPort;
+  return isolateLifecyclePort;
 }
 
 void _registerIsolate(int port_id, SendPort sp, String name) {
@@ -154,3 +157,5 @@
 
 void _setEventMask(int mask)
     native "VMService_SetEventMask";
+
+void _onStart() native "VMService_OnStart";
\ No newline at end of file
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index c63613c..84dd3a6 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -118,7 +118,8 @@
   if (stub.IsNull()) {
     Assembler assembler;
     const char* name = cls.ToCString();
-    StubCode::GenerateAllocationStubForClass(&assembler, cls);
+    uword patch_code_offset =
+        StubCode::GenerateAllocationStubForClass(&assembler, cls);
     stub ^= Code::FinalizeCode(name, &assembler);
     stub.set_owner(cls);
     cls.set_allocation_stub(stub);
@@ -128,6 +129,8 @@
       stub.Disassemble(&formatter);
       OS::Print("}\n");
     }
+    stub.set_entry_patch_pc_offset(0);
+    stub.set_patch_code_pc_offset(patch_code_offset);
   }
   return stub.raw();
 }
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 18d0e57..cd1bd4b 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -27,6 +27,7 @@
   V(CallNativeCFunction)                                                       \
   V(CallStaticFunction)                                                        \
   V(FixCallersTarget)                                                          \
+  V(FixAllocationStubTarget)                                                   \
   V(Deoptimize)                                                                \
   V(DeoptimizeLazy)                                                            \
   V(ICCallBreakpoint)                                                          \
@@ -199,8 +200,8 @@
                            void (*GenerateStub)(Assembler* assembler));
 
   static void GenerateMegamorphicMissStub(Assembler* assembler);
-  static void GenerateAllocationStubForClass(Assembler* assembler,
-                                             const Class& cls);
+  static uword GenerateAllocationStubForClass(Assembler* assembler,
+                                              const Class& cls);
   static void GenerateNArgsCheckInlineCacheStub(
       Assembler* assembler,
       intptr_t num_args,
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 1bf4b23..af78719 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -393,6 +393,25 @@
 }
 
 
+// Called from object allocate instruction when the allocation stub has been
+// disabled.
+void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  // Setup space on stack for return value.
+  __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
+  __ Push(R0);
+  __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0);
+  // Get Code object result.
+  __ Pop(R0);
+  // Remove the stub frame.
+  __ LeaveStubFrame();
+  // Jump to the dart function.
+  __ ldr(R0, FieldAddress(R0, Code::instructions_offset()));
+  __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag);
+  __ bx(R0);
+}
+
+
 // Input parameters:
 //   R2: smi-tagged argument count, may be zero.
 //   FP[kParamEndSlotFromFp + 1]: last argument.
@@ -1027,8 +1046,10 @@
 // Input parameters:
 //   LR : return address.
 //   SP + 0 : type arguments object (only if class is parameterized).
-void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
-                                              const Class& cls) {
+// Returns patch_code_pc offset where patching code for disabling the stub
+// has been generated (similar to regularly generated Dart code).
+uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                               const Class& cls) {
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
   ASSERT(!is_cls_parameterized ||
@@ -1146,6 +1167,10 @@
   // Restore the frame pointer.
   __ LeaveStubFrame();
   __ Ret();
+  uword patch_code_pc_offset = assembler->CodeSize();
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ BranchPatchable(&stub_code->FixAllocationStubTargetLabel());
+  return patch_code_pc_offset;
 }
 
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 967bc0b..422a870 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -418,6 +418,24 @@
 }
 
 
+// Called from object allocate instruction when the allocation stub has been
+// disabled.
+void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  // Setup space on stack for return value.
+  __ PushObject(Object::null_object(), PP);
+  __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0);
+  // Get Code object result.
+  __ Pop(R0);
+  // Remove the stub frame.
+  __ LeaveStubFrame();
+  // Jump to the dart function.
+  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset(), kNoPP);
+  __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
+  __ br(R0);
+}
+
+
 // Input parameters:
 //   R2: smi-tagged argument count, may be zero.
 //   FP[kParamEndSlotFromFp + 1]: last argument.
@@ -1113,8 +1131,8 @@
 // Input parameters:
 //   LR : return address.
 //   SP + 0 : type arguments object (only if class is parameterized).
-void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
-                                              const Class& cls) {
+uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                               const Class& cls) {
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
   ASSERT(!is_cls_parameterized ||
@@ -1232,6 +1250,10 @@
   // Restore the frame pointer.
   __ LeaveStubFrame();
   __ ret();
+  uword patch_code_pc_offset = assembler->CodeSize();
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ BranchPatchable(&stub_code->FixAllocationStubTargetLabel());
+  return patch_code_pc_offset;
 }
 
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 22c44e0..4b6e726 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -394,6 +394,23 @@
 }
 
 
+// Called from object allocate instruction when the allocation stub has been
+// disabled.
+void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
+  const Immediate& raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ EnterStubFrame();
+  __ pushl(raw_null);  // Setup space on stack for return value.
+  __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0);
+  __ popl(EAX);  // Get Code object.
+  __ movl(EAX, FieldAddress(EAX, Code::instructions_offset()));
+  __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ LeaveFrame();
+  __ jmp(EAX);
+  __ int3();
+}
+
+
 // Input parameters:
 //   EDX: smi-tagged argument count, may be zero.
 //   EBP[kParamEndSlotFromFp + 1]: last argument.
@@ -1076,8 +1093,10 @@
 //   ESP + 4 : type arguments object (only if class is parameterized).
 //   ESP : points to return address.
 // Uses EAX, EBX, ECX, EDX, EDI as temporary registers.
-void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
-                                              const Class& cls) {
+// Returns patch_code_pc offset where patching code for disabling the stub
+// has been generated (similar to regularly generated Dart code).
+uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                               const Class& cls) {
   const intptr_t kObjectTypeArgumentsOffset = 1 * kWordSize;
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
@@ -1190,6 +1209,12 @@
   // Restore the frame pointer.
   __ LeaveFrame();
   __ ret();
+  // Emit function patching code. This will be swapped with the first 5 bytes
+  // at entry point.
+  uword patch_code_pc_offset = assembler->CodeSize();
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ jmp(&stub_code->FixAllocationStubTargetLabel());
+  return patch_code_pc_offset;
 }
 
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index ab5a77d..065367d 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -435,6 +435,29 @@
 }
 
 
+// Called from object allocate instruction when the allocation stub has been
+// disabled.
+void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
+  __ TraceSimMsg("FixAllocationStubTarget");
+  __ EnterStubFrame();
+  // Setup space on stack for return value.
+  __ addiu(SP, SP, Immediate(-1 * kWordSize));
+  __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
+  __ sw(TMP, Address(SP, 0 * kWordSize));
+  __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0);
+  // Get Code object result.
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ addiu(SP, SP, Immediate(1 * kWordSize));
+
+  // Jump to the dart function.
+  __ lw(T0, FieldAddress(T0, Code::instructions_offset()));
+  __ AddImmediate(T0, T0, Instructions::HeaderSize() - kHeapObjectTag);
+
+  // Remove the stub frame.
+  __ LeaveStubFrameAndReturn(T0);
+}
+
+
 // Input parameters:
 //   A1: Smi-tagged argument count, may be zero.
 //   FP[kParamEndSlotFromFp + 1]: Last argument.
@@ -1167,7 +1190,9 @@
 // Input parameters:
 //   RA : return address.
 //   SP + 0 : type arguments object (only if class is parameterized).
-void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+// Returns patch_code_pc offset where patching code for disabling the stub
+// has been generated (similar to regularly generated Dart code).
+uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
                                               const Class& cls) {
   __ TraceSimMsg("AllocationStubForClass");
   // The generated code is different if the class is parameterized.
@@ -1290,6 +1315,10 @@
   // V0: new object
   // Restore the frame pointer and return.
   __ LeaveStubFrameAndReturn(RA);
+  uword patch_code_pc_offset = assembler->CodeSize();
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ BranchPatchable(&stub_code->FixAllocationStubTargetLabel());
+  return patch_code_pc_offset;
 }
 
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 0dbb8ac..f320556 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -351,6 +351,22 @@
 }
 
 
+// Called from object allocate instruction when the allocation stub has been
+// disabled.
+void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  // Setup space on stack for return value.
+  __ PushObject(Object::null_object(), PP);
+  __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0);
+  __ popq(RAX);  // Get Code object.
+  __ movq(RAX, FieldAddress(RAX, Code::instructions_offset()));
+  __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ LeaveStubFrame();
+  __ jmp(RAX);
+  __ int3();
+}
+
+
 // Input parameters:
 //   R10: smi-tagged argument count, may be zero.
 //   RBP[kParamEndSlotFromFp + 1]: last argument.
@@ -1051,7 +1067,7 @@
 // Input parameters:
 //   RSP + 8 : type arguments object (only if class is parameterized).
 //   RSP : points to return address.
-void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
                                               const Class& cls) {
   const intptr_t kObjectTypeArgumentsOffset = 1 * kWordSize;
   // The generated code is different if the class is parameterized.
@@ -1164,6 +1180,10 @@
   // Restore the frame pointer.
   __ LeaveStubFrame();
   __ ret();
+  uword patch_code_pc_offset = assembler->CodeSize();
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  __ JmpPatchable(&stub_code->FixAllocationStubTargetLabel(), R13);
+  return patch_code_pc_offset;
 }
 
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 09a234a..fc8497d 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -55,6 +55,7 @@
   V(ImmutableMapConstructor, "ImmutableMap._create")                           \
   V(StringBase, "_StringBase")                                                 \
   V(Interpolate, "_interpolate")                                               \
+  V(InterpolateSingle, "_interpolateSingle")                                   \
   V(GetIterator, "iterator")                                                   \
   V(NoSuchMethod, "noSuchMethod")                                              \
   V(SavedCurrentContextVar, ":saved_current_context_var")                      \
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 7dbd0d8..a3b2276 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -44,6 +44,7 @@
     'base_isolate.h',
     'benchmark_test.cc',
     'benchmark_test.h',
+    'bigint_test.cc',
     'bit_set_test.cc',
     'bit_vector.cc',
     'bit_vector.h',
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 0d5e5f8..6779434 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -24,16 +24,28 @@
 
 class BlinkAbstractWorker {}
 
-class BlinkAlgorithm {
+class BlinkKeyAlgorithm {
   static name_Getter(mthis) native "KeyAlgorithm_name_Getter";
 }
 
+class BlinkAesKeyAlgorithm {
+  static length_Getter(mthis) native "AesKeyAlgorithm_length_Getter";
+}
+
 class BlinkEventTarget {
   static addEventListener_Callback_DOMString_EventListener_boolean(mthis, type, listener, useCapture) native "EventTarget_addEventListener_Callback_DOMString_EventListener_boolean";
 
+  static addEventListener_Callback_DOMString(mthis, type) native "EventTarget_addEventListener_Callback_DOMString";
+
+  static addEventListener_Callback(mthis) native "EventTarget_addEventListener_Callback";
+
   static dispatchEvent_Callback_Event(mthis, event) native "EventTarget_dispatchEvent_Callback_Event";
 
   static removeEventListener_Callback_DOMString_EventListener_boolean(mthis, type, listener, useCapture) native "EventTarget_removeEventListener_Callback_DOMString_EventListener_boolean";
+
+  static removeEventListener_Callback_DOMString(mthis, type) native "EventTarget_removeEventListener_Callback_DOMString";
+
+  static removeEventListener_Callback(mthis) native "EventTarget_removeEventListener_Callback";
 }
 
 class BlinkAudioNode {
@@ -71,45 +83,127 @@
 
   static maxDecibels_Getter(mthis) native "AnalyserNode_maxDecibels_Getter";
 
-  static maxDecibels_Setter_float(mthis, value) native "AnalyserNode_maxDecibels_Setter";
+  static maxDecibels_Setter_double(mthis, value) native "AnalyserNode_maxDecibels_Setter";
 
   static minDecibels_Getter(mthis) native "AnalyserNode_minDecibels_Getter";
 
-  static minDecibels_Setter_float(mthis, value) native "AnalyserNode_minDecibels_Setter";
+  static minDecibels_Setter_double(mthis, value) native "AnalyserNode_minDecibels_Setter";
 
   static smoothingTimeConstant_Getter(mthis) native "AnalyserNode_smoothingTimeConstant_Getter";
 
-  static smoothingTimeConstant_Setter_float(mthis, value) native "AnalyserNode_smoothingTimeConstant_Setter";
+  static smoothingTimeConstant_Setter_double(mthis, value) native "AnalyserNode_smoothingTimeConstant_Setter";
 
   static getByteFrequencyData_Callback_Uint8Array(mthis, array) native "AnalyserNode_getByteFrequencyData_Callback_Uint8Array";
 
   static getByteTimeDomainData_Callback_Uint8Array(mthis, array) native "AnalyserNode_getByteTimeDomainData_Callback_Uint8Array";
 
   static getFloatFrequencyData_Callback_Float32Array(mthis, array) native "AnalyserNode_getFloatFrequencyData_Callback_Float32Array";
+
+  static getFloatTimeDomainData_Callback_Float32Array(mthis, array) native "AnalyserNode_getFloatTimeDomainData_Callback_Float32Array";
 }
 
-class BlinkTimedItem {
-  static activeDuration_Getter(mthis) native "TimedItem_activeDuration_Getter";
+class BlinkAnimationNode {
+  static activeDuration_Getter(mthis) native "AnimationNode_activeDuration_Getter";
 
-  static currentIteration_Getter(mthis) native "TimedItem_currentIteration_Getter";
+  static currentIteration_Getter(mthis) native "AnimationNode_currentIteration_Getter";
 
-  static duration_Getter(mthis) native "TimedItem_duration_Getter";
+  static duration_Getter(mthis) native "AnimationNode_duration_Getter";
 
-  static endTime_Getter(mthis) native "TimedItem_endTime_Getter";
+  static endTime_Getter(mthis) native "AnimationNode_endTime_Getter";
 
-  static localTime_Getter(mthis) native "TimedItem_localTime_Getter";
+  static localTime_Getter(mthis) native "AnimationNode_localTime_Getter";
 
-  static player_Getter(mthis) native "TimedItem_player_Getter";
+  static player_Getter(mthis) native "AnimationNode_player_Getter";
 
-  static startTime_Getter(mthis) native "TimedItem_startTime_Getter";
+  static startTime_Getter(mthis) native "AnimationNode_startTime_Getter";
+
+  static timing_Getter(mthis) native "AnimationNode_timing_Getter";
 }
 
 class BlinkAnimation {
-  static constructorCallback_Element_SEQ_Dictionary_SEQ_Dictionary(target, keyframes, timingInput) native "Animation_constructorCallback_Element_sequence<Dictionary>_Dictionary";
+  static constructorCallback_Element_SEQ_Dictionary_SEQ(target, keyframes) native "Animation_constructorCallback_Element_sequence<Dictionary>";
 
   static constructorCallback_Element_SEQ_Dictionary_SEQ_double(target, keyframes, timingInput) native "Animation_constructorCallback_Element_sequence<Dictionary>_double";
 
-  static constructorCallback_Element_SEQ_Dictionary_SEQ(target, keyframes) native "Animation_constructorCallback_Element_sequence<Dictionary>";
+  static constructorCallback_Element_SEQ_Dictionary_SEQ_Dictionary(target, keyframes, timingInput) native "Animation_constructorCallback_Element_sequence<Dictionary>_Dictionary";
+}
+
+class BlinkAnimationEffect {}
+
+class BlinkAnimationPlayer {
+  static currentTime_Getter(mthis) native "AnimationPlayer_currentTime_Getter";
+
+  static currentTime_Setter_double(mthis, value) native "AnimationPlayer_currentTime_Setter";
+
+  static finished_Getter(mthis) native "AnimationPlayer_finished_Getter";
+
+  static paused_Getter(mthis) native "AnimationPlayer_paused_Getter";
+
+  static playbackRate_Getter(mthis) native "AnimationPlayer_playbackRate_Getter";
+
+  static playbackRate_Setter_double(mthis, value) native "AnimationPlayer_playbackRate_Setter";
+
+  static source_Getter(mthis) native "AnimationPlayer_source_Getter";
+
+  static source_Setter_AnimationNode(mthis, value) native "AnimationPlayer_source_Setter";
+
+  static startTime_Getter(mthis) native "AnimationPlayer_startTime_Getter";
+
+  static startTime_Setter_double(mthis, value) native "AnimationPlayer_startTime_Setter";
+
+  static timeLag_Getter(mthis) native "AnimationPlayer_timeLag_Getter";
+
+  static cancel_Callback(mthis) native "AnimationPlayer_cancel_Callback";
+
+  static finish_Callback(mthis) native "AnimationPlayer_finish_Callback";
+
+  static pause_Callback(mthis) native "AnimationPlayer_pause_Callback";
+
+  static play_Callback(mthis) native "AnimationPlayer_play_Callback";
+
+  static reverse_Callback(mthis) native "AnimationPlayer_reverse_Callback";
+}
+
+class BlinkEvent {
+  static bubbles_Getter(mthis) native "Event_bubbles_Getter";
+
+  static cancelable_Getter(mthis) native "Event_cancelable_Getter";
+
+  static clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
+
+  static currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
+
+  static defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
+
+  static eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
+
+  static path_Getter(mthis) native "Event_path_Getter";
+
+  static target_Getter(mthis) native "Event_target_Getter";
+
+  static timeStamp_Getter(mthis) native "Event_timeStamp_Getter";
+
+  static type_Getter(mthis) native "Event_type_Getter";
+
+  static initEvent_Callback_DOMString_boolean_boolean(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback_DOMString_boolean_boolean";
+
+  static preventDefault_Callback(mthis) native "Event_preventDefault_Callback";
+
+  static stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback";
+
+  static stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback";
+}
+
+class BlinkAnimationPlayerEvent {
+  static currentTime_Getter(mthis) native "AnimationPlayerEvent_currentTime_Getter";
+
+  static timelineTime_Getter(mthis) native "AnimationPlayerEvent_timelineTime_Getter";
+}
+
+class BlinkAnimationTimeline {
+  static currentTime_Getter(mthis) native "AnimationTimeline_currentTime_Getter";
+
+  static play_Callback_AnimationNode(mthis, source) native "AnimationTimeline_play_Callback_AnimationNode";
 }
 
 class BlinkApplicationCache {
@@ -122,6 +216,16 @@
   static update_Callback(mthis) native "ApplicationCache_update_Callback";
 }
 
+class BlinkApplicationCacheErrorEvent {
+  static message_Getter(mthis) native "ApplicationCacheErrorEvent_message_Getter";
+
+  static reason_Getter(mthis) native "ApplicationCacheErrorEvent_reason_Getter";
+
+  static status_Getter(mthis) native "ApplicationCacheErrorEvent_status_Getter";
+
+  static url_Getter(mthis) native "ApplicationCacheErrorEvent_url_Getter";
+}
+
 class BlinkNode {
   static baseURI_Getter(mthis) native "Node_baseURI_Getter";
 
@@ -177,6 +281,12 @@
 
   static namespaceURI_Getter(mthis) native "Attr_namespaceURI_Getter";
 
+  static nodeValue_Getter(mthis) native "Attr_nodeValue_Getter";
+
+  static textContent_Getter(mthis) native "Attr_textContent_Getter";
+
+  static textContent_Setter_DOMString(mthis, value) native "Attr_textContent_Setter";
+
   static value_Getter(mthis) native "Attr_value_Getter";
 
   static value_Setter_DOMString(mthis, value) native "Attr_value_Setter";
@@ -215,12 +325,6 @@
 
   static playbackRate_Getter(mthis) native "AudioBufferSourceNode_playbackRate_Getter";
 
-  static noteGrainOn_Callback_double_double_double(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback_double_double_double";
-
-  static noteOff_Callback_double(mthis, when) native "AudioBufferSourceNode_noteOff_Callback_double";
-
-  static noteOn_Callback_double(mthis, when) native "AudioBufferSourceNode_noteOn_Callback_double";
-
   static start_Callback_double_double_double(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_Callback_double_double_double";
 
   static start_Callback_double_double(mthis, when, grainOffset) native "AudioBufferSourceNode_start_Callback_double_double";
@@ -346,40 +450,34 @@
   static setValueCurveAtTime_Callback_Float32Array_double_double(mthis, values, time, duration) native "AudioParam_setValueCurveAtTime_Callback";
 }
 
-class BlinkEvent {
-  static bubbles_Getter(mthis) native "Event_bubbles_Getter";
-
-  static cancelable_Getter(mthis) native "Event_cancelable_Getter";
-
-  static clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
-
-  static currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
-
-  static defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
-
-  static eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
-
-  static path_Getter(mthis) native "Event_path_Getter";
-
-  static target_Getter(mthis) native "Event_target_Getter";
-
-  static timeStamp_Getter(mthis) native "Event_timeStamp_Getter";
-
-  static type_Getter(mthis) native "Event_type_Getter";
-
-  static initEvent_Callback_DOMString_boolean_boolean(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback_DOMString_boolean_boolean";
-
-  static preventDefault_Callback(mthis) native "Event_preventDefault_Callback";
-
-  static stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback";
-
-  static stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback";
-}
-
 class BlinkAudioProcessingEvent {
   static inputBuffer_Getter(mthis) native "AudioProcessingEvent_inputBuffer_Getter";
 
   static outputBuffer_Getter(mthis) native "AudioProcessingEvent_outputBuffer_Getter";
+
+  static playbackTime_Getter(mthis) native "AudioProcessingEvent_playbackTime_Getter";
+}
+
+class BlinkAudioTrack {
+  static enabled_Getter(mthis) native "AudioTrack_enabled_Getter";
+
+  static enabled_Setter_boolean(mthis, value) native "AudioTrack_enabled_Setter";
+
+  static id_Getter(mthis) native "AudioTrack_id_Getter";
+
+  static kind_Getter(mthis) native "AudioTrack_kind_Getter";
+
+  static label_Getter(mthis) native "AudioTrack_label_Getter";
+
+  static language_Getter(mthis) native "AudioTrack_language_Getter";
+}
+
+class BlinkAudioTrackList {
+  static length_Getter(mthis) native "AudioTrackList_length_Getter";
+
+  static $__getter___Callback_ul(mthis, index) native "AudioTrackList___getter___Callback_unsigned long";
+
+  static getTrackById_Callback_DOMString(mthis, id) native "AudioTrackList_getTrackById_Callback_DOMString";
 }
 
 class BlinkAutocompleteErrorEvent {
@@ -390,7 +488,15 @@
   static visible_Getter(mthis) native "BarProp_visible_Getter";
 }
 
-class BlinkBeforeLoadEvent {}
+class BlinkBatteryManager {
+  static charging_Getter(mthis) native "BatteryManager_charging_Getter";
+
+  static chargingTime_Getter(mthis) native "BatteryManager_chargingTime_Getter";
+
+  static dischargingTime_Getter(mthis) native "BatteryManager_dischargingTime_Getter";
+
+  static level_Getter(mthis) native "BatteryManager_level_Getter";
+}
 
 class BlinkBeforeUnloadEvent {
   static returnValue_Getter(mthis) native "BeforeUnloadEvent_returnValue_Getter";
@@ -421,6 +527,8 @@
 
   static type_Getter(mthis) native "Blob_type_Getter";
 
+  static close_Callback(mthis) native "Blob_close_Callback";
+
   static slice_Callback_ll_ll_DOMString(mthis, start, end, contentType) native "Blob_slice_Callback_long long_long long_DOMString";
 
   static slice_Callback_ll_ll(mthis, start, end) native "Blob_slice_Callback_long long_long long";
@@ -571,7 +679,9 @@
 
   static parentRule_Getter(mthis) native "CSSStyleDeclaration_parentRule_Getter";
 
-  static $__propertyQuery___Callback_DOMString(mthis, name) native "CSSStyleDeclaration___propertyQuery___Callback_DOMString";
+  static $__getter___Callback_DOMString(mthis, name) native "CSSStyleDeclaration___getter___Callback";
+
+  static $__propertyQuery___Callback_DOMString(mthis, name) native "CSSStyleDeclaration___propertyQuery___Callback";
 
   static $__setter___Callback_DOMString_DOMString(mthis, propertyName, propertyValue) native "CSSStyleDeclaration___setter___Callback";
 
@@ -658,19 +768,23 @@
   static alpha_Getter(mthis) native "Canvas2DContextAttributes_alpha_Getter";
 
   static alpha_Setter_boolean(mthis, value) native "Canvas2DContextAttributes_alpha_Setter";
+
+  static storage_Getter(mthis) native "Canvas2DContextAttributes_storage_Getter";
+
+  static storage_Setter_DOMString(mthis, value) native "Canvas2DContextAttributes_storage_Setter";
 }
 
 class BlinkCanvasGradient {
   static addColorStop_Callback_float_DOMString(mthis, offset, color) native "CanvasGradient_addColorStop_Callback_float_DOMString";
 }
 
+class BlinkCanvasPathMethods {}
+
 class BlinkCanvasPattern {}
 
-class BlinkCanvasRenderingContext {
-  static canvas_Getter(mthis) native "CanvasRenderingContext2D_canvas_Getter";
-}
-
 class BlinkCanvasRenderingContext2D {
+  static canvas_Getter(mthis) native "CanvasRenderingContext2D_canvas_Getter";
+
   static currentTransform_Getter(mthis) native "CanvasRenderingContext2D_currentTransform_Getter";
 
   static currentTransform_Setter_SVGMatrix(mthis, value) native "CanvasRenderingContext2D_currentTransform_Setter";
@@ -743,21 +857,17 @@
 
   static textBaseline_Setter_DOMString(mthis, value) native "CanvasRenderingContext2D_textBaseline_Setter";
 
-  static arc_Callback_float_float_float_float_float_boolean(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback_float_float_float_float_float_boolean";
-
-  static arcTo_Callback_float_float_float_float_float(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback_float_float_float_float_float";
-
   static beginPath_Callback(mthis) native "CanvasRenderingContext2D_beginPath_Callback";
 
-  static bezierCurveTo_Callback_float_float_float_float_float_float(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback_float_float_float_float_float_float";
-
   static clearRect_Callback_float_float_float_float(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback_float_float_float_float";
 
-  static clip_Callback_DOMString(mthis, winding) native "CanvasRenderingContext2D_clip_Callback_DOMString";
-
   static clip_Callback(mthis) native "CanvasRenderingContext2D_clip_Callback";
 
-  static closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback";
+  static clip_Callback_DOMString(mthis, path_OR_winding) native "CanvasRenderingContext2D_clip_Callback_DOMString";
+
+  static clip_Callback_Path2D(mthis, path_OR_winding) native "CanvasRenderingContext2D_clip_Callback_Path2D";
+
+  static clip_Callback_Path2D_DOMString(mthis, path_OR_winding, winding) native "CanvasRenderingContext2D_clip_Callback_Path2D_DOMString";
 
   static createImageData_Callback_float_float(mthis, sw, sh) native "CanvasRenderingContext2D_createImageData_Callback_float_float";
 
@@ -765,13 +875,17 @@
 
   static createLinearGradient_Callback_float_float_float_float(mthis, x0, y0, x1, y1) native "CanvasRenderingContext2D_createLinearGradient_Callback_float_float_float_float";
 
-  static createPattern_Callback_HTMLCanvasElement_DOMString(mthis, canvas, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_HTMLCanvasElement_DOMString";
+  static createPattern_Callback_HTMLCanvasElement_DOMString(mthis, canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_HTMLCanvasElement_DOMString";
+
+  static createPattern_Callback_HTMLVideoElement_DOMString(mthis, canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_HTMLVideoElement_DOMString";
 
   static createPattern_Callback_HTMLImageElement_DOMString(mthis, image, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_HTMLImageElement_DOMString";
 
   static createRadialGradient_Callback_float_float_float_float_float_float(mthis, x0, y0, r0, x1, y1, r1) native "CanvasRenderingContext2D_createRadialGradient_Callback_float_float_float_float_float_float";
 
-  static drawCustomFocusRing_Callback_Element(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback_Element";
+  static drawFocusIfNeeded_Callback_Element(mthis, element_OR_path) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback_Element";
+
+  static drawFocusIfNeeded_Callback_Path2D_Element(mthis, element_OR_path, element) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback_Path2D_Element";
 
   static drawImage_Callback_HTMLImageElement_float_float(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_HTMLImageElement_float_float";
 
@@ -797,12 +911,14 @@
 
   static drawImage_Callback_ImageBitmap_float_float_float_float_float_float_float_float(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_ImageBitmap_float_float_float_float_float_float_float_float";
 
-  static ellipse_Callback_float_float_float_float_float_float_float_boolean(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback_float_float_float_float_float_float_float_boolean";
-
-  static fill_Callback_DOMString(mthis, winding) native "CanvasRenderingContext2D_fill_Callback_DOMString";
-
   static fill_Callback(mthis) native "CanvasRenderingContext2D_fill_Callback";
 
+  static fill_Callback_DOMString(mthis, path_OR_winding) native "CanvasRenderingContext2D_fill_Callback_DOMString";
+
+  static fill_Callback_Path2D(mthis, path_OR_winding) native "CanvasRenderingContext2D_fill_Callback_Path2D";
+
+  static fill_Callback_Path2D_DOMString(mthis, path_OR_winding, winding) native "CanvasRenderingContext2D_fill_Callback_Path2D_DOMString";
+
   static fillRect_Callback_float_float_float_float(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback_float_float_float_float";
 
   static fillText_Callback_DOMString_float_float_float(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_Callback_DOMString_float_float_float";
@@ -815,26 +931,26 @@
 
   static getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback";
 
-  static isPointInPath_Callback_float_float_DOMString(mthis, x, y, winding) native "CanvasRenderingContext2D_isPointInPath_Callback_float_float_DOMString";
+  static isContextLost_Callback(mthis) native "CanvasRenderingContext2D_isContextLost_Callback";
 
-  static isPointInPath_Callback_float_float(mthis, x, y) native "CanvasRenderingContext2D_isPointInPath_Callback_float_float";
+  static isPointInPath_Callback_float_float(mthis, path_OR_x, x_OR_y) native "CanvasRenderingContext2D_isPointInPath_Callback_float_float";
 
-  static isPointInStroke_Callback_float_float(mthis, x, y) native "CanvasRenderingContext2D_isPointInStroke_Callback_float_float";
+  static isPointInPath_Callback_float_float_DOMString(mthis, path_OR_x, x_OR_y, winding_OR_y) native "CanvasRenderingContext2D_isPointInPath_Callback_float_float_DOMString";
 
-  static lineTo_Callback_float_float(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback_float_float";
+  static isPointInPath_Callback_Path2D_float_float(mthis, path_OR_x, x_OR_y, winding_OR_y) native "CanvasRenderingContext2D_isPointInPath_Callback_Path2D_float_float";
+
+  static isPointInPath_Callback_Path2D_float_float_DOMString(mthis, path_OR_x, x_OR_y, winding_OR_y, winding) native "CanvasRenderingContext2D_isPointInPath_Callback_Path2D_float_float_DOMString";
+
+  static isPointInStroke_Callback_float_float(mthis, path_OR_x, x_OR_y) native "CanvasRenderingContext2D_isPointInStroke_Callback_float_float";
+
+  static isPointInStroke_Callback_Path2D_float_float(mthis, path_OR_x, x_OR_y, y) native "CanvasRenderingContext2D_isPointInStroke_Callback_Path2D_float_float";
 
   static measureText_Callback_DOMString(mthis, text) native "CanvasRenderingContext2D_measureText_Callback_DOMString";
 
-  static moveTo_Callback_float_float(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback_float_float";
-
   static putImageData_Callback_ImageData_float_float(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_Callback_ImageData_float_float";
 
   static putImageData_Callback_ImageData_float_float_float_float_float_float(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_Callback_ImageData_float_float_float_float_float_float";
 
-  static quadraticCurveTo_Callback_float_float_float_float(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback_float_float_float_float";
-
-  static rect_Callback_float_float_float_float(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback_float_float_float_float";
-
   static resetTransform_Callback(mthis) native "CanvasRenderingContext2D_resetTransform_Callback";
 
   static restore_Callback(mthis) native "CanvasRenderingContext2D_restore_Callback";
@@ -843,29 +959,59 @@
 
   static save_Callback(mthis) native "CanvasRenderingContext2D_save_Callback";
 
-  static scale_Callback_float_float(mthis, sx, sy) native "CanvasRenderingContext2D_scale_Callback_float_float";
+  static scale_Callback_float_float(mthis, x, y) native "CanvasRenderingContext2D_scale_Callback_float_float";
+
+  static scrollPathIntoView_Callback_Path2D(mthis, path) native "CanvasRenderingContext2D_scrollPathIntoView_Callback_Path2D";
+
+  static scrollPathIntoView_Callback(mthis) native "CanvasRenderingContext2D_scrollPathIntoView_Callback";
 
   static setLineDash_Callback_SEQ_float_SEQ(mthis, dash) native "CanvasRenderingContext2D_setLineDash_Callback_sequence<unrestricted float>";
 
-  static setTransform_Callback_float_float_float_float_float_float(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_setTransform_Callback_float_float_float_float_float_float";
+  static setTransform_Callback_float_float_float_float_float_float(mthis, a, b, c, d, e, f) native "CanvasRenderingContext2D_setTransform_Callback_float_float_float_float_float_float";
 
   static stroke_Callback(mthis) native "CanvasRenderingContext2D_stroke_Callback";
 
+  static stroke_Callback_Path2D(mthis, path) native "CanvasRenderingContext2D_stroke_Callback_Path2D";
+
   static strokeRect_Callback_float_float_float_float(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback_float_float_float_float";
 
   static strokeText_Callback_DOMString_float_float_float(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_Callback_DOMString_float_float_float";
 
   static strokeText_Callback_DOMString_float_float(mthis, text, x, y) native "CanvasRenderingContext2D_strokeText_Callback_DOMString_float_float";
 
-  static transform_Callback_float_float_float_float_float_float(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_transform_Callback_float_float_float_float_float_float";
+  static transform_Callback_float_float_float_float_float_float(mthis, a, b, c, d, e, f) native "CanvasRenderingContext2D_transform_Callback_float_float_float_float_float_float";
 
-  static translate_Callback_float_float(mthis, tx, ty) native "CanvasRenderingContext2D_translate_Callback_float_float";
+  static translate_Callback_float_float(mthis, x, y) native "CanvasRenderingContext2D_translate_Callback_float_float";
+
+  static arc_Callback_float_float_float_float_float_boolean(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback_float_float_float_float_float_boolean";
+
+  static arcTo_Callback_float_float_float_float_float(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback_float_float_float_float_float";
+
+  static bezierCurveTo_Callback_float_float_float_float_float_float(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback_float_float_float_float_float_float";
+
+  static closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback";
+
+  static ellipse_Callback_float_float_float_float_float_float_float_boolean(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback_float_float_float_float_float_float_float_boolean";
+
+  static lineTo_Callback_float_float(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback_float_float";
+
+  static moveTo_Callback_float_float(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback_float_float";
+
+  static quadraticCurveTo_Callback_float_float_float_float(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback_float_float_float_float";
+
+  static rect_Callback_float_float_float_float(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback_float_float_float_float";
 }
 
 class BlinkChannelMergerNode {}
 
 class BlinkChannelSplitterNode {}
 
+class BlinkClient {
+  static id_Getter(mthis) native "Client_id_Getter";
+
+  static postMessage_Callback_SerializedScriptValue_A_MessagePort_A(mthis, message, messagePorts) native "Client_postMessage_Callback";
+}
+
 class BlinkClientRect {
   static bottom_Getter(mthis) native "ClientRect_bottom_Getter";
 
@@ -886,32 +1032,6 @@
   static item_Callback_ul(mthis, index) native "ClientRectList_item_Callback_unsigned long";
 }
 
-class BlinkClipboard {
-  static dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
-
-  static dropEffect_Setter_DOMString(mthis, value) native "DataTransfer_dropEffect_Setter";
-
-  static effectAllowed_Getter(mthis) native "DataTransfer_effectAllowed_Getter";
-
-  static effectAllowed_Setter_DOMString(mthis, value) native "DataTransfer_effectAllowed_Setter";
-
-  static files_Getter(mthis) native "DataTransfer_files_Getter";
-
-  static items_Getter(mthis) native "DataTransfer_items_Getter";
-
-  static types_Getter(mthis) native "DataTransfer_types_Getter";
-
-  static clearData_Callback_DOMString(mthis, type) native "DataTransfer_clearData_Callback_DOMString";
-
-  static clearData_Callback(mthis) native "DataTransfer_clearData_Callback";
-
-  static getData_Callback_DOMString(mthis, type) native "DataTransfer_getData_Callback_DOMString";
-
-  static setData_Callback_DOMString_DOMString(mthis, type, data) native "DataTransfer_setData_Callback_DOMString_DOMString";
-
-  static setDragImage_Callback_Element_long_long(mthis, image, x, y) native "DataTransfer_setDragImage_Callback_Element_long_long";
-}
-
 class BlinkCloseEvent {
   static code_Getter(mthis) native "CloseEvent_code_Getter";
 
@@ -957,7 +1077,7 @@
 }
 
 class BlinkConsoleBase {
-  static assertCondition_Callback_boolean_object(mthis, condition, arg) native "ConsoleBase_assert_Callback_boolean_object";
+  static assert_Callback_boolean_object(mthis, condition, arg) native "ConsoleBase_assert_Callback_boolean_object";
 
   static clear_Callback_object(mthis, arg) native "ConsoleBase_clear_Callback_object";
 
@@ -1049,6 +1169,8 @@
 }
 
 class BlinkDOMError {
+  static constructorCallback_DOMString_DOMString(name, message) native "DOMError_constructorCallback_DOMString_DOMString";
+
   static message_Getter(mthis) native "DOMError_message_Getter";
 
   static name_Getter(mthis) native "DOMError_name_Getter";
@@ -1089,10 +1211,14 @@
 class BlinkDOMTokenList {
   static length_Getter(mthis) native "DOMTokenList_length_Getter";
 
+  static add_Callback_DOMString(mthis, tokens) native "DOMTokenList_add_Callback_DOMString";
+
   static contains_Callback_DOMString(mthis, token) native "DOMTokenList_contains_Callback_DOMString";
 
   static item_Callback_ul(mthis, index) native "DOMTokenList_item_Callback_unsigned long";
 
+  static remove_Callback_DOMString(mthis, tokens) native "DOMTokenList_remove_Callback_DOMString";
+
   static toString_Callback(mthis) native "DOMTokenList_toString_Callback";
 
   static toggle_Callback_DOMString_boolean(mthis, token, force) native "DOMTokenList_toggle_Callback_DOMString_boolean";
@@ -1130,6 +1256,32 @@
   static $__setter___Callback_DOMString_DOMString(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_DOMString_DOMString";
 }
 
+class BlinkDataTransfer {
+  static dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
+
+  static dropEffect_Setter_DOMString(mthis, value) native "DataTransfer_dropEffect_Setter";
+
+  static effectAllowed_Getter(mthis) native "DataTransfer_effectAllowed_Getter";
+
+  static effectAllowed_Setter_DOMString(mthis, value) native "DataTransfer_effectAllowed_Setter";
+
+  static files_Getter(mthis) native "DataTransfer_files_Getter";
+
+  static items_Getter(mthis) native "DataTransfer_items_Getter";
+
+  static types_Getter(mthis) native "DataTransfer_types_Getter";
+
+  static clearData_Callback_DOMString(mthis, type) native "DataTransfer_clearData_Callback_DOMString";
+
+  static clearData_Callback(mthis) native "DataTransfer_clearData_Callback";
+
+  static getData_Callback_DOMString(mthis, type) native "DataTransfer_getData_Callback_DOMString";
+
+  static setData_Callback_DOMString_DOMString(mthis, type, data) native "DataTransfer_setData_Callback_DOMString_DOMString";
+
+  static setDragImage_Callback_Element_long_long(mthis, image, x, y) native "DataTransfer_setDragImage_Callback_Element_long_long";
+}
+
 class BlinkDataTransferItem {
   static kind_Getter(mthis) native "DataTransferItem_kind_Getter";
 
@@ -1147,10 +1299,10 @@
 
   static $__getter___Callback_ul(mthis, index) native "DataTransferItemList___getter___Callback_unsigned long";
 
-  static add_Callback_File(mthis, data_OR_file) native "DataTransferItemList_add_Callback_File";
-
   static add_Callback_DOMString_DOMString(mthis, data_OR_file, type) native "DataTransferItemList_add_Callback_DOMString_DOMString";
 
+  static add_Callback_File(mthis, data_OR_file) native "DataTransferItemList_add_Callback_File";
+
   static clear_Callback(mthis) native "DataTransferItemList_clear_Callback";
 
   static remove_Callback_ul(mthis, index) native "DataTransferItemList_remove_Callback_unsigned long";
@@ -1201,6 +1353,8 @@
 
   static close_Callback(mthis) native "WorkerGlobalScope_close_Callback";
 
+  static importScripts_Callback_DOMString(mthis, urls) native "WorkerGlobalScope_importScripts_Callback_DOMString";
+
   static openDatabase_Callback_DOMString_DOMString_DOMString_ul_DatabaseCallback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabase_Callback_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
   static openDatabaseSync_Callback_DOMString_DOMString_DOMString_ul_DatabaseCallback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabaseSync_Callback_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
@@ -1254,6 +1408,10 @@
   static z_Getter(mthis) native "DeviceAcceleration_z_Getter";
 }
 
+class BlinkDeviceLightEvent {
+  static value_Getter(mthis) native "DeviceLightEvent_value_Getter";
+}
+
 class BlinkDeviceMotionEvent {
   static acceleration_Getter(mthis) native "DeviceMotionEvent_acceleration_Getter";
 
@@ -1344,6 +1502,10 @@
   static firstElementChild_Getter(mthis) native "ParentNode_firstElementChild_Getter";
 
   static lastElementChild_Getter(mthis) native "ParentNode_lastElementChild_Getter";
+
+  static querySelector_Callback_DOMString(mthis, selectors) native "ParentNode_querySelector_Callback_DOMString";
+
+  static querySelectorAll_Callback_DOMString(mthis, selectors) native "ParentNode_querySelectorAll_Callback_DOMString";
 }
 
 class BlinkDocument {
@@ -1353,6 +1515,8 @@
 
   static body_Setter_HTMLElement(mthis, value) native "Document_body_Setter";
 
+  static contentType_Getter(mthis) native "Document_contentType_Getter";
+
   static cookie_Getter(mthis) native "Document_cookie_Getter";
 
   static cookie_Setter_DOMString(mthis, value) native "Document_cookie_Setter";
@@ -1375,6 +1539,8 @@
 
   static lastModified_Getter(mthis) native "Document_lastModified_Getter";
 
+  static pointerLockElement_Getter(mthis) native "Document_pointerLockElement_Getter";
+
   static preferredStylesheetSet_Getter(mthis) native "Document_preferredStylesheetSet_Getter";
 
   static readyState_Getter(mthis) native "Document_readyState_Getter";
@@ -1419,8 +1585,6 @@
 
   static createEvent_Callback_DOMString(mthis, eventType) native "Document_createEvent_Callback_DOMString";
 
-  static createEvent_Callback(mthis) native "Document_createEvent_Callback";
-
   static createNodeIterator_Callback_Node_ul_NodeFilter(mthis, root, whatToShow, filter) native "Document_createNodeIterator_Callback_Node_unsigned long_NodeFilter";
 
   static createNodeIterator_Callback_Node_ul(mthis, root, whatToShow) native "Document_createNodeIterator_Callback_Node_unsigned long";
@@ -1431,7 +1595,9 @@
 
   static createTextNode_Callback_DOMString(mthis, data) native "Document_createTextNode_Callback_DOMString";
 
-  static createTouch_Callback_Window_EventTarget_long_long_long_long_long_long_long_float_float(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback_Window_EventTarget_long_long_long_long_long_long_long_float_float";
+  static createTouch_Callback_Window_EventTarget_long_double_double_double_double_double_double_float_float(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback_Window_EventTarget_long_double_double_double_double_double_double_float_float";
+
+  static createTouchList_Callback_Touch(mthis, touches) native "Document_createTouchList_Callback_Touch";
 
   static createTreeWalker_Callback_Node_ul_NodeFilter(mthis, root, whatToShow, filter) native "Document_createTreeWalker_Callback_Node_unsigned long_NodeFilter";
 
@@ -1443,6 +1609,8 @@
 
   static execCommand_Callback_DOMString_boolean_DOMString(mthis, command, userInterface, value) native "Document_execCommand_Callback_DOMString_boolean_DOMString";
 
+  static exitPointerLock_Callback(mthis) native "Document_exitPointerLock_Callback";
+
   static getCSSCanvasContext_Callback_DOMString_DOMString_long_long(mthis, contextId, name, width, height) native "Document_getCSSCanvasContext_Callback_DOMString_DOMString_long_long";
 
   static getElementById_Callback_DOMString(mthis, elementId) native "Document_getElementById_Callback_DOMString";
@@ -1467,10 +1635,6 @@
 
   static queryCommandValue_Callback_DOMString(mthis, command) native "Document_queryCommandValue_Callback_DOMString";
 
-  static querySelector_Callback_DOMString(mthis, selectors) native "Document_querySelector_Callback_DOMString";
-
-  static querySelectorAll_Callback_DOMString(mthis, selectors) native "Document_querySelectorAll_Callback_DOMString";
-
   static webkitExitFullscreen_Callback(mthis) native "Document_webkitExitFullscreen_Callback";
 
   static webkitExitPointerLock_Callback(mthis) native "Document_webkitExitPointerLock_Callback";
@@ -1482,18 +1646,24 @@
   static firstElementChild_Getter(mthis) native "Document_firstElementChild_Getter";
 
   static lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
+
+  static querySelector_Callback_DOMString(mthis, selectors) native "Document_querySelector_Callback_DOMString";
+
+  static querySelectorAll_Callback_DOMString(mthis, selectors) native "Document_querySelectorAll_Callback_DOMString";
 }
 
 class BlinkDocumentFragment {
-  static querySelector_Callback_DOMString(mthis, selectors) native "DocumentFragment_querySelector_Callback_DOMString";
-
-  static querySelectorAll_Callback_DOMString(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback_DOMString";
+  static getElementById_Callback_DOMString(mthis, elementId) native "DocumentFragment_getElementById_Callback_DOMString";
 
   static childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
 
   static firstElementChild_Getter(mthis) native "DocumentFragment_firstElementChild_Getter";
 
   static lastElementChild_Getter(mthis) native "DocumentFragment_lastElementChild_Getter";
+
+  static querySelector_Callback_DOMString(mthis, selectors) native "DocumentFragment_querySelector_Callback_DOMString";
+
+  static querySelectorAll_Callback_DOMString(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback_DOMString";
 }
 
 class BlinkDocumentType {}
@@ -1512,8 +1682,12 @@
   static threshold_Getter(mthis) native "DynamicsCompressorNode_threshold_Getter";
 }
 
+class BlinkEXTBlendMinMax {}
+
 class BlinkEXTFragDepth {}
 
+class BlinkEXTShaderTextureLOD {}
+
 class BlinkEXTTextureFilterAnisotropic {}
 
 class BlinkElement {
@@ -1573,11 +1747,7 @@
 
   static tagName_Getter(mthis) native "Element_tagName_Getter";
 
-  static animate_Callback_SEQ_Dictionary_SEQ_Dictionary(mthis, keyframes, timingInput) native "Element_animate_Callback_sequence<Dictionary>_Dictionary";
-
-  static animate_Callback_SEQ_Dictionary_SEQ_double(mthis, keyframes, timingInput) native "Element_animate_Callback_sequence<Dictionary>_double";
-
-  static animate_Callback_SEQ_Dictionary_SEQ(mthis, keyframes) native "Element_animate_Callback_sequence<Dictionary>";
+  static animate_Callback_object_object(mthis, effect, timing) native "Element_animate_Callback";
 
   static blur_Callback(mthis) native "Element_blur_Callback";
 
@@ -1611,14 +1781,12 @@
 
   static matches_Callback_DOMString(mthis, selectors) native "Element_matches_Callback_DOMString";
 
-  static querySelector_Callback_DOMString(mthis, selectors) native "Element_querySelector_Callback_DOMString";
-
-  static querySelectorAll_Callback_DOMString(mthis, selectors) native "Element_querySelectorAll_Callback_DOMString";
-
   static removeAttribute_Callback_DOMString(mthis, name) native "Element_removeAttribute_Callback_DOMString";
 
   static removeAttributeNS_Callback_DOMString_DOMString(mthis, namespaceURI, localName) native "Element_removeAttributeNS_Callback_DOMString_DOMString";
 
+  static requestPointerLock_Callback(mthis) native "Element_requestPointerLock_Callback";
+
   static scrollByLines_Callback_long(mthis, lines) native "Element_scrollByLines_Callback_long";
 
   static scrollByPages_Callback_long(mthis, pages) native "Element_scrollByPages_Callback_long";
@@ -1637,8 +1805,6 @@
 
   static webkitRequestFullscreen_Callback(mthis) native "Element_webkitRequestFullscreen_Callback";
 
-  static webkitRequestPointerLock_Callback(mthis) native "Element_webkitRequestPointerLock_Callback";
-
   static nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
 
   static previousElementSibling_Getter(mthis) native "Element_previousElementSibling_Getter";
@@ -1652,6 +1818,10 @@
   static firstElementChild_Getter(mthis) native "Element_firstElementChild_Getter";
 
   static lastElementChild_Getter(mthis) native "Element_lastElementChild_Getter";
+
+  static querySelector_Callback_DOMString(mthis, selectors) native "Element_querySelector_Callback_DOMString";
+
+  static querySelectorAll_Callback_DOMString(mthis, selectors) native "Element_querySelectorAll_Callback_DOMString";
 }
 
 class BlinkErrorEvent {
@@ -1678,6 +1848,12 @@
   static close_Callback(mthis) native "EventSource_close_Callback";
 }
 
+class BlinkFetchEvent {
+  static request_Getter(mthis) native "FetchEvent_request_Getter";
+
+  static respondWith_Callback_ScriptValue(mthis, value) native "FetchEvent_respondWith_Callback_ScriptValue";
+}
+
 class BlinkFile {
   static lastModified_Getter(mthis) native "File_lastModified_Getter";
 
@@ -1757,6 +1933,10 @@
 class BlinkFontFace {
   static constructorCallback_DOMString_DOMString_Dictionary(family, source, descriptors) native "FontFace_constructorCallback_DOMString_DOMString_Dictionary";
 
+  static constructorCallback_DOMString_ArrayBufferView_Dictionary(family, source, descriptors) native "FontFace_constructorCallback_DOMString_ArrayBufferView_Dictionary";
+
+  static constructorCallback_DOMString_ArrayBuffer_Dictionary(family, source, descriptors) native "FontFace_constructorCallback_DOMString_ArrayBuffer_Dictionary";
+
   static family_Getter(mthis) native "FontFace_family_Getter";
 
   static family_Setter_DOMString(mthis, value) native "FontFace_family_Setter";
@@ -1786,8 +1966,6 @@
   static weight_Getter(mthis) native "FontFace_weight_Getter";
 
   static weight_Setter_DOMString(mthis, value) native "FontFace_weight_Setter";
-
-  static load_Callback(mthis) native "FontFace_load_Callback";
 }
 
 class BlinkFontFaceSet {
@@ -1825,15 +2003,27 @@
 class BlinkGamepad {
   static axes_Getter(mthis) native "Gamepad_axes_Getter";
 
-  static buttons_Getter(mthis) native "WebKitGamepad_buttons_Getter";
+  static connected_Getter(mthis) native "Gamepad_connected_Getter";
 
   static id_Getter(mthis) native "Gamepad_id_Getter";
 
   static index_Getter(mthis) native "Gamepad_index_Getter";
 
+  static mapping_Getter(mthis) native "Gamepad_mapping_Getter";
+
   static timestamp_Getter(mthis) native "Gamepad_timestamp_Getter";
 }
 
+class BlinkGamepadButton {
+  static pressed_Getter(mthis) native "GamepadButton_pressed_Getter";
+
+  static value_Getter(mthis) native "GamepadButton_value_Getter";
+}
+
+class BlinkGamepadEvent {
+  static gamepad_Getter(mthis) native "GamepadEvent_gamepad_Getter";
+}
+
 class BlinkGamepadList {
   static length_Getter(mthis) native "GamepadList_length_Getter";
 
@@ -1961,6 +2151,10 @@
 
   static hreflang_Setter_DOMString(mthis, value) native "HTMLAnchorElement_hreflang_Setter";
 
+  static integrity_Getter(mthis) native "HTMLAnchorElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLAnchorElement_integrity_Setter";
+
   static rel_Getter(mthis) native "HTMLAnchorElement_rel_Getter";
 
   static rel_Setter_DOMString(mthis, value) native "HTMLAnchorElement_rel_Setter";
@@ -2083,6 +2277,8 @@
 }
 
 class BlinkHTMLMediaElement {
+  static audioTracks_Getter(mthis) native "HTMLMediaElement_audioTracks_Getter";
+
   static autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
 
   static autoplay_Setter_boolean(mthis, value) native "HTMLMediaElement_autoplay_Setter";
@@ -2121,6 +2317,10 @@
 
   static error_Getter(mthis) native "HTMLMediaElement_error_Getter";
 
+  static integrity_Getter(mthis) native "HTMLMediaElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLMediaElement_integrity_Setter";
+
   static loop_Getter(mthis) native "HTMLMediaElement_loop_Getter";
 
   static loop_Setter_boolean(mthis, value) native "HTMLMediaElement_loop_Setter";
@@ -2161,6 +2361,8 @@
 
   static textTracks_Getter(mthis) native "HTMLMediaElement_textTracks_Getter";
 
+  static videoTracks_Getter(mthis) native "HTMLMediaElement_videoTracks_Getter";
+
   static volume_Getter(mthis) native "HTMLMediaElement_volume_Getter";
 
   static volume_Setter_double(mthis, value) native "HTMLMediaElement_volume_Setter";
@@ -2295,10 +2497,6 @@
 }
 
 class BlinkHTMLContentElement {
-  static resetStyleInheritance_Getter(mthis) native "HTMLContentElement_resetStyleInheritance_Getter";
-
-  static resetStyleInheritance_Setter_boolean(mthis, value) native "HTMLContentElement_resetStyleInheritance_Setter";
-
   static select_Getter(mthis) native "HTMLContentElement_select_Getter";
 
   static select_Setter_DOMString(mthis, value) native "HTMLContentElement_select_Setter";
@@ -2345,6 +2543,10 @@
 
   static height_Setter_DOMString(mthis, value) native "HTMLEmbedElement_height_Setter";
 
+  static integrity_Getter(mthis) native "HTMLEmbedElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLEmbedElement_integrity_Setter";
+
   static name_Getter(mthis) native "HTMLEmbedElement_name_Getter";
 
   static name_Setter_DOMString(mthis, value) native "HTMLEmbedElement_name_Setter";
@@ -2394,7 +2596,9 @@
 
 class BlinkHTMLFontElement {}
 
-class BlinkHTMLFormControlsCollection {}
+class BlinkHTMLFormControlsCollection {
+  static namedItem_Callback_DOMString(mthis, name) native "HTMLFormControlsCollection_namedItem_Callback_DOMString";
+}
 
 class BlinkHTMLFormElement {
   static acceptCharset_Getter(mthis) native "HTMLFormElement_acceptCharset_Getter";
@@ -2435,7 +2639,9 @@
 
   static target_Setter_DOMString(mthis, value) native "HTMLFormElement_target_Setter";
 
-  static $__getter___Callback_ul(mthis, index) native "HTMLFormElement___getter___Callback_unsigned long";
+  static $__getter___Callback_ul(mthis, index_OR_name) native "HTMLFormElement___getter___Callback_unsigned long";
+
+  static $__getter___Callback_DOMString(mthis, index_OR_name) native "HTMLFormElement___getter___Callback_DOMString";
 
   static checkValidity_Callback(mthis) native "HTMLFormElement_checkValidity_Callback";
 
@@ -2469,6 +2675,10 @@
 
   static height_Setter_DOMString(mthis, value) native "HTMLIFrameElement_height_Setter";
 
+  static integrity_Getter(mthis) native "HTMLIFrameElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLIFrameElement_integrity_Setter";
+
   static name_Getter(mthis) native "HTMLIFrameElement_name_Getter";
 
   static name_Setter_DOMString(mthis, value) native "HTMLIFrameElement_name_Setter";
@@ -2501,10 +2711,16 @@
 
   static crossOrigin_Setter_DOMString(mthis, value) native "HTMLImageElement_crossOrigin_Setter";
 
+  static currentSrc_Getter(mthis) native "HTMLImageElement_currentSrc_Getter";
+
   static height_Getter(mthis) native "HTMLImageElement_height_Getter";
 
   static height_Setter_long(mthis, value) native "HTMLImageElement_height_Setter";
 
+  static integrity_Getter(mthis) native "HTMLImageElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLImageElement_integrity_Setter";
+
   static isMap_Getter(mthis) native "HTMLImageElement_isMap_Getter";
 
   static isMap_Setter_boolean(mthis, value) native "HTMLImageElement_isMap_Setter";
@@ -2513,6 +2729,10 @@
 
   static naturalWidth_Getter(mthis) native "HTMLImageElement_naturalWidth_Getter";
 
+  static sizes_Getter(mthis) native "HTMLImageElement_sizes_Getter";
+
+  static sizes_Setter_DOMString(mthis, value) native "HTMLImageElement_sizes_Setter";
+
   static src_Getter(mthis) native "HTMLImageElement_src_Getter";
 
   static src_Setter_DOMString(mthis, value) native "HTMLImageElement_src_Setter";
@@ -2805,6 +3025,10 @@
 
   static import_Getter(mthis) native "HTMLLinkElement_import_Getter";
 
+  static integrity_Getter(mthis) native "HTMLLinkElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLLinkElement_integrity_Setter";
+
   static media_Getter(mthis) native "HTMLLinkElement_media_Getter";
 
   static media_Setter_DOMString(mthis, value) native "HTMLLinkElement_media_Setter";
@@ -2911,6 +3135,10 @@
 
   static height_Setter_DOMString(mthis, value) native "HTMLObjectElement_height_Setter";
 
+  static integrity_Getter(mthis) native "HTMLObjectElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLObjectElement_integrity_Setter";
+
   static name_Getter(mthis) native "HTMLObjectElement_name_Getter";
 
   static name_Setter_DOMString(mthis, value) native "HTMLObjectElement_name_Setter";
@@ -3026,6 +3254,8 @@
   static value_Setter_DOMString(mthis, value) native "HTMLParamElement_value_Setter";
 }
 
+class BlinkHTMLPictureElement {}
+
 class BlinkHTMLPreElement {}
 
 class BlinkHTMLProgressElement {
@@ -3065,6 +3295,10 @@
 
   static defer_Setter_boolean(mthis, value) native "HTMLScriptElement_defer_Setter";
 
+  static integrity_Getter(mthis) native "HTMLScriptElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLScriptElement_integrity_Setter";
+
   static nonce_Getter(mthis) native "HTMLScriptElement_nonce_Getter";
 
   static nonce_Setter_DOMString(mthis, value) native "HTMLScriptElement_nonce_Setter";
@@ -3129,6 +3363,8 @@
 
   static $__setter___Callback_ul_HTMLOptionElement(mthis, index, value) native "HTMLSelectElement___setter___Callback_unsigned long_HTMLOptionElement";
 
+  static add_Callback_HTMLElement_long(mthis, element, before) native "HTMLSelectElement_add_Callback_HTMLElement_long";
+
   static checkValidity_Callback(mthis) native "HTMLSelectElement_checkValidity_Callback";
 
   static item_Callback_ul(mthis, index) native "HTMLSelectElement_item_Callback_unsigned long";
@@ -3139,22 +3375,30 @@
 }
 
 class BlinkHTMLShadowElement {
-  static resetStyleInheritance_Getter(mthis) native "HTMLShadowElement_resetStyleInheritance_Getter";
-
-  static resetStyleInheritance_Setter_boolean(mthis, value) native "HTMLShadowElement_resetStyleInheritance_Setter";
-
   static getDistributedNodes_Callback(mthis) native "HTMLShadowElement_getDistributedNodes_Callback";
 }
 
 class BlinkHTMLSourceElement {
+  static integrity_Getter(mthis) native "HTMLSourceElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLSourceElement_integrity_Setter";
+
   static media_Getter(mthis) native "HTMLSourceElement_media_Getter";
 
   static media_Setter_DOMString(mthis, value) native "HTMLSourceElement_media_Setter";
 
+  static sizes_Getter(mthis) native "HTMLSourceElement_sizes_Getter";
+
+  static sizes_Setter_DOMString(mthis, value) native "HTMLSourceElement_sizes_Setter";
+
   static src_Getter(mthis) native "HTMLSourceElement_src_Getter";
 
   static src_Setter_DOMString(mthis, value) native "HTMLSourceElement_src_Setter";
 
+  static srcset_Getter(mthis) native "HTMLSourceElement_srcset_Getter";
+
+  static srcset_Setter_DOMString(mthis, value) native "HTMLSourceElement_srcset_Setter";
+
   static type_Getter(mthis) native "HTMLSourceElement_type_Getter";
 
   static type_Setter_DOMString(mthis, value) native "HTMLSourceElement_type_Setter";
@@ -3171,10 +3415,6 @@
 
   static media_Setter_DOMString(mthis, value) native "HTMLStyleElement_media_Setter";
 
-  static scoped_Getter(mthis) native "HTMLStyleElement_scoped_Getter";
-
-  static scoped_Setter_boolean(mthis, value) native "HTMLStyleElement_scoped_Setter";
-
   static sheet_Getter(mthis) native "HTMLStyleElement_sheet_Getter";
 
   static type_Getter(mthis) native "HTMLStyleElement_type_Getter";
@@ -3240,6 +3480,8 @@
   static deleteTHead_Callback(mthis) native "HTMLTableElement_deleteTHead_Callback";
 
   static insertRow_Callback_long(mthis, index) native "HTMLTableElement_insertRow_Callback_long";
+
+  static insertRow_Callback(mthis) native "HTMLTableElement_insertRow_Callback";
 }
 
 class BlinkHTMLTableRowElement {
@@ -3252,6 +3494,8 @@
   static deleteCell_Callback_long(mthis, index) native "HTMLTableRowElement_deleteCell_Callback_long";
 
   static insertCell_Callback_long(mthis, index) native "HTMLTableRowElement_insertCell_Callback_long";
+
+  static insertCell_Callback(mthis) native "HTMLTableRowElement_insertCell_Callback";
 }
 
 class BlinkHTMLTableSectionElement {
@@ -3260,6 +3504,8 @@
   static deleteRow_Callback_long(mthis, index) native "HTMLTableSectionElement_deleteRow_Callback_long";
 
   static insertRow_Callback_long(mthis, index) native "HTMLTableSectionElement_insertRow_Callback_long";
+
+  static insertRow_Callback(mthis) native "HTMLTableSectionElement_insertRow_Callback";
 }
 
 class BlinkHTMLTemplateElement {
@@ -3371,6 +3617,10 @@
 
   static default_Setter_boolean(mthis, value) native "HTMLTrackElement_default_Setter";
 
+  static integrity_Getter(mthis) native "HTMLTrackElement_integrity_Getter";
+
+  static integrity_Setter_DOMString(mthis, value) native "HTMLTrackElement_integrity_Setter";
+
   static kind_Getter(mthis) native "HTMLTrackElement_kind_Getter";
 
   static kind_Setter_DOMString(mthis, value) native "HTMLTrackElement_kind_Setter";
@@ -3432,6 +3682,26 @@
   static initHashChangeEvent_Callback_DOMString_boolean_boolean_DOMString_DOMString(mthis, type, canBubble, cancelable, oldURL, newURL) native "HashChangeEvent_initHashChangeEvent_Callback_DOMString_boolean_boolean_DOMString_DOMString";
 }
 
+class BlinkHeaderMap {
+  static constructorCallback() native "HeaderMap_constructorCallback";
+
+  static size_Getter(mthis) native "HeaderMap_size_Getter";
+
+  static clear_Callback(mthis) native "HeaderMap_clear_Callback";
+
+  static delete_Callback_DOMString(mthis, key) native "HeaderMap_delete_Callback_DOMString";
+
+  static forEach_Callback_HeaderMapForEachCallback_ScriptValue(mthis, callback, thisArg) native "HeaderMap_forEach_Callback_HeaderMapForEachCallback_ScriptValue";
+
+  static forEach_Callback_HeaderMapForEachCallback(mthis, callback) native "HeaderMap_forEach_Callback_HeaderMapForEachCallback";
+
+  static get_Callback_DOMString(mthis, key) native "HeaderMap_get_Callback_DOMString";
+
+  static has_Callback_DOMString(mthis, key) native "HeaderMap_has_Callback_DOMString";
+
+  static set_Callback_DOMString_DOMString(mthis, key, value) native "HeaderMap_set_Callback_DOMString_DOMString";
+}
+
 class BlinkHistory {
   static length_Getter(mthis) native "History_length_Getter";
 
@@ -3448,6 +3718,12 @@
   static replaceState_Callback_ScriptValue_DOMString_DOMString(mthis, data, title, url) native "History_replaceState_Callback";
 }
 
+class BlinkHmacKeyAlgorithm {
+  static hash_Getter(mthis) native "HmacKeyAlgorithm_hash_Getter";
+
+  static length_Getter(mthis) native "HmacKeyAlgorithm_length_Getter";
+}
+
 class BlinkIDBCursor {
   static direction_Getter(mthis) native "IDBCursor_direction_Getter";
 
@@ -3485,11 +3761,11 @@
 
   static deleteObjectStore_Callback_DOMString(mthis, name) native "IDBDatabase_deleteObjectStore_Callback_DOMString";
 
-  static transaction_Callback_DOMStringList_DOMString(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_DOMStringList_DOMString";
+  static transaction_Callback_DOMString_DOMString(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_DOMString_DOMString";
 
   static transaction_Callback_SEQ_DOMString_SEQ_DOMString(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_sequence<DOMString>_DOMString";
 
-  static transaction_Callback_DOMString_DOMString(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_DOMString_DOMString";
+  static transaction_Callback_DOMStringList_DOMString(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_DOMStringList_DOMString";
 }
 
 class BlinkIDBFactory {
@@ -3561,10 +3837,10 @@
 
   static count_Callback_ScriptValue(mthis, key) native "IDBObjectStore_count_Callback_ScriptValue";
 
-  static createIndex_Callback_DOMString_SEQ_DOMString_SEQ_Dictionary(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_DOMString_sequence<DOMString>_Dictionary";
-
   static createIndex_Callback_DOMString_DOMString_Dictionary(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_DOMString_DOMString_Dictionary";
 
+  static createIndex_Callback_DOMString_SEQ_DOMString_SEQ_Dictionary(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_DOMString_sequence<DOMString>_Dictionary";
+
   static delete_Callback_ScriptValue(mthis, key) native "IDBObjectStore_delete_Callback_ScriptValue";
 
   static deleteIndex_Callback_DOMString(mthis, name) native "IDBObjectStore_deleteIndex_Callback_DOMString";
@@ -3573,7 +3849,7 @@
 
   static index_Callback_DOMString(mthis, name) native "IDBObjectStore_index_Callback_DOMString";
 
-  static openCursor_Callback_ScriptValue_DOMString(mthis, key, direction) native "IDBObjectStore_openCursor_Callback_ScriptValue_DOMString";
+  static openCursor_Callback_ScriptValue_DOMString(mthis, range, direction) native "IDBObjectStore_openCursor_Callback_ScriptValue_DOMString";
 
   static openKeyCursor_Callback_ScriptValue_DOMString(mthis, range, direction) native "IDBObjectStore_openKeyCursor_Callback_ScriptValue_DOMString";
 
@@ -3623,6 +3899,10 @@
 }
 
 class BlinkImageData {
+  static constructorCallback_ul_ul(data_OR_width, height_OR_width) native "ImageData_constructorCallback_unsigned long_unsigned long";
+
+  static constructorCallback_Uint8ClampedArray_ul_ul(data_OR_width, height_OR_width, height) native "ImageData_constructorCallback_Uint8ClampedArray_unsigned long_unsigned long";
+
   static data_Getter(mthis) native "ImageData_data_Getter";
 
   static height_Getter(mthis) native "ImageData_height_Getter";
@@ -3664,12 +3944,6 @@
   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";
-}
-
 class BlinkKeyboardEvent {
   static altGraphKey_Getter(mthis) native "KeyboardEvent_altGraphKey_Getter";
 
@@ -3741,15 +4015,13 @@
 }
 
 class BlinkMIDIAccess {
+  static sysexEnabled_Getter(mthis) native "MIDIAccess_sysexEnabled_Getter";
+
   static inputs_Callback(mthis) native "MIDIAccess_inputs_Callback";
 
   static outputs_Callback(mthis) native "MIDIAccess_outputs_Callback";
 }
 
-class BlinkMIDIAccessPromise {
-  static then_Callback_MIDISuccessCallback_MIDIErrorCallback(mthis, successCallback, errorCallback) native "MIDIAccessPromise_then_Callback_MIDISuccessCallback_MIDIErrorCallback";
-}
-
 class BlinkMIDIConnectionEvent {
   static port_Getter(mthis) native "MIDIConnectionEvent_port_Getter";
 }
@@ -3822,6 +4094,16 @@
   static unpause_Callback(mthis) native "MediaController_unpause_Callback";
 }
 
+class BlinkMediaDeviceInfo {
+  static deviceId_Getter(mthis) native "MediaDeviceInfo_deviceId_Getter";
+
+  static groupId_Getter(mthis) native "MediaDeviceInfo_groupId_Getter";
+
+  static kind_Getter(mthis) native "MediaDeviceInfo_kind_Getter";
+
+  static label_Getter(mthis) native "MediaDeviceInfo_label_Getter";
+}
+
 class BlinkMediaElementAudioSourceNode {
   static mediaElement_Getter(mthis) native "MediaElementAudioSourceNode_mediaElement_Getter";
 }
@@ -3882,6 +4164,8 @@
   static keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
 
   static createSession_Callback_DOMString_Uint8Array(mthis, type, initData) native "MediaKeys_createSession_Callback_DOMString_Uint8Array";
+
+  static isTypeSupported_Callback_DOMString_DOMString(keySystem, contentType) native "MediaKeys_isTypeSupported_Callback_DOMString_DOMString";
 }
 
 class BlinkMediaList {
@@ -3943,6 +4227,8 @@
 
   static addTrack_Callback_MediaStreamTrack(mthis, track) native "MediaStream_addTrack_Callback_MediaStreamTrack";
 
+  static clone_Callback(mthis) native "MediaStream_clone_Callback";
+
   static getAudioTracks_Callback(mthis) native "MediaStream_getAudioTracks_Callback";
 
   static getTrackById_Callback_DOMString(mthis, trackId) native "MediaStream_getTrackById_Callback_DOMString";
@@ -3979,6 +4265,8 @@
 
   static readyState_Getter(mthis) native "MediaStreamTrack_readyState_Getter";
 
+  static clone_Callback(mthis) native "MediaStreamTrack_clone_Callback";
+
   static getSources_Callback_MediaStreamTrackSourcesCallback(callback) native "MediaStreamTrack_getSources_Callback_MediaStreamTrackSourcesCallback";
 
   static stop_Callback(mthis) native "MediaStreamTrack_stop_Callback";
@@ -4065,6 +4353,10 @@
 
   static metaKey_Getter(mthis) native "MouseEvent_metaKey_Getter";
 
+  static movementX_Getter(mthis) native "MouseEvent_movementX_Getter";
+
+  static movementY_Getter(mthis) native "MouseEvent_movementY_Getter";
+
   static offsetX_Getter(mthis) native "MouseEvent_offsetX_Getter";
 
   static offsetY_Getter(mthis) native "MouseEvent_offsetY_Getter";
@@ -4138,6 +4430,10 @@
   static setNamedItemNS_Callback_Node(mthis, node) native "NamedNodeMap_setNamedItemNS_Callback_Node";
 }
 
+class BlinkNavigatorCPU {
+  static hardwareConcurrency_Getter(mthis) native "NavigatorCPU_hardwareConcurrency_Getter";
+}
+
 class BlinkNavigatorID {
   static appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
 
@@ -4145,6 +4441,8 @@
 
   static appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
 
+  static dartEnabled_Getter(mthis) native "Navigator_dartEnabled_Getter";
+
   static platform_Getter(mthis) native "Navigator_platform_Getter";
 
   static product_Getter(mthis) native "Navigator_product_Getter";
@@ -4152,25 +4450,33 @@
   static userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
 }
 
+class BlinkNavigatorLanguage {
+  static language_Getter(mthis) native "NavigatorLanguage_language_Getter";
+
+  static languages_Getter(mthis) native "NavigatorLanguage_languages_Getter";
+}
+
 class BlinkNavigatorOnLine {
   static onLine_Getter(mthis) native "NavigatorOnLine_onLine_Getter";
 }
 
 class BlinkNavigator {
+  static connection_Getter(mthis) native "Navigator_connection_Getter";
+
   static cookieEnabled_Getter(mthis) native "Navigator_cookieEnabled_Getter";
 
   static doNotTrack_Getter(mthis) native "Navigator_doNotTrack_Getter";
 
   static geolocation_Getter(mthis) native "Navigator_geolocation_Getter";
 
-  static language_Getter(mthis) native "Navigator_language_Getter";
-
   static maxTouchPoints_Getter(mthis) native "Navigator_maxTouchPoints_Getter";
 
   static mimeTypes_Getter(mthis) native "Navigator_mimeTypes_Getter";
 
   static productSub_Getter(mthis) native "Navigator_productSub_Getter";
 
+  static push_Getter(mthis) native "Navigator_push_Getter";
+
   static serviceWorker_Getter(mthis) native "Navigator_serviceWorker_Getter";
 
   static storageQuota_Getter(mthis) native "Navigator_storageQuota_Getter";
@@ -4183,18 +4489,26 @@
 
   static webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
 
+  static getGamepads_Callback(mthis) native "Navigator_getGamepads_Callback";
+
+  static getMediaDevices_Callback_MediaDeviceInfoCallback(mthis, resultCallback) native "Navigator_getMediaDevices_Callback_MediaDeviceInfoCallback";
+
   static getStorageUpdates_Callback(mthis) native "Navigator_getStorageUpdates_Callback";
 
   static isProtocolHandlerRegistered_Callback_DOMString_DOMString(mthis, scheme, url) native "Navigator_isProtocolHandlerRegistered_Callback_DOMString_DOMString";
 
   static registerProtocolHandler_Callback_DOMString_DOMString_DOMString(mthis, scheme, url, title) native "Navigator_registerProtocolHandler_Callback_DOMString_DOMString_DOMString";
 
-  static requestMIDIAccess_Callback_Dictionary(mthis, options) native "Navigator_requestMIDIAccess_Callback_Dictionary";
+  static sendBeacon_Callback_DOMString_DOMString(mthis, url, data) native "Navigator_sendBeacon_Callback_DOMString_DOMString";
+
+  static sendBeacon_Callback_DOMString_ArrayBufferView(mthis, url, data) native "Navigator_sendBeacon_Callback_DOMString_ArrayBufferView";
+
+  static sendBeacon_Callback_DOMString_FormData(mthis, url, data) native "Navigator_sendBeacon_Callback_DOMString_FormData";
+
+  static sendBeacon_Callback_DOMString_Blob(mthis, url, data) native "Navigator_sendBeacon_Callback_DOMString_Blob";
 
   static unregisterProtocolHandler_Callback_DOMString_DOMString(mthis, scheme, url) native "Navigator_unregisterProtocolHandler_Callback_DOMString_DOMString";
 
-  static webkitGetGamepads_Callback(mthis) native "Navigator_webkitGetGamepads_Callback";
-
   static webkitGetUserMedia_Callback_Dictionary_NavigatorUserMediaSuccessCallback_NavigatorUserMediaErrorCallback(mthis, options, successCallback, errorCallback) native "Navigator_webkitGetUserMedia_Callback_Dictionary_NavigatorUserMediaSuccessCallback_NavigatorUserMediaErrorCallback";
 
   static appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
@@ -4203,12 +4517,18 @@
 
   static appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
 
+  static dartEnabled_Getter(mthis) native "Navigator_dartEnabled_Getter";
+
   static platform_Getter(mthis) native "Navigator_platform_Getter";
 
   static product_Getter(mthis) native "Navigator_product_Getter";
 
   static userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
 
+  static language_Getter(mthis) native "Navigator_language_Getter";
+
+  static languages_Getter(mthis) native "Navigator_languages_Getter";
+
   static onLine_Getter(mthis) native "Navigator_onLine_Getter";
 }
 
@@ -4220,6 +4540,10 @@
   static name_Getter(mthis) native "NavigatorUserMediaError_name_Getter";
 }
 
+class BlinkNetworkInformation {
+  static type_Getter(mthis) native "NetworkInformation_type_Getter";
+}
+
 class BlinkNodeFilter {}
 
 class BlinkNodeIterator {
@@ -4268,8 +4592,6 @@
   static requestPermission_Callback_NotificationPermissionCallback(callback) native "Notification_requestPermission_Callback_NotificationPermissionCallback";
 }
 
-class BlinkNotificationCenter {}
-
 class BlinkOESElementIndexUint {}
 
 class BlinkOESStandardDerivatives {}
@@ -4378,12 +4700,16 @@
   static setVelocity_Callback_float_float_float(mthis, x, y, z) native "PannerNode_setVelocity_Callback_float_float_float";
 }
 
-class BlinkPath {
-  static constructorCallback() native "Path_constructorCallback";
+class BlinkPath2D {
+  static constructorCallback() native "Path2D_constructorCallback";
 
-  static constructorCallback_Path2D(path_OR_text) native "Path_constructorCallback_Path2D";
+  static constructorCallback_Path2D(path_OR_text) native "Path2D_constructorCallback_Path2D";
 
-  static constructorCallback_DOMString(path_OR_text) native "Path_constructorCallback_DOMString";
+  static constructorCallback_DOMString(path_OR_text) native "Path2D_constructorCallback_DOMString";
+
+  static addPath_Callback_Path2D_SVGMatrix(mthis, path, transform) native "Path2D_addPath_Callback_Path2D_SVGMatrix";
+
+  static addPath_Callback_Path2D(mthis, path) native "Path2D_addPath_Callback_Path2D";
 
   static arc_Callback_float_float_float_float_float_boolean(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "Path2D_arc_Callback_float_float_float_float_float_boolean";
 
@@ -4393,6 +4719,8 @@
 
   static closePath_Callback(mthis) native "Path2D_closePath_Callback";
 
+  static ellipse_Callback_float_float_float_float_float_float_float_boolean(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "Path2D_ellipse_Callback_float_float_float_float_float_float_float_boolean";
+
   static lineTo_Callback_float_float(mthis, x, y) native "Path2D_lineTo_Callback_float_float";
 
   static moveTo_Callback_float_float(mthis, x, y) native "Path2D_moveTo_Callback_float_float";
@@ -4522,40 +4850,6 @@
 
 class BlinkPeriodicWave {}
 
-class BlinkPlayer {
-  static currentTime_Getter(mthis) native "AnimationPlayer_currentTime_Getter";
-
-  static currentTime_Setter_double(mthis, value) native "AnimationPlayer_currentTime_Setter";
-
-  static finished_Getter(mthis) native "AnimationPlayer_finished_Getter";
-
-  static paused_Getter(mthis) native "AnimationPlayer_paused_Getter";
-
-  static playbackRate_Getter(mthis) native "AnimationPlayer_playbackRate_Getter";
-
-  static playbackRate_Setter_double(mthis, value) native "AnimationPlayer_playbackRate_Setter";
-
-  static source_Getter(mthis) native "AnimationPlayer_source_Getter";
-
-  static source_Setter_TimedItem(mthis, value) native "AnimationPlayer_source_Setter";
-
-  static startTime_Getter(mthis) native "AnimationPlayer_startTime_Getter";
-
-  static startTime_Setter_double(mthis, value) native "AnimationPlayer_startTime_Setter";
-
-  static timeLag_Getter(mthis) native "AnimationPlayer_timeLag_Getter";
-
-  static cancel_Callback(mthis) native "AnimationPlayer_cancel_Callback";
-
-  static finish_Callback(mthis) native "AnimationPlayer_finish_Callback";
-
-  static pause_Callback(mthis) native "AnimationPlayer_pause_Callback";
-
-  static play_Callback(mthis) native "AnimationPlayer_play_Callback";
-
-  static reverse_Callback(mthis) native "AnimationPlayer_reverse_Callback";
-}
-
 class BlinkPlugin {
   static description_Getter(mthis) native "Plugin_description_Getter";
 
@@ -4608,6 +4902,18 @@
   static total_Getter(mthis) native "ProgressEvent_total_Getter";
 }
 
+class BlinkPushEvent {
+  static data_Getter(mthis) native "PushEvent_data_Getter";
+}
+
+class BlinkPushManager {}
+
+class BlinkPushRegistration {
+  static pushEndpoint_Getter(mthis) native "PushRegistration_pushEndpoint_Getter";
+
+  static pushRegistrationId_Getter(mthis) native "PushRegistration_pushRegistrationId_Getter";
+}
+
 class BlinkRGBColor {}
 
 class BlinkRTCDTMFSender {
@@ -4659,13 +4965,13 @@
 
   static close_Callback(mthis) native "RTCDataChannel_close_Callback";
 
-  static send_Callback_ArrayBufferView(mthis, data) native "RTCDataChannel_send_Callback_ArrayBufferView";
-
-  static send_Callback_ArrayBuffer(mthis, data) native "RTCDataChannel_send_Callback_ArrayBuffer";
+  static send_Callback_DOMString(mthis, data) native "RTCDataChannel_send_Callback_DOMString";
 
   static send_Callback_Blob(mthis, data) native "RTCDataChannel_send_Callback_Blob";
 
-  static send_Callback_DOMString(mthis, data) native "RTCDataChannel_send_Callback_DOMString";
+  static send_Callback_ArrayBufferView(mthis, data) native "RTCDataChannel_send_Callback_ArrayBufferView";
+
+  static send_Callback_ArrayBuffer(mthis, data) native "RTCDataChannel_send_Callback_ArrayBuffer";
 }
 
 class BlinkRTCDataChannelEvent {
@@ -4677,9 +4983,15 @@
 
   static candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
 
+  static candidate_Setter_DOMString(mthis, value) native "RTCIceCandidate_candidate_Setter";
+
   static sdpMLineIndex_Getter(mthis) native "RTCIceCandidate_sdpMLineIndex_Getter";
 
+  static sdpMLineIndex_Setter_us(mthis, value) native "RTCIceCandidate_sdpMLineIndex_Setter";
+
   static sdpMid_Getter(mthis) native "RTCIceCandidate_sdpMid_Getter";
+
+  static sdpMid_Setter_DOMString(mthis, value) native "RTCIceCandidate_sdpMid_Setter";
 }
 
 class BlinkRTCIceCandidateEvent {
@@ -4830,10 +5142,36 @@
 
 class BlinkRect {}
 
+class BlinkRequest {
+  static constructorCallback_Dictionary(requestInitDict) native "Request_constructorCallback_Dictionary";
+
+  static headers_Getter(mthis) native "Request_headers_Getter";
+
+  static origin_Getter(mthis) native "Request_origin_Getter";
+
+  static url_Getter(mthis) native "Request_url_Getter";
+
+  static url_Setter_DOMString(mthis, value) native "Request_url_Setter";
+}
+
 class BlinkResourceProgressEvent {
   static url_Getter(mthis) native "ResourceProgressEvent_url_Getter";
 }
 
+class BlinkResponse {
+  static constructorCallback_Blob_Dictionary(body, responseInitDict) native "Response_constructorCallback_Blob_Dictionary";
+}
+
+class BlinkRsaKeyAlgorithm {
+  static modulusLength_Getter(mthis) native "RsaKeyAlgorithm_modulusLength_Getter";
+
+  static publicExponent_Getter(mthis) native "RsaKeyAlgorithm_publicExponent_Getter";
+}
+
+class BlinkRsaHashedKeyAlgorithm {
+  static hash_Getter(mthis) native "RsaHashedKeyAlgorithm_hash_Getter";
+}
+
 class BlinkSQLError {
   static code_Getter(mthis) native "SQLError_code_Getter";
 
@@ -4867,6 +5205,10 @@
 
   static style_Getter(mthis) native "SVGElement_style_Getter";
 
+  static tabIndex_Getter(mthis) native "SVGElement_tabIndex_Getter";
+
+  static tabIndex_Setter_long(mthis, value) native "SVGElement_tabIndex_Setter";
+
   static viewportElement_Getter(mthis) native "SVGElement_viewportElement_Getter";
 
   static xmlbase_Getter(mthis) native "SVGElement_xmlbase_Getter";
@@ -5140,28 +5482,6 @@
 
 class BlinkSVGDiscardElement {}
 
-class BlinkSVGElementInstance {
-  static correspondingElement_Getter(mthis) native "SVGElementInstance_correspondingElement_Getter";
-
-  static correspondingUseElement_Getter(mthis) native "SVGElementInstance_correspondingUseElement_Getter";
-
-  static firstChild_Getter(mthis) native "SVGElementInstance_firstChild_Getter";
-
-  static lastChild_Getter(mthis) native "SVGElementInstance_lastChild_Getter";
-
-  static nextSibling_Getter(mthis) native "SVGElementInstance_nextSibling_Getter";
-
-  static parentNode_Getter(mthis) native "SVGElementInstance_parentNode_Getter";
-
-  static previousSibling_Getter(mthis) native "SVGElementInstance_previousSibling_Getter";
-}
-
-class BlinkSVGElementInstanceList {
-  static length_Getter(mthis) native "SVGElementInstanceList_length_Getter";
-
-  static item_Callback_ul(mthis, index) native "SVGElementInstanceList_item_Callback_unsigned long";
-}
-
 class BlinkSVGEllipseElement {
   static cx_Getter(mthis) native "SVGEllipseElement_cx_Getter";
 
@@ -5647,8 +5967,12 @@
 }
 
 class BlinkSVGLengthList {
+  static length_Getter(mthis) native "SVGLengthList_length_Getter";
+
   static numberOfItems_Getter(mthis) native "SVGLengthList_numberOfItems_Getter";
 
+  static $__setter___Callback_ul_SVGLength(mthis, index, value) native "SVGLengthList___setter___Callback_unsigned long_SVGLength";
+
   static appendItem_Callback_SVGLength(mthis, item) native "SVGLengthList_appendItem_Callback_SVGLength";
 
   static clear_Callback(mthis) native "SVGLengthList_clear_Callback";
@@ -5791,8 +6115,12 @@
 }
 
 class BlinkSVGNumberList {
+  static length_Getter(mthis) native "SVGNumberList_length_Getter";
+
   static numberOfItems_Getter(mthis) native "SVGNumberList_numberOfItems_Getter";
 
+  static $__setter___Callback_ul_SVGNumber(mthis, index, value) native "SVGNumberList___setter___Callback_unsigned long_SVGNumber";
+
   static appendItem_Callback_SVGNumber(mthis, item) native "SVGNumberList_appendItem_Callback_SVGNumber";
 
   static clear_Callback(mthis) native "SVGNumberList_clear_Callback";
@@ -6121,8 +6449,12 @@
 }
 
 class BlinkSVGPathSegList {
+  static length_Getter(mthis) native "SVGPathSegList_length_Getter";
+
   static numberOfItems_Getter(mthis) native "SVGPathSegList_numberOfItems_Getter";
 
+  static $__setter___Callback_ul_SVGPathSeg(mthis, index, value) native "SVGPathSegList___setter___Callback_unsigned long_SVGPathSeg";
+
   static appendItem_Callback_SVGPathSeg(mthis, newItem) native "SVGPathSegList_appendItem_Callback_SVGPathSeg";
 
   static clear_Callback(mthis) native "SVGPathSegList_clear_Callback";
@@ -6201,8 +6533,12 @@
 }
 
 class BlinkSVGPointList {
+  static length_Getter(mthis) native "SVGPointList_length_Getter";
+
   static numberOfItems_Getter(mthis) native "SVGPointList_numberOfItems_Getter";
 
+  static $__setter___Callback_ul_SVGPoint(mthis, index, value) native "SVGPointList___setter___Callback_unsigned long_SVGPoint";
+
   static appendItem_Callback_SVGPoint(mthis, item) native "SVGPointList_appendItem_Callback_SVGPoint";
 
   static clear_Callback(mthis) native "SVGPointList_clear_Callback";
@@ -6393,8 +6729,12 @@
 }
 
 class BlinkSVGStringList {
+  static length_Getter(mthis) native "SVGStringList_length_Getter";
+
   static numberOfItems_Getter(mthis) native "SVGStringList_numberOfItems_Getter";
 
+  static $__setter___Callback_ul_DOMString(mthis, index, value) native "SVGStringList___setter___Callback_unsigned long_DOMString";
+
   static appendItem_Callback_DOMString(mthis, item) native "SVGStringList_appendItem_Callback_DOMString";
 
   static clear_Callback(mthis) native "SVGStringList_clear_Callback";
@@ -6473,8 +6813,12 @@
 }
 
 class BlinkSVGTransformList {
+  static length_Getter(mthis) native "SVGTransformList_length_Getter";
+
   static numberOfItems_Getter(mthis) native "SVGTransformList_numberOfItems_Getter";
 
+  static $__setter___Callback_ul_SVGTransform(mthis, index, value) native "SVGTransformList___setter___Callback_unsigned long_SVGTransform";
+
   static appendItem_Callback_SVGTransform(mthis, item) native "SVGTransformList_appendItem_Callback_SVGTransform";
 
   static clear_Callback(mthis) native "SVGTransformList_clear_Callback";
@@ -6497,26 +6841,14 @@
 class BlinkSVGUnitTypes {}
 
 class BlinkSVGUseElement {
-  static animatedInstanceRoot_Getter(mthis) native "SVGUseElement_animatedInstanceRoot_Getter";
-
   static height_Getter(mthis) native "SVGUseElement_height_Getter";
 
-  static instanceRoot_Getter(mthis) native "SVGUseElement_instanceRoot_Getter";
-
   static width_Getter(mthis) native "SVGUseElement_width_Getter";
 
   static x_Getter(mthis) native "SVGUseElement_x_Getter";
 
   static y_Getter(mthis) native "SVGUseElement_y_Getter";
 
-  static requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
-
-  static requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
-
-  static systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
-
-  static hasExtension_Callback_DOMString(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_DOMString";
-
   static href_Getter(mthis) native "SVGUseElement_href_Getter";
 }
 
@@ -6587,15 +6919,13 @@
 
   static width_Getter(mthis) native "Screen_width_Getter";
 
-  static lockOrientation_Callback_DOMString(mthis, orientation) native "Screen_lockOrientation_Callback_DOMString";
-
   static unlockOrientation_Callback(mthis) native "Screen_unlockOrientation_Callback";
 }
 
 class BlinkScriptProcessorNode {
   static bufferSize_Getter(mthis) native "ScriptProcessorNode_bufferSize_Getter";
 
-  static $_setEventListener_Callback_EventListener(mthis, eventListener) native "ScriptProcessorNode_setEventListener_Callback";
+  static setEventListener_Callback_EventListener(mthis, eventListener) native "ScriptProcessorNode_setEventListener_Callback";
 }
 
 class BlinkSecurityPolicyViolationEvent {
@@ -6645,7 +6975,9 @@
 
   static addRange_Callback_Range(mthis, range) native "Selection_addRange_Callback_Range";
 
-  static collapse_Callback_Node_long(mthis, node, index) native "Selection_collapse_Callback_Node_long";
+  static collapse_Callback_Node_long(mthis, node, offset) native "Selection_collapse_Callback_Node_long";
+
+  static collapse_Callback_Node(mthis, node) native "Selection_collapse_Callback_Node";
 
   static collapseToEnd_Callback(mthis) native "Selection_collapseToEnd_Callback";
 
@@ -6671,14 +7003,30 @@
 
   static setPosition_Callback_Node_long(mthis, node, offset) native "Selection_setPosition_Callback_Node_long";
 
+  static setPosition_Callback_Node(mthis, node) native "Selection_setPosition_Callback_Node";
+
   static toString_Callback(mthis) native "Selection_toString_Callback";
 }
 
 class BlinkServiceWorker {}
 
-class BlinkServiceWorkerContainer {}
+class BlinkServiceWorkerClients {}
 
-class BlinkServiceWorkerGlobalScope {}
+class BlinkServiceWorkerContainer {
+  static active_Getter(mthis) native "ServiceWorkerContainer_active_Getter";
+
+  static controller_Getter(mthis) native "ServiceWorkerContainer_controller_Getter";
+
+  static installing_Getter(mthis) native "ServiceWorkerContainer_installing_Getter";
+
+  static waiting_Getter(mthis) native "ServiceWorkerContainer_waiting_Getter";
+}
+
+class BlinkServiceWorkerGlobalScope {
+  static clients_Getter(mthis) native "ServiceWorkerGlobalScope_clients_Getter";
+
+  static scope_Getter(mthis) native "ServiceWorkerGlobalScope_scope_Getter";
+}
 
 class BlinkShadowRoot {
   static activeElement_Getter(mthis) native "ShadowRoot_activeElement_Getter";
@@ -6691,10 +7039,6 @@
 
   static olderShadowRoot_Getter(mthis) native "ShadowRoot_olderShadowRoot_Getter";
 
-  static resetStyleInheritance_Getter(mthis) native "ShadowRoot_resetStyleInheritance_Getter";
-
-  static resetStyleInheritance_Setter_boolean(mthis, value) native "ShadowRoot_resetStyleInheritance_Setter";
-
   static styleSheets_Getter(mthis) native "ShadowRoot_styleSheets_Getter";
 
   static cloneNode_Callback_boolean(mthis, deep) native "ShadowRoot_cloneNode_Callback_boolean";
@@ -6800,16 +7144,6 @@
   static item_Callback_ul(mthis, index) native "SpeechGrammarList_item_Callback_unsigned long";
 }
 
-class BlinkSpeechInputEvent {}
-
-class BlinkSpeechInputResult {}
-
-class BlinkSpeechInputResultList {
-  static length_Getter(mthis) native "SpeechInputResultList_length_Getter";
-
-  static item_Callback_ul(mthis, index) native "SpeechInputResultList_item_Callback_unsigned long";
-}
-
 class BlinkSpeechRecognition {
   static constructorCallback() native "SpeechRecognition_constructorCallback";
 
@@ -7019,6 +7353,28 @@
 }
 
 class BlinkTextMetrics {
+  static actualBoundingBoxAscent_Getter(mthis) native "TextMetrics_actualBoundingBoxAscent_Getter";
+
+  static actualBoundingBoxDescent_Getter(mthis) native "TextMetrics_actualBoundingBoxDescent_Getter";
+
+  static actualBoundingBoxLeft_Getter(mthis) native "TextMetrics_actualBoundingBoxLeft_Getter";
+
+  static actualBoundingBoxRight_Getter(mthis) native "TextMetrics_actualBoundingBoxRight_Getter";
+
+  static alphabeticBaseline_Getter(mthis) native "TextMetrics_alphabeticBaseline_Getter";
+
+  static emHeightAscent_Getter(mthis) native "TextMetrics_emHeightAscent_Getter";
+
+  static emHeightDescent_Getter(mthis) native "TextMetrics_emHeightDescent_Getter";
+
+  static fontBoundingBoxAscent_Getter(mthis) native "TextMetrics_fontBoundingBoxAscent_Getter";
+
+  static fontBoundingBoxDescent_Getter(mthis) native "TextMetrics_fontBoundingBoxDescent_Getter";
+
+  static hangingBaseline_Getter(mthis) native "TextMetrics_hangingBaseline_Getter";
+
+  static ideographicBaseline_Getter(mthis) native "TextMetrics_ideographicBaseline_Getter";
+
   static width_Getter(mthis) native "TextMetrics_width_Getter";
 }
 
@@ -7094,10 +7450,6 @@
   static start_Callback_ul(mthis, index) native "TimeRanges_start_Callback_unsigned long";
 }
 
-class BlinkTimeline {
-  static play_Callback_TimedItem(mthis, source) native "Timeline_play_Callback_TimedItem";
-}
-
 class BlinkTiming {
   static delay_Getter(mthis) native "Timing_delay_Getter";
 
@@ -7131,6 +7483,8 @@
 
   static playbackRate_Setter_double(mthis, value) native "Timing_playbackRate_Setter";
 
+  static $__getter___Callback_DOMString(mthis, name) native "Timing___getter___Callback_DOMString";
+
   static $__setter___Callback_DOMString_double(mthis, name, duration) native "Timing___setter___Callback_DOMString_double";
 }
 
@@ -7175,7 +7529,7 @@
 
   static touches_Getter(mthis) native "TouchEvent_touches_Getter";
 
-  static initTouchEvent_Callback_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean(mthis, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean";
+  static initTouchEvent_Callback_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean(mthis, touches, targetTouches, changedTouches, type, view, unused1, unused2, unused3, unused4, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean";
 }
 
 class BlinkTouchList {
@@ -7412,6 +7766,30 @@
   static totalVideoFrames_Getter(mthis) native "VideoPlaybackQuality_totalVideoFrames_Getter";
 }
 
+class BlinkVideoTrack {
+  static id_Getter(mthis) native "VideoTrack_id_Getter";
+
+  static kind_Getter(mthis) native "VideoTrack_kind_Getter";
+
+  static label_Getter(mthis) native "VideoTrack_label_Getter";
+
+  static language_Getter(mthis) native "VideoTrack_language_Getter";
+
+  static selected_Getter(mthis) native "VideoTrack_selected_Getter";
+
+  static selected_Setter_boolean(mthis, value) native "VideoTrack_selected_Setter";
+}
+
+class BlinkVideoTrackList {
+  static length_Getter(mthis) native "VideoTrackList_length_Getter";
+
+  static selectedIndex_Getter(mthis) native "VideoTrackList_selectedIndex_Getter";
+
+  static $__getter___Callback_ul(mthis, index) native "VideoTrackList___getter___Callback_unsigned long";
+
+  static getTrackById_Callback_DOMString(mthis, id) native "VideoTrackList_getTrackById_Callback_DOMString";
+}
+
 class BlinkWaveShaperNode {
   static curve_Getter(mthis) native "WaveShaperNode_curve_Getter";
 
@@ -7434,6 +7812,8 @@
 
 class BlinkWebGLCompressedTextureATC {}
 
+class BlinkWebGLCompressedTextureETC1 {}
+
 class BlinkWebGLCompressedTexturePVRTC {}
 
 class BlinkWebGLCompressedTextureS3TC {}
@@ -7480,9 +7860,7 @@
 
 class BlinkWebGLDepthTexture {}
 
-class BlinkWebGLDrawBuffers {
-  static drawBuffersWEBGL_Callback_SEQ_GLenum_SEQ(mthis, buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback_sequence<unsigned long>";
-}
+class BlinkWebGLDrawBuffers {}
 
 class BlinkWebGLFramebuffer {}
 
@@ -7496,7 +7874,311 @@
 
 class BlinkWebGLRenderbuffer {}
 
+class BlinkWebGLRenderingContextBase {
+  static canvas_Getter(mthis) native "WebGLRenderingContextBase_canvas_Getter";
+
+  static drawingBufferHeight_Getter(mthis) native "WebGLRenderingContextBase_drawingBufferHeight_Getter";
+
+  static drawingBufferWidth_Getter(mthis) native "WebGLRenderingContextBase_drawingBufferWidth_Getter";
+
+  static activeTexture_Callback_ul(mthis, texture) native "WebGLRenderingContextBase_activeTexture_Callback_unsigned long";
+
+  static attachShader_Callback_WebGLProgram_WebGLShader(mthis, program, shader) native "WebGLRenderingContextBase_attachShader_Callback_WebGLProgram_WebGLShader";
+
+  static bindAttribLocation_Callback_WebGLProgram_ul_DOMString(mthis, program, index, name) native "WebGLRenderingContextBase_bindAttribLocation_Callback_WebGLProgram_unsigned long_DOMString";
+
+  static bindBuffer_Callback_ul_WebGLBuffer(mthis, target, buffer) native "WebGLRenderingContextBase_bindBuffer_Callback_unsigned long_WebGLBuffer";
+
+  static bindFramebuffer_Callback_ul_WebGLFramebuffer(mthis, target, framebuffer) native "WebGLRenderingContextBase_bindFramebuffer_Callback_unsigned long_WebGLFramebuffer";
+
+  static bindRenderbuffer_Callback_ul_WebGLRenderbuffer(mthis, target, renderbuffer) native "WebGLRenderingContextBase_bindRenderbuffer_Callback_unsigned long_WebGLRenderbuffer";
+
+  static bindTexture_Callback_ul_WebGLTexture(mthis, target, texture) native "WebGLRenderingContextBase_bindTexture_Callback_unsigned long_WebGLTexture";
+
+  static blendColor_Callback_float_float_float_float(mthis, red, green, blue, alpha) native "WebGLRenderingContextBase_blendColor_Callback_float_float_float_float";
+
+  static blendEquation_Callback_ul(mthis, mode) native "WebGLRenderingContextBase_blendEquation_Callback_unsigned long";
+
+  static blendEquationSeparate_Callback_ul_ul(mthis, modeRGB, modeAlpha) native "WebGLRenderingContextBase_blendEquationSeparate_Callback_unsigned long_unsigned long";
+
+  static blendFunc_Callback_ul_ul(mthis, sfactor, dfactor) native "WebGLRenderingContextBase_blendFunc_Callback_unsigned long_unsigned long";
+
+  static blendFuncSeparate_Callback_ul_ul_ul_ul(mthis, srcRGB, dstRGB, srcAlpha, dstAlpha) native "WebGLRenderingContextBase_blendFuncSeparate_Callback_unsigned long_unsigned long_unsigned long_unsigned long";
+
+  static bufferData_Callback_ul_ArrayBuffer_ul(mthis, target, data, usage) native "WebGLRenderingContextBase_bufferData_Callback_unsigned long_ArrayBuffer_unsigned long";
+
+  static bufferData_Callback_ul_ll_ul(mthis, target, data_OR_size, usage) native "WebGLRenderingContextBase_bufferData_Callback_unsigned long_long long_unsigned long";
+
+  static bufferData_Callback_ul_ArrayBufferView_ul(mthis, target, data_OR_size, usage) native "WebGLRenderingContextBase_bufferData_Callback_unsigned long_ArrayBufferView_unsigned long";
+
+  static bufferSubData_Callback_ul_ll_ArrayBuffer(mthis, target, offset, data) native "WebGLRenderingContextBase_bufferSubData_Callback_unsigned long_long long_ArrayBuffer";
+
+  static bufferSubData_Callback_ul_ll_ArrayBufferView(mthis, target, offset, data) native "WebGLRenderingContextBase_bufferSubData_Callback_unsigned long_long long_ArrayBufferView";
+
+  static checkFramebufferStatus_Callback_ul(mthis, target) native "WebGLRenderingContextBase_checkFramebufferStatus_Callback_unsigned long";
+
+  static clear_Callback_ul(mthis, mask) native "WebGLRenderingContextBase_clear_Callback_unsigned long";
+
+  static clearColor_Callback_float_float_float_float(mthis, red, green, blue, alpha) native "WebGLRenderingContextBase_clearColor_Callback_float_float_float_float";
+
+  static clearDepth_Callback_float(mthis, depth) native "WebGLRenderingContextBase_clearDepth_Callback_float";
+
+  static clearStencil_Callback_long(mthis, s) native "WebGLRenderingContextBase_clearStencil_Callback_long";
+
+  static colorMask_Callback_boolean_boolean_boolean_boolean(mthis, red, green, blue, alpha) native "WebGLRenderingContextBase_colorMask_Callback_boolean_boolean_boolean_boolean";
+
+  static compileShader_Callback_WebGLShader(mthis, shader) native "WebGLRenderingContextBase_compileShader_Callback_WebGLShader";
+
+  static compressedTexImage2D_Callback_ul_long_ul_long_long_long_ArrayBufferView(mthis, target, level, internalformat, width, height, border, data) native "WebGLRenderingContextBase_compressedTexImage2D_Callback_unsigned long_long_unsigned long_long_long_long_ArrayBufferView";
+
+  static compressedTexSubImage2D_Callback_ul_long_long_long_long_long_ul_ArrayBufferView(mthis, target, level, xoffset, yoffset, width, height, format, data) native "WebGLRenderingContextBase_compressedTexSubImage2D_Callback_unsigned long_long_long_long_long_long_unsigned long_ArrayBufferView";
+
+  static copyTexImage2D_Callback_ul_long_ul_long_long_long_long_long(mthis, target, level, internalformat, x, y, width, height, border) native "WebGLRenderingContextBase_copyTexImage2D_Callback_unsigned long_long_unsigned long_long_long_long_long_long";
+
+  static copyTexSubImage2D_Callback_ul_long_long_long_long_long_long_long(mthis, target, level, xoffset, yoffset, x, y, width, height) native "WebGLRenderingContextBase_copyTexSubImage2D_Callback_unsigned long_long_long_long_long_long_long_long";
+
+  static createBuffer_Callback(mthis) native "WebGLRenderingContextBase_createBuffer_Callback";
+
+  static createFramebuffer_Callback(mthis) native "WebGLRenderingContextBase_createFramebuffer_Callback";
+
+  static createProgram_Callback(mthis) native "WebGLRenderingContextBase_createProgram_Callback";
+
+  static createRenderbuffer_Callback(mthis) native "WebGLRenderingContextBase_createRenderbuffer_Callback";
+
+  static createShader_Callback_ul(mthis, type) native "WebGLRenderingContextBase_createShader_Callback_unsigned long";
+
+  static createTexture_Callback(mthis) native "WebGLRenderingContextBase_createTexture_Callback";
+
+  static cullFace_Callback_ul(mthis, mode) native "WebGLRenderingContextBase_cullFace_Callback_unsigned long";
+
+  static deleteBuffer_Callback_WebGLBuffer(mthis, buffer) native "WebGLRenderingContextBase_deleteBuffer_Callback_WebGLBuffer";
+
+  static deleteFramebuffer_Callback_WebGLFramebuffer(mthis, framebuffer) native "WebGLRenderingContextBase_deleteFramebuffer_Callback_WebGLFramebuffer";
+
+  static deleteProgram_Callback_WebGLProgram(mthis, program) native "WebGLRenderingContextBase_deleteProgram_Callback_WebGLProgram";
+
+  static deleteRenderbuffer_Callback_WebGLRenderbuffer(mthis, renderbuffer) native "WebGLRenderingContextBase_deleteRenderbuffer_Callback_WebGLRenderbuffer";
+
+  static deleteShader_Callback_WebGLShader(mthis, shader) native "WebGLRenderingContextBase_deleteShader_Callback_WebGLShader";
+
+  static deleteTexture_Callback_WebGLTexture(mthis, texture) native "WebGLRenderingContextBase_deleteTexture_Callback_WebGLTexture";
+
+  static depthFunc_Callback_ul(mthis, func) native "WebGLRenderingContextBase_depthFunc_Callback_unsigned long";
+
+  static depthMask_Callback_boolean(mthis, flag) native "WebGLRenderingContextBase_depthMask_Callback_boolean";
+
+  static depthRange_Callback_float_float(mthis, zNear, zFar) native "WebGLRenderingContextBase_depthRange_Callback_float_float";
+
+  static detachShader_Callback_WebGLProgram_WebGLShader(mthis, program, shader) native "WebGLRenderingContextBase_detachShader_Callback_WebGLProgram_WebGLShader";
+
+  static disable_Callback_ul(mthis, cap) native "WebGLRenderingContextBase_disable_Callback_unsigned long";
+
+  static disableVertexAttribArray_Callback_ul(mthis, index) native "WebGLRenderingContextBase_disableVertexAttribArray_Callback_unsigned long";
+
+  static drawArrays_Callback_ul_long_long(mthis, mode, first, count) native "WebGLRenderingContextBase_drawArrays_Callback_unsigned long_long_long";
+
+  static drawElements_Callback_ul_long_ul_ll(mthis, mode, count, type, offset) native "WebGLRenderingContextBase_drawElements_Callback_unsigned long_long_unsigned long_long long";
+
+  static enable_Callback_ul(mthis, cap) native "WebGLRenderingContextBase_enable_Callback_unsigned long";
+
+  static enableVertexAttribArray_Callback_ul(mthis, index) native "WebGLRenderingContextBase_enableVertexAttribArray_Callback_unsigned long";
+
+  static finish_Callback(mthis) native "WebGLRenderingContextBase_finish_Callback";
+
+  static flush_Callback(mthis) native "WebGLRenderingContextBase_flush_Callback";
+
+  static framebufferRenderbuffer_Callback_ul_ul_ul_WebGLRenderbuffer(mthis, target, attachment, renderbuffertarget, renderbuffer) native "WebGLRenderingContextBase_framebufferRenderbuffer_Callback_unsigned long_unsigned long_unsigned long_WebGLRenderbuffer";
+
+  static framebufferTexture2D_Callback_ul_ul_ul_WebGLTexture_long(mthis, target, attachment, textarget, texture, level) native "WebGLRenderingContextBase_framebufferTexture2D_Callback_unsigned long_unsigned long_unsigned long_WebGLTexture_long";
+
+  static frontFace_Callback_ul(mthis, mode) native "WebGLRenderingContextBase_frontFace_Callback_unsigned long";
+
+  static generateMipmap_Callback_ul(mthis, target) native "WebGLRenderingContextBase_generateMipmap_Callback_unsigned long";
+
+  static getActiveAttrib_Callback_WebGLProgram_ul(mthis, program, index) native "WebGLRenderingContextBase_getActiveAttrib_Callback_WebGLProgram_unsigned long";
+
+  static getActiveUniform_Callback_WebGLProgram_ul(mthis, program, index) native "WebGLRenderingContextBase_getActiveUniform_Callback_WebGLProgram_unsigned long";
+
+  static getAttachedShaders_Callback_WebGLProgram(mthis, program) native "WebGLRenderingContextBase_getAttachedShaders_Callback";
+
+  static getAttribLocation_Callback_WebGLProgram_DOMString(mthis, program, name) native "WebGLRenderingContextBase_getAttribLocation_Callback_WebGLProgram_DOMString";
+
+  static getBufferParameter_Callback_ul_ul(mthis, target, pname) native "WebGLRenderingContextBase_getBufferParameter_Callback";
+
+  static getContextAttributes_Callback(mthis) native "WebGLRenderingContextBase_getContextAttributes_Callback";
+
+  static getError_Callback(mthis) native "WebGLRenderingContextBase_getError_Callback";
+
+  static getExtension_Callback_DOMString(mthis, name) native "WebGLRenderingContextBase_getExtension_Callback";
+
+  static getFramebufferAttachmentParameter_Callback_ul_ul_ul(mthis, target, attachment, pname) native "WebGLRenderingContextBase_getFramebufferAttachmentParameter_Callback";
+
+  static getParameter_Callback_ul(mthis, pname) native "WebGLRenderingContextBase_getParameter_Callback";
+
+  static getProgramInfoLog_Callback_WebGLProgram(mthis, program) native "WebGLRenderingContextBase_getProgramInfoLog_Callback_WebGLProgram";
+
+  static getProgramParameter_Callback_WebGLProgram_ul(mthis, program, pname) native "WebGLRenderingContextBase_getProgramParameter_Callback";
+
+  static getRenderbufferParameter_Callback_ul_ul(mthis, target, pname) native "WebGLRenderingContextBase_getRenderbufferParameter_Callback";
+
+  static getShaderInfoLog_Callback_WebGLShader(mthis, shader) native "WebGLRenderingContextBase_getShaderInfoLog_Callback_WebGLShader";
+
+  static getShaderParameter_Callback_WebGLShader_ul(mthis, shader, pname) native "WebGLRenderingContextBase_getShaderParameter_Callback";
+
+  static getShaderPrecisionFormat_Callback_ul_ul(mthis, shadertype, precisiontype) native "WebGLRenderingContextBase_getShaderPrecisionFormat_Callback_unsigned long_unsigned long";
+
+  static getShaderSource_Callback_WebGLShader(mthis, shader) native "WebGLRenderingContextBase_getShaderSource_Callback_WebGLShader";
+
+  static getSupportedExtensions_Callback(mthis) native "WebGLRenderingContextBase_getSupportedExtensions_Callback";
+
+  static getTexParameter_Callback_ul_ul(mthis, target, pname) native "WebGLRenderingContextBase_getTexParameter_Callback";
+
+  static getUniform_Callback_WebGLProgram_WebGLUniformLocation(mthis, program, location) native "WebGLRenderingContextBase_getUniform_Callback";
+
+  static getUniformLocation_Callback_WebGLProgram_DOMString(mthis, program, name) native "WebGLRenderingContextBase_getUniformLocation_Callback_WebGLProgram_DOMString";
+
+  static getVertexAttrib_Callback_ul_ul(mthis, index, pname) native "WebGLRenderingContextBase_getVertexAttrib_Callback";
+
+  static getVertexAttribOffset_Callback_ul_ul(mthis, index, pname) native "WebGLRenderingContextBase_getVertexAttribOffset_Callback_unsigned long_unsigned long";
+
+  static hint_Callback_ul_ul(mthis, target, mode) native "WebGLRenderingContextBase_hint_Callback_unsigned long_unsigned long";
+
+  static isBuffer_Callback_WebGLBuffer(mthis, buffer) native "WebGLRenderingContextBase_isBuffer_Callback_WebGLBuffer";
+
+  static isContextLost_Callback(mthis) native "WebGLRenderingContextBase_isContextLost_Callback";
+
+  static isEnabled_Callback_ul(mthis, cap) native "WebGLRenderingContextBase_isEnabled_Callback_unsigned long";
+
+  static isFramebuffer_Callback_WebGLFramebuffer(mthis, framebuffer) native "WebGLRenderingContextBase_isFramebuffer_Callback_WebGLFramebuffer";
+
+  static isProgram_Callback_WebGLProgram(mthis, program) native "WebGLRenderingContextBase_isProgram_Callback_WebGLProgram";
+
+  static isRenderbuffer_Callback_WebGLRenderbuffer(mthis, renderbuffer) native "WebGLRenderingContextBase_isRenderbuffer_Callback_WebGLRenderbuffer";
+
+  static isShader_Callback_WebGLShader(mthis, shader) native "WebGLRenderingContextBase_isShader_Callback_WebGLShader";
+
+  static isTexture_Callback_WebGLTexture(mthis, texture) native "WebGLRenderingContextBase_isTexture_Callback_WebGLTexture";
+
+  static lineWidth_Callback_float(mthis, width) native "WebGLRenderingContextBase_lineWidth_Callback_float";
+
+  static linkProgram_Callback_WebGLProgram(mthis, program) native "WebGLRenderingContextBase_linkProgram_Callback_WebGLProgram";
+
+  static pixelStorei_Callback_ul_long(mthis, pname, param) native "WebGLRenderingContextBase_pixelStorei_Callback_unsigned long_long";
+
+  static polygonOffset_Callback_float_float(mthis, factor, units) native "WebGLRenderingContextBase_polygonOffset_Callback_float_float";
+
+  static readPixels_Callback_long_long_long_long_ul_ul_ArrayBufferView(mthis, x, y, width, height, format, type, pixels) native "WebGLRenderingContextBase_readPixels_Callback_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
+
+  static renderbufferStorage_Callback_ul_ul_long_long(mthis, target, internalformat, width, height) native "WebGLRenderingContextBase_renderbufferStorage_Callback_unsigned long_unsigned long_long_long";
+
+  static sampleCoverage_Callback_float_boolean(mthis, value, invert) native "WebGLRenderingContextBase_sampleCoverage_Callback_float_boolean";
+
+  static scissor_Callback_long_long_long_long(mthis, x, y, width, height) native "WebGLRenderingContextBase_scissor_Callback_long_long_long_long";
+
+  static shaderSource_Callback_WebGLShader_DOMString(mthis, shader, string) native "WebGLRenderingContextBase_shaderSource_Callback_WebGLShader_DOMString";
+
+  static stencilFunc_Callback_ul_long_ul(mthis, func, ref, mask) native "WebGLRenderingContextBase_stencilFunc_Callback_unsigned long_long_unsigned long";
+
+  static stencilFuncSeparate_Callback_ul_ul_long_ul(mthis, face, func, ref, mask) native "WebGLRenderingContextBase_stencilFuncSeparate_Callback_unsigned long_unsigned long_long_unsigned long";
+
+  static stencilMask_Callback_ul(mthis, mask) native "WebGLRenderingContextBase_stencilMask_Callback_unsigned long";
+
+  static stencilMaskSeparate_Callback_ul_ul(mthis, face, mask) native "WebGLRenderingContextBase_stencilMaskSeparate_Callback_unsigned long_unsigned long";
+
+  static stencilOp_Callback_ul_ul_ul(mthis, fail, zfail, zpass) native "WebGLRenderingContextBase_stencilOp_Callback_unsigned long_unsigned long_unsigned long";
+
+  static stencilOpSeparate_Callback_ul_ul_ul_ul(mthis, face, fail, zfail, zpass) native "WebGLRenderingContextBase_stencilOpSeparate_Callback_unsigned long_unsigned long_unsigned long_unsigned long";
+
+  static texImage2D_Callback_ul_long_ul_long_long_long_ul_ul_ArrayBufferView(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContextBase_texImage2D_Callback_unsigned long_long_unsigned long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
+
+  static texImage2D_Callback_ul_long_ul_ul_ul_ImageData(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContextBase_texImage2D_Callback_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
+
+  static texImage2D_Callback_ul_long_ul_ul_ul_HTMLImageElement(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContextBase_texImage2D_Callback_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
+
+  static texImage2D_Callback_ul_long_ul_ul_ul_HTMLCanvasElement(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContextBase_texImage2D_Callback_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
+
+  static texImage2D_Callback_ul_long_ul_ul_ul_HTMLVideoElement(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContextBase_texImage2D_Callback_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
+
+  static texParameterf_Callback_ul_ul_float(mthis, target, pname, param) native "WebGLRenderingContextBase_texParameterf_Callback_unsigned long_unsigned long_float";
+
+  static texParameteri_Callback_ul_ul_long(mthis, target, pname, param) native "WebGLRenderingContextBase_texParameteri_Callback_unsigned long_unsigned long_long";
+
+  static texSubImage2D_Callback_ul_long_long_long_long_long_ul_ul_ArrayBufferView(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContextBase_texSubImage2D_Callback_unsigned long_long_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
+
+  static texSubImage2D_Callback_ul_long_long_long_ul_ul_ImageData(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContextBase_texSubImage2D_Callback_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
+
+  static texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLImageElement(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContextBase_texSubImage2D_Callback_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
+
+  static texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLCanvasElement(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContextBase_texSubImage2D_Callback_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
+
+  static texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLVideoElement(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContextBase_texSubImage2D_Callback_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
+
+  static uniform1f_Callback_WebGLUniformLocation_float(mthis, location, x) native "WebGLRenderingContextBase_uniform1f_Callback_WebGLUniformLocation_float";
+
+  static uniform1fv_Callback_WebGLUniformLocation_Float32Array(mthis, location, v) native "WebGLRenderingContextBase_uniform1fv_Callback";
+
+  static uniform1i_Callback_WebGLUniformLocation_long(mthis, location, x) native "WebGLRenderingContextBase_uniform1i_Callback_WebGLUniformLocation_long";
+
+  static uniform1iv_Callback_WebGLUniformLocation_Int32Array(mthis, location, v) native "WebGLRenderingContextBase_uniform1iv_Callback";
+
+  static uniform2f_Callback_WebGLUniformLocation_float_float(mthis, location, x, y) native "WebGLRenderingContextBase_uniform2f_Callback_WebGLUniformLocation_float_float";
+
+  static uniform2fv_Callback_WebGLUniformLocation_Float32Array(mthis, location, v) native "WebGLRenderingContextBase_uniform2fv_Callback";
+
+  static uniform2i_Callback_WebGLUniformLocation_long_long(mthis, location, x, y) native "WebGLRenderingContextBase_uniform2i_Callback_WebGLUniformLocation_long_long";
+
+  static uniform2iv_Callback_WebGLUniformLocation_Int32Array(mthis, location, v) native "WebGLRenderingContextBase_uniform2iv_Callback";
+
+  static uniform3f_Callback_WebGLUniformLocation_float_float_float(mthis, location, x, y, z) native "WebGLRenderingContextBase_uniform3f_Callback_WebGLUniformLocation_float_float_float";
+
+  static uniform3fv_Callback_WebGLUniformLocation_Float32Array(mthis, location, v) native "WebGLRenderingContextBase_uniform3fv_Callback";
+
+  static uniform3i_Callback_WebGLUniformLocation_long_long_long(mthis, location, x, y, z) native "WebGLRenderingContextBase_uniform3i_Callback_WebGLUniformLocation_long_long_long";
+
+  static uniform3iv_Callback_WebGLUniformLocation_Int32Array(mthis, location, v) native "WebGLRenderingContextBase_uniform3iv_Callback";
+
+  static uniform4f_Callback_WebGLUniformLocation_float_float_float_float(mthis, location, x, y, z, w) native "WebGLRenderingContextBase_uniform4f_Callback_WebGLUniformLocation_float_float_float_float";
+
+  static uniform4fv_Callback_WebGLUniformLocation_Float32Array(mthis, location, v) native "WebGLRenderingContextBase_uniform4fv_Callback";
+
+  static uniform4i_Callback_WebGLUniformLocation_long_long_long_long(mthis, location, x, y, z, w) native "WebGLRenderingContextBase_uniform4i_Callback_WebGLUniformLocation_long_long_long_long";
+
+  static uniform4iv_Callback_WebGLUniformLocation_Int32Array(mthis, location, v) native "WebGLRenderingContextBase_uniform4iv_Callback";
+
+  static uniformMatrix2fv_Callback_WebGLUniformLocation_boolean_Float32Array(mthis, location, transpose, array) native "WebGLRenderingContextBase_uniformMatrix2fv_Callback";
+
+  static uniformMatrix3fv_Callback_WebGLUniformLocation_boolean_Float32Array(mthis, location, transpose, array) native "WebGLRenderingContextBase_uniformMatrix3fv_Callback";
+
+  static uniformMatrix4fv_Callback_WebGLUniformLocation_boolean_Float32Array(mthis, location, transpose, array) native "WebGLRenderingContextBase_uniformMatrix4fv_Callback";
+
+  static useProgram_Callback_WebGLProgram(mthis, program) native "WebGLRenderingContextBase_useProgram_Callback_WebGLProgram";
+
+  static validateProgram_Callback_WebGLProgram(mthis, program) native "WebGLRenderingContextBase_validateProgram_Callback_WebGLProgram";
+
+  static vertexAttrib1f_Callback_ul_float(mthis, indx, x) native "WebGLRenderingContextBase_vertexAttrib1f_Callback_unsigned long_float";
+
+  static vertexAttrib1fv_Callback_ul_Float32Array(mthis, indx, values) native "WebGLRenderingContextBase_vertexAttrib1fv_Callback";
+
+  static vertexAttrib2f_Callback_ul_float_float(mthis, indx, x, y) native "WebGLRenderingContextBase_vertexAttrib2f_Callback_unsigned long_float_float";
+
+  static vertexAttrib2fv_Callback_ul_Float32Array(mthis, indx, values) native "WebGLRenderingContextBase_vertexAttrib2fv_Callback";
+
+  static vertexAttrib3f_Callback_ul_float_float_float(mthis, indx, x, y, z) native "WebGLRenderingContextBase_vertexAttrib3f_Callback_unsigned long_float_float_float";
+
+  static vertexAttrib3fv_Callback_ul_Float32Array(mthis, indx, values) native "WebGLRenderingContextBase_vertexAttrib3fv_Callback";
+
+  static vertexAttrib4f_Callback_ul_float_float_float_float(mthis, indx, x, y, z, w) native "WebGLRenderingContextBase_vertexAttrib4f_Callback_unsigned long_float_float_float_float";
+
+  static vertexAttrib4fv_Callback_ul_Float32Array(mthis, indx, values) native "WebGLRenderingContextBase_vertexAttrib4fv_Callback";
+
+  static vertexAttribPointer_Callback_ul_long_ul_boolean_long_ll(mthis, indx, size, type, normalized, stride, offset) native "WebGLRenderingContextBase_vertexAttribPointer_Callback_unsigned long_long_unsigned long_boolean_long_long long";
+
+  static viewport_Callback_long_long_long_long(mthis, x, y, width, height) native "WebGLRenderingContextBase_viewport_Callback_long_long_long_long";
+}
+
 class BlinkWebGLRenderingContext {
+  static canvas_Getter(mthis) native "WebGLRenderingContext_canvas_Getter";
+
   static drawingBufferHeight_Getter(mthis) native "WebGLRenderingContext_drawingBufferHeight_Getter";
 
   static drawingBufferWidth_Getter(mthis) native "WebGLRenderingContext_drawingBufferWidth_Getter";
@@ -7527,10 +8209,10 @@
 
   static bufferData_Callback_ul_ArrayBuffer_ul(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_unsigned long_ArrayBuffer_unsigned long";
 
-  static bufferData_Callback_ul_ArrayBufferView_ul(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_unsigned long_ArrayBufferView_unsigned long";
-
   static bufferData_Callback_ul_ll_ul(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_unsigned long_long long_unsigned long";
 
+  static bufferData_Callback_ul_ArrayBufferView_ul(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_unsigned long_ArrayBufferView_unsigned long";
+
   static bufferSubData_Callback_ul_ll_ArrayBuffer(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_unsigned long_long long_ArrayBuffer";
 
   static bufferSubData_Callback_ul_ll_ArrayBufferView(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_unsigned long_long long_ArrayBufferView";
@@ -7830,12 +8512,6 @@
 
 class BlinkWebKitCSSTransformValue {}
 
-class BlinkWebKitMediaSource {
-  static constructorCallback() native "WebKitMediaSource_constructorCallback";
-}
-
-class BlinkWebKitNotification {}
-
 class BlinkWebKitPoint {
   static constructorCallback_float_float(x, y) native "WebKitPoint_constructorCallback";
 
@@ -7848,19 +8524,13 @@
   static y_Setter_float(mthis, value) native "WebKitPoint_y_Setter";
 }
 
-class BlinkWebKitSourceBuffer {}
-
-class BlinkWebKitSourceBufferList {
-  static item_Callback_ul(mthis, index) native "WebKitSourceBufferList_item_Callback_unsigned long";
-}
-
 class BlinkWebSocket {
   static constructorCallback_DOMString(url) native "WebSocket_constructorCallback_DOMString";
 
-  static constructorCallback_DOMString_SEQ_DOMString_SEQ(url, protocol_OR_protocols) native "WebSocket_constructorCallback_DOMString_sequence<DOMString>";
-
   static constructorCallback_DOMString_DOMString(url, protocol_OR_protocols) native "WebSocket_constructorCallback_DOMString_DOMString";
 
+  static constructorCallback_DOMString_SEQ_DOMString_SEQ(url, protocol_OR_protocols) native "WebSocket_constructorCallback_DOMString_sequence<DOMString>";
+
   static binaryType_Getter(mthis) native "WebSocket_binaryType_Getter";
 
   static binaryType_Setter_DOMString(mthis, value) native "WebSocket_binaryType_Setter";
@@ -7881,13 +8551,13 @@
 
   static close_Callback(mthis) native "WebSocket_close_Callback";
 
-  static send_Callback_ArrayBufferView(mthis, data) native "WebSocket_send_Callback_ArrayBufferView";
-
-  static send_Callback_ArrayBuffer(mthis, data) native "WebSocket_send_Callback_ArrayBuffer";
+  static send_Callback_DOMString(mthis, data) native "WebSocket_send_Callback_DOMString";
 
   static send_Callback_Blob(mthis, data) native "WebSocket_send_Callback_Blob";
 
-  static send_Callback_DOMString(mthis, data) native "WebSocket_send_Callback_DOMString";
+  static send_Callback_ArrayBufferView(mthis, data) native "WebSocket_send_Callback_ArrayBufferView";
+
+  static send_Callback_ArrayBuffer(mthis, data) native "WebSocket_send_Callback_ArrayBuffer";
 }
 
 class BlinkWheelEvent {
@@ -8015,6 +8685,8 @@
 
   static alert_Callback_DOMString(mthis, message) native "Window_alert_Callback_DOMString";
 
+  static alert_Callback(mthis) native "Window_alert_Callback";
+
   static cancelAnimationFrame_Callback_long(mthis, id) native "Window_cancelAnimationFrame_Callback_long";
 
   static close_Callback(mthis) native "Window_close_Callback";
@@ -8092,13 +8764,13 @@
 
 class BlinkWorkerConsole {}
 
-class BlinkWorkerCrypto {}
-
 class BlinkWorkerLocation {}
 
 class BlinkWorkerNavigator {}
 
 class BlinkWorkerPerformance {
+  static memory_Getter(mthis) native "WorkerPerformance_memory_Getter";
+
   static now_Callback(mthis) native "WorkerPerformance_now_Callback";
 }
 
@@ -8119,6 +8791,8 @@
 
   static responseType_Setter_DOMString(mthis, value) native "XMLHttpRequest_responseType_Setter";
 
+  static responseURL_Getter(mthis) native "XMLHttpRequest_responseURL_Getter";
+
   static responseXML_Getter(mthis) native "XMLHttpRequest_responseXML_Getter";
 
   static status_Getter(mthis) native "XMLHttpRequest_status_Getter";
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
index fc8be3b..20d24c3 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
@@ -243,7 +243,7 @@
     builder.add(invoke);
     _invocations.add(invoke);
     _environments.add(builder.environment);
-    builder.current = null;
+    builder._current = null;
     // TODO(kmillikin): Can we set builder.environment to null to make it
     // less likely to mutate it?
   }
@@ -257,6 +257,11 @@
 
   ir.Continuation returnContinuation = new ir.Continuation.retrn();
 
+  List<ir.Parameter> _parameters = <ir.Parameter>[];
+
+  /// A map from variable indexes to their values.
+  Environment environment = new Environment.empty();
+
   // The IR builder maintains a context, which is an expression with a hole in
   // it.  The hole represents the focus where new expressions can be added.
   // The context is implemented by 'root' which is the root of the expression
@@ -281,10 +286,24 @@
   // Visiting a statement returns null; visiting an expression returns the
   // primitive denoting its value.
 
-  ir.Expression root = null;
-  ir.Expression current = null;
+  ir.Expression _root = null;
+  ir.Expression _current = null;
 
-  bool get isOpen => root == null || current != null;
+  bool get isOpen => _root == null || _current != null;
+
+  /// Create a parameter for [parameterElement] and add it to the current
+  /// environment. If [isClosureVariable] marks whether [parameterElement] is
+  /// accessed from an inner function.
+  void createParameter(LocalElement parameterElement,
+                       {bool isClosureVariable: false}) {
+    ir.Parameter parameter = new ir.Parameter(parameterElement);
+    _parameters.add(parameter);
+    if (isClosureVariable) {
+      add(new ir.SetClosureVariable(parameterElement, parameter));
+    } else {
+      environment.extend(parameterElement, parameter);
+    }
+  }
 
   // Plug an expression into the 'hole' in the context being accumulated.  The
   // empty context (just a hole) is represented by root (and current) being
@@ -293,10 +312,10 @@
   // new value of current.
   void add(ir.Expression expr) {
     assert(isOpen);
-    if (root == null) {
-      root = current = expr;
+    if (_root == null) {
+      _root = _current = expr;
     } else {
-      current = current.plug(expr);
+      _current = _current.plug(expr);
     }
   }
 
@@ -316,6 +335,47 @@
     return makeConst(new PrimitiveConstExp(value), value);
   }
 
+  // TODO(johnniwinther): Build constants directly through [ConstExp] when these
+  // are created from analyzer2dart.
+  ir.Node buildPrimConst(PrimitiveConstant constant) {
+    assert(isOpen);
+    ir.Node prim = makePrimConst(constant);
+    add(new ir.LetPrim(prim));
+    return prim;
+  }
+
+  /// Create an integer literal.
+  ir.Constant buildIntegerLiteral(int value) {
+    return buildPrimConst(constantSystem.createInt(value));
+  }
+
+  /// Create an double literal.
+  ir.Constant buildDoubleLiteral(double value) {
+    return buildPrimConst(constantSystem.createDouble(value));
+  }
+
+  /// Create an bool literal.
+  ir.Constant buildBooleanLiteral(bool value) {
+    return buildPrimConst(constantSystem.createBool(value));
+  }
+
+  /// Create an null literal.
+  ir.Constant buildNullLiteral() {
+    return buildPrimConst(constantSystem.createNull());
+  }
+
+  /// Create a string literal.
+  ir.Constant buildStringLiteral(String value) {
+    return buildPrimConst(
+        constantSystem.createString(new ast.DartString.literal(value)));
+  }
+
+  /// Create a get access of [local].
+  ir.Primitive buildGetLocal(Element local) {
+    assert(isOpen);
+    return environment.lookup(local);
+  }
+
   /**
    * Add an explicit `return null` for functions that don't have a return
    * statement on each branch. This includes functions with an empty body,
@@ -326,26 +386,28 @@
     ir.Constant constant = makePrimConst(constantSystem.createNull());
     add(new ir.LetPrim(constant));
     add(new ir.InvokeContinuation(returnContinuation, [constant]));
-    current = null;
+    _current = null;
   }
 
-  /// Create a [ir.FunctionDefinition] for [element] using [root] as the body.
+  /// Create a [ir.FunctionDefinition] for [element] using [_root] as the body.
+  ///
+  /// Parameters must be created before the construction of the body using
+  /// [createParameter].
   ir.FunctionDefinition buildFunctionDefinition(
       FunctionElement element,
-      List<ir.Parameter> parameters,
       List<ConstDeclaration> constants,
       List<ConstExp> defaults) {
     if (!element.isAbstract) {
       ensureReturn();
       return new ir.FunctionDefinition(
-          element, returnContinuation, parameters, root, constants, defaults);
+          element, returnContinuation, _parameters, _root, constants, defaults);
     } else {
-      assert(invariant(element, root == null,
-          message: "Non-empty body for abstract method $element: $root"));
+      assert(invariant(element, _root == null,
+          message: "Non-empty body for abstract method $element: $_root"));
       assert(invariant(element, constants.isEmpty,
           message: "Local constants for abstract method $element: $constants"));
       return new ir.FunctionDefinition.abstract(
-                element, parameters, defaults);
+                element, _parameters, defaults);
     }
   }
 
@@ -358,17 +420,7 @@
         (k) => new ir.InvokeStatic(element, selector, k, arguments));
   }
 
-  // TODO(johnniwinther): Build constants directly through [ConstExp] when these
-  // are created from analyzer2dart.
-  ir.Constant buildIntegerLiteral(int value) {
-    assert(isOpen);
-    ir.Node prim = makePrimConst(constantSystem.createInt(value));
-    add(new ir.LetPrim(prim));
-    return prim;
-  }
-
-
-  /// Creates a return statement `return value;` or `return;` if [value] is
+  /// Create a return statement `return value;` or `return;` if [value] is
   /// null.
   void buildReturn([ir.Primitive value]) {
     // Build(Return(e), C) = C'[InvokeContinuation(return, x)]
@@ -381,7 +433,7 @@
       add(new ir.LetPrim(value));
     }
     add(new ir.InvokeContinuation(returnContinuation, [value]));
-    current = null;
+    _current = null;
   }
 
 }
@@ -394,7 +446,6 @@
 class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive> with IrBuilder {
   final Compiler compiler;
   final SourceFile sourceFile;
-  final List<ir.Parameter> parameters;
 
   // In SSA terms, join-point continuation parameters are the phis and the
   // continuation invocation arguments are the corresponding phi inputs.  To
@@ -414,9 +465,6 @@
   // used to determine if a join-point continuation needs to be passed
   // arguments, and what the arguments are.
 
-  /// A map from variable indexes to their values.
-  Environment environment;
-
   /// A stack of collectors for breaks.
   final List<JumpCollector> breakCollectors;
   /// A stack of collectors for continues.
@@ -431,9 +479,7 @@
 
   /// Construct a top-level visitor.
   IrBuilderVisitor(TreeElements elements, this.compiler, this.sourceFile)
-      : parameters = <ir.Parameter>[],
-        environment = new Environment.empty(),
-        breakCollectors = <JumpCollector>[],
+      : breakCollectors = <JumpCollector>[],
         continueCollectors = <JumpCollector>[],
         localConstants = <ConstDeclaration>[],
         closureLocals = new DetectClosureVariables(elements),
@@ -451,8 +497,6 @@
   IrBuilderVisitor.delimited(IrBuilderVisitor parent)
       : compiler = parent.compiler,
         sourceFile = parent.sourceFile,
-        parameters = <ir.Parameter>[],
-        environment = new Environment.from(parent.environment),
         breakCollectors = parent.breakCollectors,
         continueCollectors = parent.continueCollectors,
         constantBuilder = parent.constantBuilder,
@@ -462,6 +506,7 @@
         super(parent.elements) {
     constantSystem = parent.constantSystem;
     returnContinuation = parent.returnContinuation;
+    environment = new Environment.from(parent.environment);
   }
 
   /// Construct a visitor for a recursive continuation.
@@ -475,8 +520,6 @@
   IrBuilderVisitor.recursive(IrBuilderVisitor parent)
       : compiler = parent.compiler,
         sourceFile = parent.sourceFile,
-        parameters = <ir.Parameter>[],
-        environment = new Environment.empty(),
         breakCollectors = parent.breakCollectors,
         continueCollectors = parent.continueCollectors,
         constantBuilder = parent.constantBuilder,
@@ -486,11 +529,7 @@
         super(parent.elements) {
     constantSystem = parent.constantSystem;
     returnContinuation = parent.returnContinuation;
-    for (Element element in parent.environment.index2variable) {
-      ir.Parameter parameter = new ir.Parameter(element);
-      parameters.add(parameter);
-      environment.extend(element, parameter);
-    }
+    parent.environment.index2variable.forEach(createParameter);
   }
 
   /**
@@ -512,17 +551,12 @@
 
     closureLocals.visit(function);
 
-    root = current = null;
+    _root = _current = null;
 
     FunctionSignature signature = element.functionSignature;
     signature.orderedForEachParameter((ParameterElement parameterElement) {
-      ir.Parameter parameter = new ir.Parameter(parameterElement);
-      parameters.add(parameter);
-      if (isClosureVariable(parameterElement)) {
-        add(new ir.SetClosureVariable(parameterElement, parameter));
-      } else {
-        environment.extend(parameterElement, parameter);
-      }
+      createParameter(parameterElement,
+                      isClosureVariable: isClosureVariable(parameterElement));
     });
 
     List<ConstExp> defaults = new List<ConstExp>();
@@ -535,8 +569,7 @@
     });
 
     visit(function.body);
-    return buildFunctionDefinition(
-        element, parameters, localConstants, defaults);
+    return buildFunctionDefinition(element, localConstants, defaults);
   }
 
   ir.Primitive visit(ast.Node node) => node.accept(this);
@@ -816,7 +849,7 @@
     if (hasBreaks) {
       letJoin = new ir.LetCont(null, branch);
       condBuilder.add(letJoin);
-      condBuilder.current = branch;
+      condBuilder._current = branch;
     } else {
       condBuilder.add(branch);
     }
@@ -824,12 +857,12 @@
     if (hasContinues) {
       // If there are continues in the body, we need a named continue
       // continuation as a join point.
-      continueContinuation = new ir.Continuation(updateBuilder.parameters);
+      continueContinuation = new ir.Continuation(updateBuilder._parameters);
       if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
       invokeFullJoin(continueContinuation, continueCollector);
     }
     ir.Continuation loopContinuation =
-        new ir.Continuation(condBuilder.parameters);
+        new ir.Continuation(condBuilder._parameters);
     if (updateBuilder.isOpen) {
       JumpCollector backEdges = new JumpCollector(null);
       backEdges.addJump(updateBuilder);
@@ -839,25 +872,25 @@
     // Fill in the body and possible continue continuation bodies.  Do this
     // only after it is guaranteed that they are not empty.
     if (hasContinues) {
-      continueContinuation.body = updateBuilder.root;
+      continueContinuation.body = updateBuilder._root;
       bodyContinuation.body =
-          new ir.LetCont(continueContinuation, bodyBuilder.root);
+          new ir.LetCont(continueContinuation, bodyBuilder._root);
     } else {
-      bodyContinuation.body = bodyBuilder.root;
+      bodyContinuation.body = bodyBuilder._root;
     }
 
-    loopContinuation.body = condBuilder.root;
+    loopContinuation.body = condBuilder._root;
     add(new ir.LetCont(loopContinuation,
             new ir.InvokeContinuation(loopContinuation,
                                       environment.index2value)));
     if (hasBreaks) {
-      current = branch;
+      _current = branch;
       environment = condBuilder.environment;
       breakCollector.addJump(this);
       letJoin.continuation = createJoin(environment.length, breakCollector);
-      current = letJoin;
+      _current = letJoin;
     } else {
-      current = condBuilder.current;
+      _current = condBuilder._current;
       environment = condBuilder.environment;
     }
     return null;
@@ -906,20 +939,20 @@
     // case that one of them is null, it must be the only one that is open
     // and thus contains the new hole in the context.  This case is handled
     // after the branch is plugged into the current hole.
-    thenContinuation.body = thenBuilder.root;
-    elseContinuation.body = elseBuilder.root;
+    thenContinuation.body = thenBuilder._root;
+    elseContinuation.body = elseBuilder._root;
 
     add(result);
     if (joinContinuation == null) {
       // At least one subexpression is closed.
       if (thenBuilder.isOpen) {
-        current = (thenBuilder.root == null) ? letThen : thenBuilder.current;
+        _current = (thenBuilder._root == null) ? letThen : thenBuilder._current;
         environment = thenBuilder.environment;
       } else if (elseBuilder.isOpen) {
-        current = (elseBuilder.root == null) ? letElse : elseBuilder.current;
+        _current = (elseBuilder._root == null) ? letElse : elseBuilder._current;
         environment = elseBuilder.environment;
       } else {
-        current = null;
+        _current = null;
       }
     }
     return null;
@@ -983,28 +1016,28 @@
     if (hasBreaks) {
       letJoin = new ir.LetCont(null, branch);
       condBuilder.add(letJoin);
-      condBuilder.current = branch;
+      condBuilder._current = branch;
     } else {
       condBuilder.add(branch);
     }
     ir.Continuation loopContinuation =
-        new ir.Continuation(condBuilder.parameters);
+        new ir.Continuation(condBuilder._parameters);
     if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
     invokeFullJoin(loopContinuation, continueCollector, recursive: true);
-    bodyContinuation.body = bodyBuilder.root;
+    bodyContinuation.body = bodyBuilder._root;
 
-    loopContinuation.body = condBuilder.root;
+    loopContinuation.body = condBuilder._root;
     add(new ir.LetCont(loopContinuation,
             new ir.InvokeContinuation(loopContinuation,
                                       environment.index2value)));
     if (hasBreaks) {
-      current = branch;
+      _current = branch;
       environment = condBuilder.environment;
       breakCollector.addJump(this);
       letJoin.continuation = createJoin(environment.length, breakCollector);
-      current = letJoin;
+      _current = letJoin;
     } else {
-      current = condBuilder.current;
+      _current = condBuilder._current;
       environment = condBuilder.environment;
     }
     return null;
@@ -1098,8 +1131,8 @@
     //     if condition (then, else)
     ir.Continuation thenContinuation = new ir.Continuation([]);
     ir.Continuation elseContinuation = new ir.Continuation([]);
-    thenContinuation.body = thenBuilder.root;
-    elseContinuation.body = elseBuilder.root;
+    thenContinuation.body = thenBuilder._root;
+    elseContinuation.body = elseBuilder._root;
     add(new ir.LetCont(joinContinuation,
             new ir.LetCont(thenContinuation,
                 new ir.LetCont(elseContinuation,
@@ -1310,7 +1343,7 @@
       add(new ir.LetPrim(result));
     } else if (Elements.isLocal(element)) {
       // Reference to local variable
-      result = environment.lookup(element);
+      result = buildGetLocal(element);
     } else if (element == null ||
                Elements.isInstanceField(element) ||
                Elements.isInstanceMethod(element) ||
@@ -1442,8 +1475,8 @@
     ir.Continuation leftFalseContinuation = new ir.Continuation([]);
     ir.Continuation rightTrueContinuation = new ir.Continuation([]);
     ir.Continuation rightFalseContinuation = new ir.Continuation([]);
-    rightTrueContinuation.body = rightTrueBuilder.root;
-    rightFalseContinuation.body = rightFalseBuilder.root;
+    rightTrueContinuation.body = rightTrueBuilder._root;
+    rightFalseContinuation.body = rightFalseBuilder._root;
     // The right subexpression has two continuations.
     rightBuilder.add(
         new ir.LetCont(rightTrueContinuation,
@@ -1455,11 +1488,11 @@
     // either the right subexpression or an invocation of the join-point
     // continuation.
     if (op.source == '&&') {
-      leftTrueContinuation.body = rightBuilder.root;
-      leftFalseContinuation.body = emptyBuilder.root;
+      leftTrueContinuation.body = rightBuilder._root;
+      leftFalseContinuation.body = emptyBuilder._root;
     } else {
-      leftTrueContinuation.body = emptyBuilder.root;
-      leftFalseContinuation.body = rightBuilder.root;
+      leftTrueContinuation.body = emptyBuilder._root;
+      leftFalseContinuation.body = rightBuilder._root;
     }
 
     add(new ir.LetCont(joinContinuation,
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
index ebb7af8..8cf19cc 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
@@ -629,6 +629,9 @@
 
   TypeAnnotation emitType(DartType type) {
     if (type is GenericType) {
+      if (type.treatAsRaw) {
+        return new TypeAnnotation(type.element.name)..dartType = type;
+      }
       return new TypeAnnotation(
           type.element.name,
           type.typeArguments.map(emitType).toList(growable:false))
diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
index 016ce5d..842278c 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
@@ -344,16 +344,19 @@
   final TypeDeclarationElement element;
   final List<DartType> typeArguments;
 
-  GenericType(TypeDeclarationElementX element,
+  GenericType(TypeDeclarationElement element,
               this.typeArguments,
               {bool checkTypeArgumentCount: true})
       : this.element = element {
-    assert(invariant(element,
-        !checkTypeArgumentCount ||
-        element.thisTypeCache == null ||
-        typeArguments.length == element.typeVariables.length,
-        message: () => 'Invalid type argument count on ${element.thisType}. '
-                       'Provided type arguments: $typeArguments.'));
+    assert(invariant(element, () {
+        if (!checkTypeArgumentCount) return true;
+        if (element is TypeDeclarationElementX) {
+          return element.thisTypeCache == null ||
+                 typeArguments.length == element.typeVariables.length;
+        }
+        return true;
+    }, message: () => 'Invalid type argument count on ${element.thisType}. '
+                      'Provided type arguments: $typeArguments.'));
   }
 
   /// Creates a new instance of this type using the provided type arguments.
@@ -436,7 +439,7 @@
 }
 
 class InterfaceType extends GenericType {
-  InterfaceType(BaseClassElementX element,
+  InterfaceType(ClassElement element,
                 [List<DartType> typeArguments = const <DartType>[]])
       : super(element, typeArguments) {
     assert(invariant(element, element.isDeclaration));
@@ -755,11 +758,11 @@
 }
 
 class TypedefType extends GenericType {
-  TypedefType(TypedefElementX element,
+  TypedefType(TypedefElement element,
               [List<DartType> typeArguments = const <DartType>[]])
       : super(element, typeArguments);
 
-  TypedefType.forUserProvidedBadType(TypedefElementX element,
+  TypedefType.forUserProvidedBadType(TypedefElement element,
                                      [List<DartType> typeArguments =
                                          const <DartType>[]])
       : super(element, typeArguments, checkTypeArgumentCount: false);
@@ -790,6 +793,21 @@
   }
 }
 
+/// A typedef which has already been resolved to its alias.
+class ResolvedTypedefType extends TypedefType {
+  FunctionType alias;
+
+  ResolvedTypedefType(TypedefElement element,
+                      List<DartType> typeArguments,
+                      this.alias)
+        : super(element, typeArguments) {
+    assert(invariant(element, alias != null,
+        message: 'Alias must be non-null on $element.'));
+  }
+
+  FunctionType unalias(Compiler compiler) => alias;
+}
+
 /**
  * Special type for the `dynamic` type.
  */
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 41a8312..e7e7ca7 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -305,7 +305,7 @@
       assert(treeElements != null);
 
       for (Element dependency in treeElements.allElements) {
-        if (Elements.isLocal(dependency) && !dependency.isFunction) continue;
+        if (dependency.isLocal && !dependency.isFunction) continue;
         if (dependency.isErroneous) continue;
         if (dependency.isTypeVariable) continue;
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 6c42664..0b6c7f8 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -333,6 +333,10 @@
   /// is declared `static`.
   bool get isStatic;
 
+  /// `true` if this element is local element, that is, a local variable,
+  /// local function or parameter.
+  bool get isLocal;
+
   bool get impliesType;
 
   Token get position;
@@ -443,13 +447,7 @@
   }
 
   static bool isLocal(Element element) {
-    return !Elements.isUnresolved(element)
-            && !element.isInstanceMember
-            && !isStaticOrTopLevelField(element)
-            && !isStaticOrTopLevelFunction(element)
-            && (identical(element.kind, ElementKind.VARIABLE) ||
-                identical(element.kind, ElementKind.PARAMETER) ||
-                identical(element.kind, ElementKind.FUNCTION));
+    return !Elements.isUnresolved(element) && element.isLocal;
   }
 
   static bool isInstanceField(Element element) {
@@ -1050,6 +1048,10 @@
 /// the form `this.x`, are modeled by [InitializingFormalParameter].
 abstract class ParameterElement extends Element
     implements VariableElement, FormalElement, LocalElement {
+  /// Use [functionDeclaration] instead.
+  @deprecated
+  get enclosingElement;
+
   /// The function on which this parameter is declared.
   FunctionElement get functionDeclaration;
 }
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 0a27aee..48cdc49 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -118,6 +118,8 @@
 
   bool get isMixinApplication => false;
 
+  bool get isLocal => false;
+
   // TODO(johnniwinther): This breaks for libraries (for which enclosing
   // elements are null) and is invalid for top level variable declarations for
   // which the enclosing element is a VariableDeclarations and not a compilation
@@ -1229,6 +1231,8 @@
   ExecutableElement get executableContext => enclosingElement;
 
   ExecutableElement get memberContext => executableContext.memberContext;
+
+  bool get isLocal => true;
 }
 
 class FieldElementX extends VariableElementX
@@ -1335,6 +1339,8 @@
   MemberElement get memberContext => executableContext.memberContext;
 
   accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
+
+  bool get isLocal => true;
 }
 
 class LocalParameterElementX extends ParameterElementX
@@ -1364,6 +1370,8 @@
   accept(ElementVisitor visitor) => visitor.visitFieldParameterElement(this);
 
   MemberElement get memberContext => enclosingElement;
+
+  bool get isLocal => false;
 }
 
 
@@ -1639,6 +1647,8 @@
       return node.getBeginToken();
     }
   }
+
+  bool get isLocal => true;
 }
 
 abstract class ConstructorElementX extends FunctionElementX
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
index dd5884b..e5905ff 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
@@ -368,8 +368,8 @@
   }
 
   void visitParameterTypeInformation(ParameterTypeInformation info) {
-    Element element = info.element;
-    if (inferrer.isNativeElement(element.enclosingElement)) {
+    ParameterElement element = info.element;
+    if (inferrer.isNativeElement(element.functionDeclaration)) {
       bailout('Passed to a native method');
     }
     if (!inferrer.compiler.backend
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 4191472..8be465c 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -497,9 +497,9 @@
       // TODO(johnniwinther): Remove once function signatures are fixed.
       SimpleTypeInferrerVisitor visitor = this;
       if (inferrer.hasAlreadyComputedTypeOfParameterDefault(element)) return;
-      if (element.enclosingElement != analyzedElement) {
-        visitor = new SimpleTypeInferrerVisitor(element.enclosingElement,
-            compiler, inferrer);
+      if (element.functionDeclaration != analyzedElement) {
+        visitor = new SimpleTypeInferrerVisitor(
+            element.functionDeclaration, compiler, inferrer);
       }
       T type =
           (defaultValue == null) ? types.nullType : visitor.visit(defaultValue);
@@ -870,7 +870,7 @@
             node, operatorSelector, getterType, operatorArguments);
         handleDynamicSend(node, setterSelector, receiverType,
                           new ArgumentsTypes<T>([newType], null));
-      } else if (Elements.isLocal(element)) {
+      } else if (element.isLocal) {
         LocalElement local = element;
         getterType = locals.use(local);
         newType = handleDynamicSend(
@@ -936,7 +936,7 @@
               node, setterSelector, receiverType, arguments);
         }
       }
-    } else if (Elements.isLocal(element)) {
+    } else if (element.isLocal) {
       locals.update(element, rhsType, node);
     }
     return rhsType;
@@ -1119,7 +1119,7 @@
       return handleStaticSend(node, selector, element, null);
     } else if (Elements.isErroneousElement(element)) {
       return types.dynamicType;
-    } else if (Elements.isLocal(element)) {
+    } else if (element.isLocal) {
       LocalElement local = element;
       assert(locals.use(local) != null);
       return locals.use(local);
@@ -1136,7 +1136,7 @@
     Element element = elements[node];
     Selector selector = elements.getSelector(node);
     if (element != null && element.isFunction) {
-      assert(Elements.isLocal(element));
+      assert(element.isLocal);
       // This only works for function statements. We need a
       // more sophisticated type system with function types to support
       // more.
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 72ae2ba..e740ee1 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -481,6 +481,8 @@
  * the [ElementTypeInformation] factory.
  */
 class ParameterTypeInformation extends ElementTypeInformation {
+  ParameterElement get element => super.element;
+
   ParameterTypeInformation._internal(ParameterElement element,
                                      TypeInformationSystem types)
       : super._internal(types.getInferredTypeOf(element.functionDeclaration),
@@ -517,8 +519,8 @@
     // initializing formals.
     if (element.isInitializingFormal) return null;
 
-    Element enclosing = element.enclosingElement;
-    if ((isTearOffClosureParameter || Elements.isLocal(enclosing)) &&
+    FunctionElement function = element.functionDeclaration;
+    if ((isTearOffClosureParameter || function.isLocal) &&
         disableInferenceForClosures) {
       // Do not infer types for parameters of closures. We do not
       // clear the assignments in case the closure is successfully
@@ -526,16 +528,16 @@
       giveUp(inferrer, clearAssignments: false);
       return safeType(inferrer);
     }
-    if (enclosing.isInstanceMember &&
-        (enclosing.name == Compiler.NO_SUCH_METHOD ||
-        (enclosing.name == Compiler.CALL_OPERATOR_NAME &&
+    if (function.isInstanceMember &&
+        (function.name == Compiler.NO_SUCH_METHOD ||
+        (function.name == Compiler.CALL_OPERATOR_NAME &&
          disableInferenceForClosures))) {
       // Do not infer types for parameters of [noSuchMethod] and
       // [call] instance methods.
       giveUp(inferrer);
       return safeType(inferrer);
     }
-    if (enclosing == inferrer.mainElement) {
+    if (function == inferrer.mainElement) {
       // The implicit call to main is not seen by the inferrer,
       // therefore we explicitly set the type of its parameters as
       // dynamic.
@@ -557,7 +559,7 @@
   bool hasStableType(TypeGraphInferrerEngine inferrer) {
     // The number of assignments of parameters of instance methods is
     // not stable. Therefore such a parameter cannot be stable.
-    if (element.enclosingElement.isInstanceMember) {
+    if (element.functionDeclaration.isInstanceMember) {
       return false;
     }
     return super.hasStableType(inferrer);
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 0eee1af..0861141 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
@@ -588,10 +588,7 @@
           // transition.
           var lazies = init.lazies;
           for (var lazyInit in lazies) {
-             var lazyInitName = lazies[lazyInit];
-             if (hasOwnProperty.call(lazies, lazyInitName)) {
-               this[lazyInitName] = null;
-             }
+             this[lazies[lazyInit]] = null;
           }
 
           // Use the newly created object as prototype. In Chrome,
@@ -603,10 +600,8 @@
 
           // Now, after being a fast map we can set the lazies again.
           for (var lazyInit in lazies) {
-            lazyInitName = lazies[lazyInit];
-            if (hasOwnProperty.call(isolateProperties, lazyInitName)) {
-              this[lazyInitName] = isolateProperties[lazyInitName];
-            }
+            var lazyInitName = lazies[lazyInit];
+            this[lazyInitName] = isolateProperties[lazyInitName];
           }
         }
         Isolate.prototype = oldIsolate.prototype;
@@ -1525,7 +1520,7 @@
         mainBuffer
           .write('${globalsHolder}.${namer.isolateName}$_=$_'
                  '${namer.isolateName}$N'
-                 '${globalsHolder}.init$_=${_}init$N');
+                 '${globalsHolder}.$initName$_=${_}$initName$N');
       }
       mainBuffer.add('init()$N$n');
       // Shorten the code by using [namer.currentIsolate] as temporary.
@@ -1720,90 +1715,16 @@
       computeNeededConstants();
       emitCompileTimeConstants(mainBuffer, mainOutputUnit);
 
-      /// Map from OutputUnit to a hash of its content. The hash uniquely
-      /// identifies the code of the output-unit. It does not include
-      /// boilerplate JS code, like the sourcemap directives or the hash itself.
-      Map<OutputUnit, String> deferredLoadHashes =
-          emitDeferredCode(libraryDescriptorBuffers);
       if (compiler.deferredLoadTask.isProgramSplit) {
-        mainBuffer.write('$initName.isHunkLoaded$_=${_}'
-            'function(hunkHash)$_{${_}'
-              'return !!$deferredInitializers[hunkHash]'
-            '$_}$N'
-            '$initName.initializeLoadedHunk$_=${_}'
-            'function(hunkHash)$_{$_'
-              '$deferredInitializers[hunkHash]($globalsHolder)'
-            '$_}$N');
-        // Write a javascript mapping from Deferred import load ids (derrived
-        // from the import prefix.) to a list of lists of js hunks to load.
-        // TODO(sigurdm): Create a syntax tree for this.
-        // TODO(sigurdm): Also find out where to place it.
-
-        Map<String, List<String>> deferredLibraryUris =
-            new Map<String, List<String>>();
-        Map<String, List<String>> deferredLibraryHashes =
-            new Map<String, List<String>>();
-
-        compiler.deferredLoadTask.hunksToLoad.forEach(
-                      (String loadId, List<OutputUnit>outputUnits) {
-          List<String> uris = new List<String>();
-          List<String> hashes = new List<String>();
-          deferredLibraryHashes[loadId] = new List<String>();
-          for (OutputUnit outputUnit in outputUnits) {
-            uris.add("${outputUnit.partFileName(compiler)}.part.js");
-            hashes.add(deferredLoadHashes[outputUnit]);
-          }
-
-          deferredLibraryUris[loadId] = uris;
-          deferredLibraryHashes[loadId] = hashes;
-        });
-
-        void emitMapping(String name, Map<String, List<String>> mapping) {
-          List<jsAst.Property> properties = new List<jsAst.Property>();
-          mapping.forEach((String key, List<String> values) {
-            properties.add(new jsAst.Property(js.escapedString(key),
-                new jsAst.ArrayInitializer.from(
-                    values.map(js.escapedString))));
-          });
-          jsAst.Node initializer =
-              new jsAst.ObjectInitializer(properties, isOneLiner: true);
-
-          mainBuffer..write("$name$_=$_")
-                    ..write(jsAst.prettyPrint(
-                        initializer,
-                        compiler, monitor: compiler.dumpInfoTask))
-                    ..write(";$n");
-        }
-
-        emitMapping("$initName.deferredLibraryUris", deferredLibraryUris);
-        emitMapping("$initName.deferredLibraryHashes", deferredLibraryHashes);
-
-
-        mainBuffer.write("$initName.librariesToLoad$_=$_{");
-        compiler.deferredLoadTask.hunksToLoad.forEach(
-            (String loadId, List<OutputUnit>outputUnits) {
-          mainBuffer.write('"$loadId":$_[');
-          for (OutputUnit outputUnit in outputUnits) {
-            mainBuffer
-                .write('["${outputUnit.partFileName(compiler)}.part.js",$_'
-                       '"${deferredLoadHashes[outputUnit]}"],$_');
-          }
-          mainBuffer.write("],$_");
-        });
-        mainBuffer.write("}$N");
-        mainBuffer.write("$initName.librariesToLoad$_=$_{");
-        compiler.deferredLoadTask.hunksToLoad.forEach(
-            (String loadId, List<OutputUnit>outputUnits) {
-          mainBuffer.write('"$loadId":$_[');
-          for (OutputUnit outputUnit in outputUnits) {
-            mainBuffer
-                .write('["${outputUnit.partFileName(compiler)}.part.js",$_'
-                       '"${deferredLoadHashes[outputUnit]}"],$_');
-          }
-          mainBuffer.write("],$_");
-        });
-        mainBuffer.write("}$N");
+        /// Map from OutputUnit to a hash of its content. The hash uniquely
+        /// identifies the code of the output-unit. It does not include
+        /// boilerplate JS code, like the sourcemap directives or the hash
+        /// itself.
+        Map<OutputUnit, String> deferredLoadHashes =
+            emitDeferredCode(libraryDescriptorBuffers);
+        emitDeferredBoilerPlate(mainBuffer, deferredLoadHashes);
       }
+
       // Static field initializations require the classes and compile-time
       // constants to be set up.
       emitStaticNonFinalFieldInitializations(mainBuffer);
@@ -1972,6 +1893,70 @@
         compiler.deferredLoadTask.outputUnitForElement(element));
   }
 
+  /// Emits support-code for deferred loading into [buffer].
+  void emitDeferredBoilerPlate(CodeBuffer buffer,
+                               Map<OutputUnit, String> deferredLoadHashes) {
+    // Function for checking if a hunk is loaded given its hash.
+    buffer.write(jsAst.prettyPrint(
+        js('# = function(hunkHash) {'
+           '  return !!$deferredInitializers[hunkHash];'
+           '}', generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_LOADED)),
+        compiler, monitor: compiler.dumpInfoTask));
+    buffer.write('$N');
+    // Function for initializing a loaded hunk, given its hash.
+    buffer.write(jsAst.prettyPrint(
+        js('# = function(hunkHash) {'
+           '  $deferredInitializers[hunkHash]($globalsHolder)'
+           '}',
+           generateEmbeddedGlobalAccess(
+               embeddedNames.INITIALIZE_LOADED_HUNK)),
+        compiler, monitor: compiler.dumpInfoTask));
+    buffer.write('$N');
+    // Write a javascript mapping from Deferred import load ids (derrived
+    // from the import prefix.) to a list of lists of uris of hunks to load,
+    // and a corresponding mapping to a list of hashes used by
+    // INITIALIZE_LOADED_HUNK and IS_HUNK_LOADED.
+    Map<String, List<String>> deferredLibraryUris =
+        new Map<String, List<String>>();
+    Map<String, List<String>> deferredLibraryHashes =
+        new Map<String, List<String>>();
+    compiler.deferredLoadTask.hunksToLoad.forEach(
+                  (String loadId, List<OutputUnit>outputUnits) {
+      List<String> uris = new List<String>();
+      List<String> hashes = new List<String>();
+      deferredLibraryHashes[loadId] = new List<String>();
+      for (OutputUnit outputUnit in outputUnits) {
+        uris.add("${outputUnit.partFileName(compiler)}.part.js");
+        hashes.add(deferredLoadHashes[outputUnit]);
+      }
+
+      deferredLibraryUris[loadId] = uris;
+      deferredLibraryHashes[loadId] = hashes;
+    });
+
+    void emitMapping(String name, Map<String, List<String>> mapping) {
+      List<jsAst.Property> properties = new List<jsAst.Property>();
+      mapping.forEach((String key, List<String> values) {
+        properties.add(new jsAst.Property(js.escapedString(key),
+            new jsAst.ArrayInitializer.from(
+                values.map(js.escapedString))));
+      });
+      jsAst.Node initializer =
+          new jsAst.ObjectInitializer(properties, isOneLiner: true);
+
+      jsAst.Node globalName = generateEmbeddedGlobalAccess(name);
+      buffer.write(jsAst.prettyPrint(
+          js("# = #", [globalName, initializer]),
+          compiler, monitor: compiler.dumpInfoTask));
+      buffer.write('$N');
+
+    }
+
+    emitMapping(embeddedNames.DEFERRED_LIBRARY_URIS, deferredLibraryUris);
+    emitMapping(embeddedNames.DEFERRED_LIBRARY_HASHES,
+                deferredLibraryHashes);
+  }
+
   /// Emits code for all output units except the main.
   /// Returns a mapping from outputUnit to a hash of the corresponding hunk that
   /// can be used for calling the initializer.
@@ -1990,8 +1975,6 @@
       var oldClassesCollector = classesCollector;
       classesCollector = r"$$";
 
-      String hunkName = "${outputUnit.partFileName(compiler)}.part.js";
-
       outputBuffer..write(buildGeneratedBy())
         ..write('${deferredInitializers}.current$_=$_'
                 'function$_(${globalsHolder}) {$N');
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index ef540c5..be7978a 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -48,7 +48,7 @@
  * 'http://example.com/bar.dart', but such URIs cannot necessarily be used for
  * locating source files, since the scheme must be supported by the input
  * provider. The standard input provider for dart2js only supports the 'file'
- * scheme.
+ * and 'http' scheme.
  *
  * ## Resolved URI ##
  *
diff --git a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
index 144d638..ebd6846 100644
--- a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
@@ -38,9 +38,17 @@
   }
 
   Future<List<int>> readUtf8BytesFromUri(Uri resourceUri) {
-    if (resourceUri.scheme != 'file') {
+    if (resourceUri.scheme == 'file') {
+      return _readFromFile(resourceUri);
+    } else if (resourceUri.scheme == 'http' || resourceUri.scheme == 'https') {
+      return _readFromHttp(resourceUri);
+    } else {
       throw new ArgumentError("Unknown scheme in uri '$resourceUri'");
     }
+  }
+
+  Future<List<int>> _readFromFile(Uri resourceUri) {
+    assert(resourceUri.scheme == 'file');
     List<int> source;
     try {
       source = readAll(resourceUri.toFilePath());
@@ -55,6 +63,37 @@
     return new Future.value(source);
   }
 
+  Future<List<int>> _readFromHttp(Uri resourceUri) {
+    assert(resourceUri.scheme == 'http');
+    HttpClient client = new HttpClient();
+    return client.getUrl(resourceUri)
+        .then((HttpClientRequest request) => request.close())
+        .then((HttpClientResponse response) {
+          if (response.statusCode != HttpStatus.OK) {
+            String msg = 'Failure getting $resourceUri: '
+                      '${response.statusCode} ${response.reasonPhrase}';
+            throw msg;
+          }
+          return response.toList();
+        })
+        .then((List<List<int>> splitContent) {
+           int totalLength = splitContent.fold(0, (int old, List list) {
+             return old + list.length;
+           });
+           Uint8List result = new Uint8List(totalLength);
+           int offset = 0;
+           for (List<int> contentPart in splitContent) {
+             result.setRange(
+                 offset, offset + contentPart.length, contentPart);
+             offset += contentPart.length;
+           }
+           dartCharactersRead += totalLength;
+           sourceFiles[resourceUri.toString()] =
+               new CachingUtf8BytesSourceFile(resourceUri.toString(), result);
+           return result;
+         });
+  }
+
   Future/*<List<int> | String>*/ call(Uri resourceUri);
 
   relativizeUri(Uri uri) => relativize(cwd, uri, isWindows);
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index 5a7de69..4d31f05 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -71,6 +71,7 @@
   useElements(null, null, null);
   useIr(null, null, null);
   useCompiler(null);
+  useTypes();
 }
 
 useApi() {
@@ -240,10 +241,18 @@
     ..hasIr(null)
     ..getIr(null);
   builder
-    ..buildIntegerLiteral(null);
+    ..buildIntegerLiteral(null)
+    ..buildDoubleLiteral(null)
+    ..buildBooleanLiteral(null)
+    ..buildNullLiteral()
+    ..buildStringLiteral(null);
 }
 
 useCompiler(dart2jslib.Compiler compiler) {
   compiler.libraryLoader.reset();
   compiler.libraryLoader.lookupLibrary(null);
-}
\ No newline at end of file
+}
+
+useTypes() {
+  new dart_types.ResolvedTypedefType(null, null, null).unalias(null);
+}
diff --git a/sdk/lib/_internal/compiler/js_lib/js_helper.dart b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
index e56c3c8..9f1c892 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
@@ -10,7 +10,11 @@
     INTERCEPTED_NAMES,
     INTERCEPTORS_BY_TAG,
     LEAF_TAGS,
-    METADATA;
+    METADATA,
+    DEFERRED_LIBRARY_URIS,
+    DEFERRED_LIBRARY_HASHES,
+    INITIALIZE_LOADED_HUNK,
+    IS_HUNK_LOADED;
 
 import 'dart:collection';
 import 'dart:_isolate_helper' show
@@ -3257,27 +3261,36 @@
 final Map<String, Future<Null>> _loadingLibraries = <String, Future<Null>>{};
 final Set<String> _loadedLibraries = new Set<String>();
 
+typedef void DeferredLoadCallback();
+
+// Function that will be called every time a new deferred import is loaded.
+DeferredLoadCallback deferredLoadHook;
+
 Future<Null> loadDeferredLibrary(String loadId) {
   // For each loadId there is a list of hunk-uris to load, and a corresponding
   // list of hashes. These are stored in the app-global scope.
-  List<String> uris = JS('JSExtendableArray|Null',
-      'init.deferredLibraryUris[#]', loadId);
-  List<String> hashes = JS('JSExtendableArray|Null',
-      'init.deferredLibraryHashes[#]', loadId);
+  var urisMap = JS_EMBEDDED_GLOBAL('', DEFERRED_LIBRARY_URIS);
+  List<String> uris = JS('JSExtendableArray|Null', '#[#]', urisMap, loadId);
+  var hashesMap = JS_EMBEDDED_GLOBAL('', DEFERRED_LIBRARY_HASHES);
+  List<String> hashes = JS('JSExtendableArray|Null', '#[#]', hashesMap, loadId);
   if (uris == null) return new Future.value(null);
   // The indices into `uris` and `hashes` that we want to load.
   List<int> indices = new List.generate(uris.length, (i) => i);
+  var isHunkLoaded = JS_EMBEDDED_GLOBAL('', IS_HUNK_LOADED);
   return Future.wait(indices
       // Filter away indices for hunks that have already been loaded.
-      .where((int i) => !JS('bool','init.isHunkLoaded(#)', hashes[i]))
+      .where((int i) => !JS('bool','#(#)', isHunkLoaded, hashes[i]))
       // Load the rest.
       .map((int i) => _loadHunk(uris[i]))).then((_) {
     // Now all hunks have been loaded, we call all their initializers
     for (String hash in hashes) {
-      // TODO(floitsch): Replace unsafe access to embedded global.
-      JS('void', 'init.initializeLoadedHunk(#)', hash);
+      var initializer = JS_EMBEDDED_GLOBAL('', INITIALIZE_LOADED_HUNK);
+      JS('void', '#(#)', initializer, hash);
     }
-    _loadedLibraries.add(loadId);
+    bool updated = _loadedLibraries.add(loadId);
+    if (updated && deferredLoadHook != null) {
+      deferredLoadHook();
+    }
   });
 }
 
diff --git a/sdk/lib/_internal/compiler/js_lib/js_mirrors.dart b/sdk/lib/_internal/compiler/js_lib/js_mirrors.dart
index 3ff9789..03fc44a 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_mirrors.dart
@@ -48,7 +48,8 @@
     runtimeTypeToString,
     setRuntimeTypeInfo,
     throwInvalidReflectionError,
-    TypeImpl;
+    TypeImpl,
+    deferredLoadHook;
 
 import 'dart:_interceptors' show
     Interceptor,
@@ -97,8 +98,25 @@
       new JsTypeMirror(const Symbol('dynamic'));
   static final JsTypeMirror _voidType = new JsTypeMirror(const Symbol('void'));
 
-  static final Map<String, List<LibraryMirror>> librariesByName =
-      computeLibrariesByName();
+  static Map<String, List<LibraryMirror>> _librariesByName;
+
+  // Will be set to `true` when we have installed a hook on [deferredLoadHook]
+  // to avoid installing it multiple times.
+  static bool _hasInstalledDeferredLoadHook = false;
+
+  static Map<String, List<LibraryMirror>> get librariesByName {
+    if (_librariesByName == null) {
+      _librariesByName = computeLibrariesByName();
+      if (!_hasInstalledDeferredLoadHook) {
+        _hasInstalledDeferredLoadHook = true;
+        // After a deferred import has been loaded new libraries might have
+        // been created, so in the hook we erase _librariesByName, so it will be
+        // recomputed on the next access.
+        deferredLoadHook = () => _librariesByName = null;
+      }
+    }
+    return _librariesByName;
+  }
 
   Map<Uri, LibraryMirror> get libraries {
     if (_cachedLibraries != null) return _cachedLibraries;
diff --git a/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart b/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart
index ade914d4..e327860 100644
--- a/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart
@@ -26,4 +26,8 @@
 const LAZIES = 'lazies';
 const GET_ISOLATE_TAG = 'getIsolateTag';
 const ISOLATE_TAG = 'isolateTag';
-const CURRENT_SCRIPT = 'currentScript';
\ No newline at end of file
+const CURRENT_SCRIPT = 'currentScript';
+const DEFERRED_LIBRARY_URIS = 'deferredLibraryUris';
+const DEFERRED_LIBRARY_HASHES = 'deferredLibraryHashes';
+const INITIALIZE_LOADED_HUNK = 'initializeLoadedHunk';
+const IS_HUNK_LOADED = 'isHunkLoaded';
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/bin/async_compile.dart b/sdk/lib/_internal/pub/bin/async_compile.dart
index c0d13e64..3230302 100644
--- a/sdk/lib/_internal/pub/bin/async_compile.dart
+++ b/sdk/lib/_internal/pub/bin/async_compile.dart
@@ -95,11 +95,13 @@
   var numCompiled = 0;
 
   // Compile any modified or missing files.
+  var sources = new Set();
   for (var entry in new Directory(sourceDir).listSync(recursive: true)) {
     if (p.extension(entry.path) != ".dart") continue;
 
     numFiles++;
     var relative = p.relative(entry.path, from: sourceDir);
+    sources.add(relative);
 
     var sourceFile = entry as File;
     var destPath = p.join(generatedDir, relative);
@@ -114,16 +116,29 @@
     }
   }
 
+  // Delete any previously compiled files whose source no longer exists.
+  for (var entry in new Directory(generatedDir).listSync(recursive: true)) {
+    if (p.extension(entry.path) != ".dart") continue;
+
+    var relative = p.relative(entry.path, from: generatedDir);
+
+    if (!sources.contains(relative)) {
+      _deleteFile(entry.path);
+      if (verbose) print("Deleted  $relative");
+    }
+  }
+
   // Update the README.
   if (currentCommit != lastCommit) {
     readme = readme.replaceAll(_commitPattern, currentCommit);
     _writeFile(readmePath, readme);
+    if (verbose) print("Updated README.md");
   }
 
-  if (verbose) print("Compiled $numCompiled out of $numFiles files");
-
   if (numCompiled > 0) _generateSnapshot(buildDir);
 
+  if (verbose) print("Compiled $numCompiled out of $numFiles files");
+
   if (hadFailure) exit(1);
 }
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart
index 6ea65f7..fb4ff51 100644
--- a/sdk/lib/_internal/pub/lib/src/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart
@@ -38,7 +38,7 @@
 ///
 /// [compat]: https://gist.github.com/nex3/10942218
 final pubConstraints = {
-  "barback": new VersionConstraint.parse(">=0.13.0 <0.15.1"),
+  "barback": new VersionConstraint.parse(">=0.13.0 <0.15.3"),
   "source_span": new VersionConstraint.parse(">=1.0.0 <2.0.0"),
   "stack_trace": new VersionConstraint.parse(">=0.9.1 <2.0.0")
 };
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 1eab02d..613d94e 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
@@ -257,9 +257,6 @@
           if (result.success) {
             log.message("Precompiled ${_formatExecutable(id)}.");
           } else {
-            // TODO(nweiz): Stop manually deleting this when issue 20504 is
-            // fixed.
-            deleteEntry(snapshotPath);
             throw new ApplicationException(
                 log.yellow("Failed to precompile "
                     "${_formatExecutable(id)}:\n") +
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 18bf853..0420af3 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
@@ -32,7 +32,8 @@
 Future loadAllTransformers(AssetEnvironment environment,
     BarbackServer transformerServer) {
   var transformersNeededByTransformers =
-      computeTransformersNeededByTransformers(environment.graph);
+      computeTransformersNeededByTransformers(environment.graph,
+          packages: environment.packages);
 
   var buffer = new StringBuffer();
   buffer.writeln("Transformer dependencies:");
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
index 6401105..c9cfdaf 100644
--- 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
@@ -11,6 +11,7 @@
 import '../package.dart';
 import '../package_graph.dart';
 import '../utils.dart';
+import 'asset_environment.dart';
 import 'cycle_exception.dart';
 import 'transformer_config.dart';
 import 'transformer_id.dart';
@@ -25,11 +26,16 @@
 /// The returned graph is transitively closed. That is, if there's an edge from
 /// `T1` to `T2` and an edge from `T2` to `T3`, there's also an edge from `T1`
 /// to `T2`.
+///
+/// If [packages] is passed, only transformers in those packages will be
+/// inspected.
 Map<TransformerId, Set<TransformerId>> computeTransformersNeededByTransformers(
-    PackageGraph graph) {
+    PackageGraph graph, {Iterable<String> packages}) {
+  if (packages == null) packages = graph.packages.keys;
+
   var result = {};
   var computer = new _DependencyComputer(graph);
-  for (var packageName in ordered(graph.packages.keys)) {
+  for (var packageName in ordered(packages)) {
     var package = graph.packages[packageName];
     for (var phase in package.pubspec.transformers) {
       for (var config in phase) {
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index 449c482..4f15d8a 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -16,3 +16,4 @@
 
 [ $runtime == vm && $system == windows ]
 test/run/app_can_read_from_stdin_test: Fail # Issue 19448
+test/real_version_test: RuntimeError # Issue 20882
diff --git a/sdk/lib/_internal/pub/test/snapshot/doesnt_load_irrelevant_transformers_test.dart b/sdk/lib/_internal/pub/test/snapshot/doesnt_load_irrelevant_transformers_test.dart
new file mode 100644
index 0000000..b0b412d
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/doesnt_load_irrelevant_transformers_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const BROKEN_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class BrokenTransformer extends Transformer {
+  BrokenTransformer.asPlugin();
+
+  // This file intentionally has a syntax error so that any attempt to load it
+  // will crash.
+""";
+
+main() {
+  initConfig();
+
+  // Regression test for issue 20917.
+  integration("snapshots the transformed version of an executable", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          contents: [
+        d.dir("bin", [
+          d.file("hello.dart", "void main() => print('hello!');")
+        ])
+      ]);
+    });
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": "1.2.3",
+          "barback": "any"
+        },
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("transformer.dart", BROKEN_TRANSFORMER)
+      ])
+    ]).create();
+
+    pubGet(output: contains("Precompiled foo:hello."));
+
+    d.dir(p.join(appPath, '.pub', 'bin'), [
+      d.dir('foo', [d.matcherFile('hello.dart.snapshot', contains('hello!'))])
+    ]).validate();
+
+    var process = pubRun(args: ['foo:hello']);
+    process.stdout.expect("hello!");
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/bin/async_compile.dart b/sdk/lib/_internal/pub_generated/bin/async_compile.dart
index b291ab3..736ba80 100644
--- a/sdk/lib/_internal/pub_generated/bin/async_compile.dart
+++ b/sdk/lib/_internal/pub_generated/bin/async_compile.dart
@@ -52,10 +52,12 @@
   lastCommit = match[0];
   var numFiles = 0;
   var numCompiled = 0;
+  var sources = new Set<String>();
   for (var entry in new Directory(sourceDir).listSync(recursive: true)) {
     if (p.extension(entry.path) != ".dart") continue;
     numFiles++;
     var relative = p.relative(entry.path, from: sourceDir);
+    sources.add(relative);
     var sourceFile = entry as File;
     var destPath = p.join(generatedDir, relative);
     var destFile = new File(destPath);
@@ -68,12 +70,21 @@
       if (verbose) print("Compiled $relative");
     }
   }
+  for (var entry in new Directory(generatedDir).listSync(recursive: true)) {
+    if (p.extension(entry.path) != ".dart") continue;
+    var relative = p.relative(entry.path, from: generatedDir);
+    if (!sources.contains(relative)) {
+      _deleteFile(entry.path);
+      if (verbose) print("Deleted  $relative");
+    }
+  }
   if (currentCommit != lastCommit) {
     readme = readme.replaceAll(_commitPattern, currentCommit);
     _writeFile(readmePath, readme);
+    if (verbose) print("Updated README.md");
   }
-  if (verbose) print("Compiled $numCompiled out of $numFiles files");
   if (numCompiled > 0) _generateSnapshot(buildDir);
+  if (verbose) print("Compiled $numCompiled out of $numFiles files");
   if (hadFailure) exit(1);
 }
 void _compile(String sourcePath, String source, String destPath) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback.dart b/sdk/lib/_internal/pub_generated/lib/src/barback.dart
index 8e1707a..f29e737 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback.dart
@@ -3,7 +3,7 @@
 import 'package:path/path.dart' as p;
 import 'version.dart';
 final pubConstraints = {
-  "barback": new VersionConstraint.parse(">=0.13.0 <0.15.1"),
+  "barback": new VersionConstraint.parse(">=0.13.0 <0.15.3"),
   "source_span": new VersionConstraint.parse(">=1.0.0 <2.0.0"),
   "stack_trace": new VersionConstraint.parse(">=0.9.1 <2.0.0")
 };
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
index 99f15f5..aed7cd1 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
@@ -132,7 +132,6 @@
           if (result.success) {
             log.message("Precompiled ${_formatExecutable(id)}.");
           } else {
-            deleteEntry(snapshotPath);
             throw new ApplicationException(
                 log.yellow("Failed to precompile " "${_formatExecutable(id)}:\n") +
                     result.stderr.join('\n'));
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart
index 94127b0..42ce905 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart
@@ -16,7 +16,9 @@
 Future loadAllTransformers(AssetEnvironment environment,
     BarbackServer transformerServer) {
   var transformersNeededByTransformers =
-      computeTransformersNeededByTransformers(environment.graph);
+      computeTransformersNeededByTransformers(
+          environment.graph,
+          packages: environment.packages);
   var buffer = new StringBuffer();
   buffer.writeln("Transformer dependencies:");
   transformersNeededByTransformers.forEach((id, dependencies) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/transformers_needed_by_transformers.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/transformers_needed_by_transformers.dart
index 1830c9b..071c421 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/transformers_needed_by_transformers.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/transformers_needed_by_transformers.dart
@@ -5,14 +5,17 @@
 import '../package.dart';
 import '../package_graph.dart';
 import '../utils.dart';
+import 'asset_environment.dart';
 import 'cycle_exception.dart';
 import 'transformer_config.dart';
 import 'transformer_id.dart';
 Map<TransformerId, Set<TransformerId>>
-    computeTransformersNeededByTransformers(PackageGraph graph) {
+    computeTransformersNeededByTransformers(PackageGraph graph,
+    {Iterable<String> packages}) {
+  if (packages == null) packages = graph.packages.keys;
   var result = {};
   var computer = new _DependencyComputer(graph);
-  for (var packageName in ordered(graph.packages.keys)) {
+  for (var packageName in ordered(packages)) {
     var package = graph.packages[packageName];
     for (var phase in package.pubspec.transformers) {
       for (var config in phase) {
diff --git a/sdk/lib/_internal/pub_generated/pub.status b/sdk/lib/_internal/pub_generated/pub.status
deleted file mode 100644
index ac7f648..0000000
--- a/sdk/lib/_internal/pub_generated/pub.status
+++ /dev/null
@@ -1,19 +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.
-
-test/dart2js/compiles_generated_file_from_dependency_test: Pass, Slow
-test/serve/web_socket/url_to_asset_id_test: Pass, Slow
-test/transformer/loads_a_diamond_transformer_dependency_graph_test: Pass, Slow
-
-# Pub only runs on the VM, so just rule out all compilers.
-[ $compiler == dart2js || $compiler == dart2dart ]
-*: Skip
-
-# 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
-test/real_version_test: RuntimeError # Issue 20882
diff --git a/sdk/lib/_internal/pub_generated/test/snapshot/doesnt_load_irrelevant_transformers_test.dart b/sdk/lib/_internal/pub_generated/test/snapshot/doesnt_load_irrelevant_transformers_test.dart
new file mode 100644
index 0000000..319882b
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/snapshot/doesnt_load_irrelevant_transformers_test.dart
@@ -0,0 +1,48 @@
+library pub_tests;
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+const BROKEN_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class BrokenTransformer extends Transformer {
+  BrokenTransformer.asPlugin();
+
+  // This file intentionally has a syntax error so that any attempt to load it
+  // will crash.
+""";
+main() {
+  initConfig();
+  integration("snapshots the transformed version of an executable", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve(
+          "foo",
+          "1.2.3",
+          contents: [
+              d.dir("bin", [d.file("hello.dart", "void main() => print('hello!');")])]);
+    });
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": "1.2.3",
+          "barback": "any"
+        },
+        "transformers": ["myapp"]
+      }),
+          d.dir("lib", [d.file("transformer.dart", BROKEN_TRANSFORMER)])]).create();
+    pubGet(output: contains("Precompiled foo:hello."));
+    d.dir(
+        p.join(appPath, '.pub', 'bin'),
+        [
+            d.dir(
+                'foo',
+                [d.matcherFile('hello.dart.snapshot', contains('hello!'))])]).validate();
+    var process = pubRun(args: ['foo:hello']);
+    process.stdout.expect("hello!");
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index dce4606..b58efb4 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -152,17 +152,17 @@
 
 
 @DocsEditable()
-@DomName('Algorithm')
+@DomName('AesKeyAlgorithm')
 @Experimental() // untriaged
-@Native("Algorithm")
-class Algorithm extends Interceptor {
+@Native("AesKeyAlgorithm")
+class AesKeyAlgorithm extends KeyAlgorithm {
   // To suppress missing implicit constructor warnings.
-  factory Algorithm._() { throw new UnsupportedError("Not supported"); }
+  factory AesKeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Algorithm.name')
+  @DomName('AesKeyAlgorithm.length')
   @DocsEditable()
   @Experimental() // untriaged
-  final String name;
+  final int length;
 }
 // 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
@@ -198,6 +198,11 @@
   @DocsEditable()
   String hreflang;
 
+  @DomName('HTMLAnchorElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
   String rel;
@@ -273,27 +278,40 @@
 @DomName('Animation')
 @Experimental() // untriaged
 @Native("Animation")
-class Animation extends TimedItem {
+class Animation extends AnimationNode {
   // To suppress missing implicit constructor warnings.
   factory Animation._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('Animation.Animation')
   @DocsEditable()
   factory Animation(Element target, List<Map> keyframes, [timingInput]) {
-    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return Animation._create_1(target, keyframes, timingInput);
+    if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
+      return Animation._create_1(target, keyframes);
     }
     if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
       return Animation._create_2(target, keyframes, timingInput);
     }
-    if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
-      return Animation._create_3(target, keyframes);
+    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
+      return Animation._create_3(target, keyframes, timingInput);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static Animation _create_1(target, keyframes, timingInput) => JS('Animation', 'new Animation(#,#,#)', target, keyframes, timingInput);
+  static Animation _create_1(target, keyframes) => JS('Animation', 'new Animation(#,#)', target, keyframes);
   static Animation _create_2(target, keyframes, timingInput) => JS('Animation', 'new Animation(#,#,#)', target, keyframes, timingInput);
-  static Animation _create_3(target, keyframes) => JS('Animation', 'new Animation(#,#)', target, keyframes);
+  static Animation _create_3(target, keyframes, timingInput) => JS('Animation', 'new Animation(#,#,#)', target, keyframes, timingInput);
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('AnimationEffect')
+@Experimental() // untriaged
+@Native("AnimationEffect")
+class AnimationEffect extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationEffect._() { throw new UnsupportedError("Not supported"); }
 }
 // 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
@@ -324,6 +342,178 @@
 
 
 @DocsEditable()
+@DomName('AnimationNode')
+@Experimental() // untriaged
+@Native("AnimationNode")
+class AnimationNode extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationNode._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationNode.activeDuration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double activeDuration;
+
+  @DomName('AnimationNode.currentIteration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int currentIteration;
+
+  @DomName('AnimationNode.duration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double duration;
+
+  @DomName('AnimationNode.endTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double endTime;
+
+  @DomName('AnimationNode.localTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double localTime;
+
+  @DomName('AnimationNode.player')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AnimationPlayer player;
+
+  @DomName('AnimationNode.startTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double startTime;
+
+  @DomName('AnimationNode.timing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Timing timing;
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('AnimationPlayer')
+@Experimental() // untriaged
+@Native("AnimationPlayer")
+class AnimationPlayer extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationPlayer._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationPlayer.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num currentTime;
+
+  @DomName('AnimationPlayer.finished')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool finished;
+
+  @DomName('AnimationPlayer.paused')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool paused;
+
+  @DomName('AnimationPlayer.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num playbackRate;
+
+  @DomName('AnimationPlayer.source')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimationNode source;
+
+  @DomName('AnimationPlayer.startTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num startTime;
+
+  @DomName('AnimationPlayer.timeLag')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double timeLag;
+
+  @DomName('AnimationPlayer.cancel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cancel() native;
+
+  @DomName('AnimationPlayer.finish')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void finish() native;
+
+  @DomName('AnimationPlayer.pause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void pause() native;
+
+  @DomName('AnimationPlayer.play')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void play() native;
+
+  @DomName('AnimationPlayer.reverse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void reverse() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('AnimationPlayerEvent')
+@Experimental() // untriaged
+@Native("AnimationPlayerEvent")
+class AnimationPlayerEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationPlayerEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationPlayerEvent.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double currentTime;
+
+  @DomName('AnimationPlayerEvent.timelineTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double timelineTime;
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('AnimationTimeline')
+@Experimental() // untriaged
+@Native("AnimationTimeline")
+class AnimationTimeline extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationTimeline._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationTimeline.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double currentTime;
+
+  @DomName('AnimationTimeline.play')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimationPlayer play(AnimationNode source) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 /**
  * ApplicationCache is accessed via [Window.applicationCache].
  */
@@ -508,6 +698,39 @@
 
 
 @DocsEditable()
+@DomName('ApplicationCacheErrorEvent')
+@Experimental() // untriaged
+@Native("ApplicationCacheErrorEvent")
+class ApplicationCacheErrorEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory ApplicationCacheErrorEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ApplicationCacheErrorEvent.message')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String message;
+
+  @DomName('ApplicationCacheErrorEvent.reason')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String reason;
+
+  @DomName('ApplicationCacheErrorEvent.status')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int status;
+
+  @DomName('ApplicationCacheErrorEvent.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String 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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 /**
  * DOM Area Element, which links regions of an image map with a hyperlink.
  *
@@ -639,6 +862,82 @@
 
 
 @DocsEditable()
+@DomName('AudioTrack')
+@Experimental() // untriaged
+@Native("AudioTrack")
+class AudioTrack extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory AudioTrack._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AudioTrack.enabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool enabled;
+
+  @DomName('AudioTrack.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String id;
+
+  @DomName('AudioTrack.kind')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String kind;
+
+  @DomName('AudioTrack.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String label;
+
+  @DomName('AudioTrack.language')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String language;
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('AudioTrackList')
+@Experimental() // untriaged
+@Native("AudioTrackList")
+class AudioTrackList extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory AudioTrackList._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AudioTrackList.changeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+
+  @DomName('AudioTrackList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+
+  @DomName('AudioTrackList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioTrack __getter__(int index) native;
+
+  @DomName('AudioTrackList.getTrackById')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioTrack getTrackById(String id) native;
+
+  @DomName('AudioTrackList.onchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onChange => changeEvent.forTarget(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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('AutocompleteErrorEvent')
 // http://wiki.whatwg.org/wiki/RequestAutocomplete
 @Experimental()
@@ -727,12 +1026,29 @@
 
 
 @DocsEditable()
-@DomName('BeforeLoadEvent')
-@Experimental()
-@Native("BeforeLoadEvent")
-class BeforeLoadEvent extends Event {
+@DomName('BatteryManager')
+// https://dvcs.w3.org/hg/dap/raw-file/default/battery/Overview.html#batterymanager-interface
+@Experimental() // stable
+@Native("BatteryManager")
+class BatteryManager extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory BeforeLoadEvent._() { throw new UnsupportedError("Not supported"); }
+  factory BatteryManager._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('BatteryManager.charging')
+  @DocsEditable()
+  final bool charging;
+
+  @DomName('BatteryManager.chargingTime')
+  @DocsEditable()
+  final double chargingTime;
+
+  @DomName('BatteryManager.dischargingTime')
+  @DocsEditable()
+  final double dischargingTime;
+
+  @DomName('BatteryManager.level')
+  @DocsEditable()
+  final double level;
 }
 // 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
@@ -772,6 +1088,11 @@
   @DocsEditable()
   final String type;
 
+  @DomName('Blob.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() native;
+
   @DomName('Blob.slice')
   @DocsEditable()
   Blob slice([int start, int end, String contentType]) native;
@@ -1131,6 +1452,11 @@
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
   bool alpha;
+
+  @DomName('Canvas2DContextAttributes.storage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String storage;
 }
 // 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
@@ -1190,7 +1516,7 @@
 
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
-  CanvasRenderingContext getContext(String contextId, [Map attrs]) {
+  Object getContext(String contextId, [Map attrs]) {
     if (attrs != null) {
       var attrs_1 = convertDartToNative_Dictionary(attrs);
       return _getContext_1(contextId, attrs_1);
@@ -1200,11 +1526,11 @@
   @JSName('getContext')
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
-  CanvasRenderingContext _getContext_1(contextId, attrs) native;
+  Object _getContext_1(contextId, attrs) native;
   @JSName('getContext')
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
-  CanvasRenderingContext _getContext_2(contextId) native;
+  Object _getContext_2(contextId) native;
 
   @JSName('toDataURL')
   @DomName('HTMLCanvasElement.toDataURL')
@@ -1398,35 +1724,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-@DocsEditable()
-/**
- * A rendering context for a canvas element.
- *
- * This context is extended by [CanvasRenderingContext2D] and
- * [WebGLRenderingContext].
- */
-@DomName('CanvasRenderingContext')
-@Native("CanvasRenderingContext")
-class CanvasRenderingContext extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory CanvasRenderingContext._() { throw new UnsupportedError("Not supported"); }
-
-  /// Reference to the canvas element to which this context belongs.
-  @DomName('CanvasRenderingContext.canvas')
-  @DocsEditable()
-  final CanvasElement canvas;
+abstract class CanvasRenderingContext {
+  CanvasElement get canvas;
 }
-// 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.
-
 
 @DomName('CanvasRenderingContext2D')
 @Native("CanvasRenderingContext2D")
-class CanvasRenderingContext2D extends CanvasRenderingContext {
+class CanvasRenderingContext2D extends Interceptor implements CanvasRenderingContext {
   // To suppress missing implicit constructor warnings.
   factory CanvasRenderingContext2D._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('CanvasRenderingContext2D.canvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CanvasElement canvas;
+
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1511,34 +1823,17 @@
   @DocsEditable()
   String textBaseline;
 
-  @JSName('arc')
-  @DomName('CanvasRenderingContext2D.arc')
-  @DocsEditable()
-  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native;
-
-  @DomName('CanvasRenderingContext2D.arcTo')
-  @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) native;
-
   @DomName('CanvasRenderingContext2D.beginPath')
   @DocsEditable()
   void beginPath() native;
 
-  @DomName('CanvasRenderingContext2D.bezierCurveTo')
-  @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native;
-
   @DomName('CanvasRenderingContext2D.clearRect')
   @DocsEditable()
   void clearRect(num x, num y, num width, num height) native;
 
   @DomName('CanvasRenderingContext2D.clip')
   @DocsEditable()
-  void clip([String winding]) native;
-
-  @DomName('CanvasRenderingContext2D.closePath')
-  @DocsEditable()
-  void closePath() native;
+  void clip([path_OR_winding, String winding]) native;
 
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
@@ -1571,7 +1866,7 @@
 
   @DomName('CanvasRenderingContext2D.createPattern')
   @DocsEditable()
-  CanvasPattern createPattern(CanvasElement canvas, String repetitionType) native;
+  CanvasPattern createPattern(canvas_OR_image, String repetitionType) native;
 
   @JSName('createPattern')
   @DomName('CanvasRenderingContext2D.createPattern')
@@ -1582,15 +1877,10 @@
   @DocsEditable()
   CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native;
 
-  @DomName('CanvasRenderingContext2D.drawCustomFocusRing')
+  @DomName('CanvasRenderingContext2D.drawFocusIfNeeded')
   @DocsEditable()
   @Experimental() // untriaged
-  bool drawCustomFocusRing(Element element) native;
-
-  @DomName('CanvasRenderingContext2D.ellipse')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) native;
+  void drawFocusIfNeeded(element_OR_path, [Element element]) native;
 
   @DomName('CanvasRenderingContext2D.fillRect')
   @DocsEditable()
@@ -1619,26 +1909,23 @@
   @DocsEditable()
   List<num> _getLineDash() native;
 
+  @DomName('CanvasRenderingContext2D.isContextLost')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isContextLost() native;
+
   @DomName('CanvasRenderingContext2D.isPointInPath')
   @DocsEditable()
-  bool isPointInPath(num x, num y, [String winding]) native;
+  bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding]) native;
 
   @DomName('CanvasRenderingContext2D.isPointInStroke')
   @DocsEditable()
-  bool isPointInStroke(num x, num y) native;
-
-  @DomName('CanvasRenderingContext2D.lineTo')
-  @DocsEditable()
-  void lineTo(num x, num y) native;
+  bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) native;
 
   @DomName('CanvasRenderingContext2D.measureText')
   @DocsEditable()
   TextMetrics measureText(String text) native;
 
-  @DomName('CanvasRenderingContext2D.moveTo')
-  @DocsEditable()
-  void moveTo(num x, num y) native;
-
   @DomName('CanvasRenderingContext2D.putImageData')
   @DocsEditable()
   void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
@@ -1663,14 +1950,6 @@
   @DocsEditable()
   void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native;
 
-  @DomName('CanvasRenderingContext2D.quadraticCurveTo')
-  @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
-
-  @DomName('CanvasRenderingContext2D.rect')
-  @DocsEditable()
-  void rect(num x, num y, num width, num height) native;
-
   @DomName('CanvasRenderingContext2D.resetTransform')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1690,15 +1969,20 @@
 
   @DomName('CanvasRenderingContext2D.scale')
   @DocsEditable()
-  void scale(num sx, num sy) native;
+  void scale(num x, num y) native;
+
+  @DomName('CanvasRenderingContext2D.scrollPathIntoView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void scrollPathIntoView([Path2D path]) native;
 
   @DomName('CanvasRenderingContext2D.setTransform')
   @DocsEditable()
-  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native;
+  void setTransform(num a, num b, num c, num d, num e, num f) native;
 
   @DomName('CanvasRenderingContext2D.stroke')
   @DocsEditable()
-  void stroke() native;
+  void stroke([Path2D path]) native;
 
   @DomName('CanvasRenderingContext2D.strokeRect')
   @DocsEditable()
@@ -1710,11 +1994,51 @@
 
   @DomName('CanvasRenderingContext2D.transform')
   @DocsEditable()
-  void transform(num m11, num m12, num m21, num m22, num dx, num dy) native;
+  void transform(num a, num b, num c, num d, num e, num f) native;
 
   @DomName('CanvasRenderingContext2D.translate')
   @DocsEditable()
-  void translate(num tx, num ty) native;
+  void translate(num x, num y) native;
+
+  // From CanvasPathMethods
+
+  @JSName('arc')
+  @DomName('CanvasRenderingContext2D.arc')
+  @DocsEditable()
+  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native;
+
+  @DomName('CanvasRenderingContext2D.arcTo')
+  @DocsEditable()
+  void arcTo(num x1, num y1, num x2, num y2, num radius) native;
+
+  @DomName('CanvasRenderingContext2D.bezierCurveTo')
+  @DocsEditable()
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native;
+
+  @DomName('CanvasRenderingContext2D.closePath')
+  @DocsEditable()
+  void closePath() native;
+
+  @DomName('CanvasRenderingContext2D.ellipse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) native;
+
+  @DomName('CanvasRenderingContext2D.lineTo')
+  @DocsEditable()
+  void lineTo(num x, num y) native;
+
+  @DomName('CanvasRenderingContext2D.moveTo')
+  @DocsEditable()
+  void moveTo(num x, num y) native;
+
+  @DomName('CanvasRenderingContext2D.quadraticCurveTo')
+  @DocsEditable()
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
+
+  @DomName('CanvasRenderingContext2D.rect')
+  @DocsEditable()
+  void rect(num x, num y, num width, num height) native;
 
 
   /**
@@ -1756,7 +2080,9 @@
   @DomName('CanvasRenderingContext2D.arc')
   void arc(num x,  num y,  num radius,  num startAngle, num endAngle,
       [bool anticlockwise = false]) {
-    _arc(x, y, radius, startAngle, endAngle, anticlockwise);
+    // TODO(terry): This should not be needed: dartbug.com/20939.
+    JS('void', '#.arc(#, #, #, #, #, #)', this, x, y, radius, startAngle,
+       endAngle, anticlockwise);
   }
 
   /**
@@ -2082,6 +2408,29 @@
 
 
 @DocsEditable()
+@DomName('Client')
+@Experimental() // untriaged
+@Native("Client")
+class Client extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Client._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Client.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int id;
+
+  @DomName('Client.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> messagePorts]) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('CloseEvent')
 @Native("CloseEvent")
 class CloseEvent extends Event {
@@ -2317,10 +2666,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('content');
 
-  @DomName('HTMLContentElement.resetStyleInheritance')
-  @DocsEditable()
-  bool resetStyleInheritance;
-
   @DomName('HTMLContentElement.select')
   @DocsEditable()
   String select;
@@ -2417,7 +2762,7 @@
   @DomName('Key.algorithm')
   @DocsEditable()
   @Experimental() // untriaged
-  final Algorithm algorithm;
+  final KeyAlgorithm algorithm;
 
   @DomName('Key.extractable')
   @DocsEditable()
@@ -2870,6 +3215,11 @@
   @DocsEditable()
   final CssRule parentRule;
 
+  @DomName('CSSStyleDeclaration.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object __getter__(String name) native;
+
   @DomName('CSSStyleDeclaration.__setter__')
   @DocsEditable()
   void __setter__(String propertyName, String propertyValue) native;
@@ -6246,64 +6596,58 @@
 
 
 @DocsEditable()
-@DomName('Clipboard')
-@Native("Clipboard,DataTransfer")
+@DomName('DataTransfer')
+@Experimental() // untriaged
+@Native("DataTransfer")
 class DataTransfer extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory DataTransfer._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Clipboard.dropEffect')
+  @DomName('DataTransfer.dropEffect')
   @DocsEditable()
+  @Experimental() // untriaged
   String dropEffect;
 
-  @DomName('Clipboard.effectAllowed')
+  @DomName('DataTransfer.effectAllowed')
   @DocsEditable()
+  @Experimental() // untriaged
   String effectAllowed;
 
-  @DomName('Clipboard.files')
+  @DomName('DataTransfer.files')
   @DocsEditable()
+  @Experimental() // untriaged
   @Returns('FileList')
   @Creates('FileList')
   final List<File> files;
 
-  @DomName('Clipboard.items')
+  @DomName('DataTransfer.items')
   @DocsEditable()
+  @Experimental() // untriaged
   final DataTransferItemList items;
 
-  @DomName('Clipboard.types')
+  @DomName('DataTransfer.types')
   @DocsEditable()
+  @Experimental() // untriaged
   final List<String> types;
 
-  @DomName('Clipboard.clearData')
+  @DomName('DataTransfer.clearData')
   @DocsEditable()
+  @Experimental() // untriaged
   void clearData([String type]) native;
 
-  /**
-   * Gets the data for the specified type.
-   *
-   * The data is only available from within a drop operation (such as an
-   * [Element.onDrop] event) and will return null before the event is
-   * triggered.
-   *
-   * Data transfer is prohibited across domains. If a drag originates
-   * from content from another domain or protocol (HTTP vs HTTPS) then the
-   * data cannot be accessed.
-   *
-   * The [type] can have values such as:
-   *
-   * * `'Text'`
-   * * `'URL'`
-   */
-  @DomName('Clipboard.getData')
+  @DomName('DataTransfer.getData')
   @DocsEditable()
+  @Experimental() // untriaged
   String getData(String type) native;
 
-  @DomName('Clipboard.setData')
+  @DomName('DataTransfer.setData')
   @DocsEditable()
+  @Experimental() // untriaged
   bool setData(String type, String data) native;
 
-  @DomName('Clipboard.setDragImage')
+  @DomName('DataTransfer.setDragImage')
   @DocsEditable()
+  @Experimental() // untriaged
   void setDragImage(Element image, int x, int y) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6573,6 +6917,24 @@
 
 
 @DocsEditable()
+@DomName('DeviceLightEvent')
+@Experimental() // untriaged
+@Native("DeviceLightEvent")
+class DeviceLightEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory DeviceLightEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('DeviceLightEvent.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double value;
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('DeviceMotionEvent')
 // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
 @Experimental()
@@ -7048,6 +7410,11 @@
   @DocsEditable()
   HtmlElement _body;
 
+  @DomName('Document.contentType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String contentType;
+
   @DomName('Document.cookie')
   @DocsEditable()
   String cookie;
@@ -7103,6 +7470,11 @@
   @DocsEditable()
   final String _lastModified;
 
+  @DomName('Document.pointerLockElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element pointerLockElement;
+
   @JSName('preferredStylesheetSet')
   @DomName('Document.preferredStylesheetSet')
   @DocsEditable()
@@ -7137,7 +7509,7 @@
   @DomName('Document.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  final Timeline timeline;
+  final AnimationTimeline timeline;
 
   @JSName('title')
   @DomName('Document.title')
@@ -7221,7 +7593,7 @@
   @JSName('createEvent')
   @DomName('Document.createEvent')
   @DocsEditable()
-  Event _createEvent([String eventType]) native;
+  Event _createEvent(String eventType) native;
 
   @DomName('Document.createRange')
   @DocsEditable()
@@ -7236,7 +7608,7 @@
   @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) {
+  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num webkitRadiusX, num webkitRadiusY, num webkitRotationAngle, num webkitForce) {
     var target_1 = _convertDartToNative_EventTarget(target);
     return _createTouch_1(window, target_1, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
   }
@@ -7247,6 +7619,13 @@
   @Experimental()
   Touch _createTouch_1(Window window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native;
 
+  @JSName('createTouchList')
+  @DomName('Document.createTouchList')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  TouchList _createTouchList(Touch touches) native;
+
   @JSName('elementFromPoint')
   @DomName('Document.elementFromPoint')
   @DocsEditable()
@@ -7256,12 +7635,17 @@
   @DocsEditable()
   bool execCommand(String command, bool userInterface, String value) native;
 
+  @DomName('Document.exitPointerLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void exitPointerLock() native;
+
   @JSName('getCSSCanvasContext')
   @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) native;
+  Object _getCssCanvasContext(String contextId, String name, int width, int height) native;
 
   @DomName('Document.getElementById')
   @DocsEditable()
@@ -7309,34 +7693,6 @@
   @DocsEditable()
   String queryCommandValue(String command) native;
 
-  /**
-   * Finds the first descendant element of this document that matches the
-   * specified group of selectors.
-   *
-   * Unless your webpage contains multiple documents, the top-level
-   * [querySelector]
-   * method behaves the same as this method, so you should use it instead to
-   * save typing a few characters.
-   *
-   * [selectors] should be a string using CSS selector syntax.
-   *
-   *     var element1 = document.querySelector('.className');
-   *     var element2 = document.querySelector('#id');
-   *
-   * For details about CSS selector syntax, see the
-   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
-   */
-  @DomName('Document.querySelector')
-  @DocsEditable()
-  Element querySelector(String selectors) native;
-
-  @JSName('querySelectorAll')
-  @DomName('Document.querySelectorAll')
-  @DocsEditable()
-  @Returns('NodeList')
-  @Creates('NodeList')
-  List<Node> _querySelectorAll(String selectors) native;
-
   @JSName('webkitExitFullscreen')
   @DomName('Document.webkitExitFullscreen')
   @DocsEditable()
@@ -7379,6 +7735,34 @@
   @DocsEditable()
   final Element _lastElementChild;
 
+  /**
+   * Finds the first descendant element of this document that matches the
+   * specified group of selectors.
+   *
+   * Unless your webpage contains multiple documents, the top-level
+   * [querySelector]
+   * method behaves the same as this method, so you should use it instead to
+   * save typing a few characters.
+   *
+   * [selectors] should be a string using CSS selector syntax.
+   *
+   *     var element1 = document.querySelector('.className');
+   *     var element2 = document.querySelector('#id');
+   *
+   * For details about CSS selector syntax, see the
+   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+   */
+  @DomName('Document.querySelector')
+  @DocsEditable()
+  Element querySelector(String selectors) native;
+
+  @JSName('querySelectorAll')
+  @DomName('Document.querySelectorAll')
+  @DocsEditable()
+  @Returns('NodeList')
+  @Creates('NodeList')
+  List<Node> _querySelectorAll(String selectors) native;
+
   /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
   @DocsEditable()
@@ -7404,6 +7788,16 @@
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  @DomName('Document.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onCanPlay => Element.canPlayEvent.forTarget(this);
+
+  @DomName('Document.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onCanPlayThrough => Element.canPlayThroughEvent.forTarget(this);
+
   /// Stream of `change` events handled by this [Document].
   @DomName('Document.onchange')
   @DocsEditable()
@@ -7469,6 +7863,21 @@
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  @DomName('Document.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onDurationChange => Element.durationChangeEvent.forTarget(this);
+
+  @DomName('Document.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEmptied => Element.emptiedEvent.forTarget(this);
+
+  @DomName('Document.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEnded => Element.endedEvent.forTarget(this);
+
   /// Stream of `error` events handled by this [Document].
   @DomName('Document.onerror')
   @DocsEditable()
@@ -7509,6 +7918,16 @@
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  @DomName('Document.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onLoadedData => Element.loadedDataEvent.forTarget(this);
+
+  @DomName('Document.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onLoadedMetadata => Element.loadedMetadataEvent.forTarget(this);
+
   /// Stream of `mousedown` events handled by this [Document].
   @DomName('Document.onmousedown')
   @DocsEditable()
@@ -7556,6 +7975,26 @@
   @DocsEditable()
   Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
 
+  @DomName('Document.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPause => Element.pauseEvent.forTarget(this);
+
+  @DomName('Document.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPlay => Element.playEvent.forTarget(this);
+
+  @DomName('Document.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPlaying => Element.playingEvent.forTarget(this);
+
+  @DomName('Document.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onRateChange => Element.rateChangeEvent.forTarget(this);
+
   /// Stream of `readystatechange` events handled by this [Document].
   @DomName('Document.onreadystatechange')
   @DocsEditable()
@@ -7590,6 +8029,16 @@
   @Experimental()
   Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation => securityPolicyViolationEvent.forTarget(this);
 
+  @DomName('Document.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSeeked => Element.seekedEvent.forTarget(this);
+
+  @DomName('Document.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSeeking => Element.seekingEvent.forTarget(this);
+
   /// Stream of `select` events handled by this [Document].
   @DomName('Document.onselect')
   @DocsEditable()
@@ -7605,11 +8054,26 @@
   @DocsEditable()
   Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
 
+  @DomName('Document.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onStalled => Element.stalledEvent.forTarget(this);
+
   /// Stream of `submit` events handled by this [Document].
   @DomName('Document.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  @DomName('Document.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSuspend => Element.suspendEvent.forTarget(this);
+
+  @DomName('Document.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onTimeUpdate => Element.timeUpdateEvent.forTarget(this);
+
   /// Stream of `touchcancel` events handled by this [Document].
   @DomName('Document.ontouchcancel')
   @DocsEditable()
@@ -7638,6 +8102,16 @@
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  @DomName('Document.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onVolumeChange => Element.volumeChangeEvent.forTarget(this);
+
+  @DomName('Document.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onWaiting => Element.waitingEvent.forTarget(this);
+
   /// Stream of `fullscreenchange` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenchange')
   @DocsEditable()
@@ -7853,6 +8327,28 @@
   // To suppress missing implicit constructor warnings.
   factory DocumentFragment._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('DocumentFragment.getElementById')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element getElementById(String elementId) native;
+
+  // From ParentNode
+
+  @JSName('childElementCount')
+  @DomName('DocumentFragment.childElementCount')
+  @DocsEditable()
+  final int _childElementCount;
+
+  @JSName('firstElementChild')
+  @DomName('DocumentFragment.firstElementChild')
+  @DocsEditable()
+  final Element _firstElementChild;
+
+  @JSName('lastElementChild')
+  @DomName('DocumentFragment.lastElementChild')
+  @DocsEditable()
+  final Element _lastElementChild;
+
   /**
    * Finds the first descendant element of this document fragment that matches
    * the specified group of selectors.
@@ -7876,23 +8372,6 @@
   @Creates('NodeList')
   List<Node> _querySelectorAll(String selectors) native;
 
-  // From ParentNode
-
-  @JSName('childElementCount')
-  @DomName('DocumentFragment.childElementCount')
-  @DocsEditable()
-  final int _childElementCount;
-
-  @JSName('firstElementChild')
-  @DomName('DocumentFragment.firstElementChild')
-  @DocsEditable()
-  final Element _firstElementChild;
-
-  @JSName('lastElementChild')
-  @DomName('DocumentFragment.lastElementChild')
-  @DocsEditable()
-  final Element _lastElementChild;
-
 }
 // 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
@@ -7906,6 +8385,17 @@
   // To suppress missing implicit constructor warnings.
   factory DomError._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('DOMError.DOMError')
+  @DocsEditable()
+  factory DomError(String name, [String message]) {
+    if (message != null) {
+      return DomError._create_1(name, message);
+    }
+    return DomError._create_2(name);
+  }
+  static DomError _create_1(name, message) => JS('DomError', 'new DOMError(#,#)', name, message);
+  static DomError _create_2(name) => JS('DomError', 'new DOMError(#)', name);
+
   @DomName('DOMError.message')
   @DocsEditable()
   @Experimental() // untriaged
@@ -8142,6 +8632,11 @@
   @DocsEditable()
   final int length;
 
+  @DomName('DOMTokenList.add')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void add(String tokens) native;
+
   @DomName('DOMTokenList.contains')
   @DocsEditable()
   bool contains(String token) native;
@@ -8150,6 +8645,11 @@
   @DocsEditable()
   String item(int index) native;
 
+  @DomName('DOMTokenList.remove')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void remove(String tokens) native;
+
   @DomName('DOMTokenList.toString')
   @DocsEditable()
   String toString() native;
@@ -8435,6 +8935,16 @@
   @DocsEditable()
   ElementStream<Event> get onBlur;
 
+  @DomName('Element.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlay;
+
+  @DomName('Element.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlayThrough;
+
   /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
@@ -8594,6 +9104,21 @@
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop;
 
+  @DomName('Element.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onDurationChange;
+
+  @DomName('Element.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEmptied;
+
+  @DomName('Element.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEnded;
+
   /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
@@ -8634,6 +9159,16 @@
   @DocsEditable()
   ElementStream<Event> get onLoad;
 
+  @DomName('Element.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedData;
+
+  @DomName('Element.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedMetadata;
+
   /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
@@ -8683,6 +9218,26 @@
   @DocsEditable()
   ElementStream<Event> get onPaste;
 
+  @DomName('Element.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPause;
+
+  @DomName('Element.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlay;
+
+  @DomName('Element.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlaying;
+
+  @DomName('Element.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onRateChange;
+
   /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
@@ -8705,6 +9260,16 @@
   @Experimental()
   ElementStream<Event> get onSearch;
 
+  @DomName('Element.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeked;
+
+  @DomName('Element.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeking;
+
   /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
@@ -8716,11 +9281,26 @@
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart;
 
+  @DomName('Element.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onStalled;
+
   /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit;
 
+  @DomName('Element.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSuspend;
+
+  @DomName('Element.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onTimeUpdate;
+
   /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
@@ -8772,6 +9352,16 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd;
 
+  @DomName('Element.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onVolumeChange;
+
+  @DomName('Element.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onWaiting;
+
   /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
@@ -8873,6 +9463,16 @@
   @DocsEditable()
   ElementStream<Event> get onBlur => Element.blurEvent._forElementList(this);
 
+  @DomName('Element.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlay => Element.canPlayEvent._forElementList(this);
+
+  @DomName('Element.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlayThrough => Element.canPlayThroughEvent._forElementList(this);
+
   /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
@@ -9032,6 +9632,21 @@
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => Element.dropEvent._forElementList(this);
 
+  @DomName('Element.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onDurationChange => Element.durationChangeEvent._forElementList(this);
+
+  @DomName('Element.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEmptied => Element.emptiedEvent._forElementList(this);
+
+  @DomName('Element.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEnded => Element.endedEvent._forElementList(this);
+
   /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
@@ -9072,6 +9687,16 @@
   @DocsEditable()
   ElementStream<Event> get onLoad => Element.loadEvent._forElementList(this);
 
+  @DomName('Element.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedData => Element.loadedDataEvent._forElementList(this);
+
+  @DomName('Element.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedMetadata => Element.loadedMetadataEvent._forElementList(this);
+
   /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
@@ -9121,6 +9746,26 @@
   @DocsEditable()
   ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
 
+  @DomName('Element.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPause => Element.pauseEvent._forElementList(this);
+
+  @DomName('Element.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlay => Element.playEvent._forElementList(this);
+
+  @DomName('Element.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlaying => Element.playingEvent._forElementList(this);
+
+  @DomName('Element.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onRateChange => Element.rateChangeEvent._forElementList(this);
+
   /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
@@ -9143,6 +9788,16 @@
   @Experimental()
   ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
 
+  @DomName('Element.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeked => Element.seekedEvent._forElementList(this);
+
+  @DomName('Element.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeking => Element.seekingEvent._forElementList(this);
+
   /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
@@ -9154,11 +9809,26 @@
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
 
+  @DomName('Element.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onStalled => Element.stalledEvent._forElementList(this);
+
   /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => Element.submitEvent._forElementList(this);
 
+  @DomName('Element.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSuspend => Element.suspendEvent._forElementList(this);
+
+  @DomName('Element.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onTimeUpdate => Element.timeUpdateEvent._forElementList(this);
+
   /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
@@ -9210,6 +9880,16 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent._forElementList(this);
 
+  @DomName('Element.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onVolumeChange => Element.volumeChangeEvent._forElementList(this);
+
+  @DomName('Element.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onWaiting => Element.waitingEvent._forElementList(this);
+
   /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
@@ -10346,6 +11026,16 @@
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  @DomName('Element.canplayEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
+
+  @DomName('Element.canplaythroughEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
+
   /**
    * Static factory designed to expose `change` events to event
    * handlers that are not necessarily instances of [Element].
@@ -10534,6 +11224,21 @@
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  @DomName('Element.durationchangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
+
+  @DomName('Element.emptiedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
+
+  @DomName('Element.endedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+
   /**
    * Static factory designed to expose `error` events to event
    * handlers that are not necessarily instances of [Element].
@@ -10614,6 +11319,16 @@
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  @DomName('Element.loadeddataEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
+
+  @DomName('Element.loadedmetadataEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
+
   /**
    * Static factory designed to expose `mousedown` events to event
    * handlers that are not necessarily instances of [Element].
@@ -10696,6 +11411,26 @@
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  @DomName('Element.pauseEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
+
+  @DomName('Element.playEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
+
+  @DomName('Element.playingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
+
+  @DomName('Element.ratechangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
+
   /**
    * Static factory designed to expose `reset` events to event
    * handlers that are not necessarily instances of [Element].
@@ -10733,6 +11468,16 @@
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  @DomName('Element.seekedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
+
+  @DomName('Element.seekingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
+
   /**
    * Static factory designed to expose `select` events to event
    * handlers that are not necessarily instances of [Element].
@@ -10754,6 +11499,11 @@
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  @DomName('Element.stalledEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
+
   /**
    * Static factory designed to expose `submit` events to event
    * handlers that are not necessarily instances of [Element].
@@ -10764,6 +11514,16 @@
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  @DomName('Element.suspendEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
+
+  @DomName('Element.timeupdateEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
+
   /**
    * Static factory designed to expose `touchcancel` events to event
    * handlers that are not necessarily instances of [Element].
@@ -10836,6 +11596,16 @@
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
 
+  @DomName('Element.volumechangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
+
+  @DomName('Element.waitingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
+
   /**
    * Static factory designed to expose `fullscreenchange` events to event
    * handlers that are not necessarily instances of [Element].
@@ -11071,34 +11841,7 @@
   @DomName('Element.animate')
   @DocsEditable()
   @Experimental() // untriaged
-  Animation animate(List<Map> keyframes, [timingInput]) {
-    if ((timingInput is Map || timingInput == null)) {
-      var timingInput_1 = convertDartToNative_Dictionary(timingInput);
-      return _animate_1(keyframes, timingInput_1);
-    }
-    if ((timingInput is num || timingInput == null)) {
-      return _animate_2(keyframes, timingInput);
-    }
-    if (timingInput == null) {
-      return _animate_3(keyframes);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-  @JSName('animate')
-  @DomName('Element.animate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Animation _animate_1(List<Map> keyframes, timingInput) native;
-  @JSName('animate')
-  @DomName('Element.animate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Animation _animate_2(List<Map> keyframes, num timingInput) native;
-  @JSName('animate')
-  @DomName('Element.animate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Animation _animate_3(List<Map> keyframes) native;
+  AnimationPlayer animate(Object effect, [Object timing]) native;
 
   @DomName('Element.blur')
   @DocsEditable()
@@ -11205,33 +11948,6 @@
   @DocsEditable()
   bool _hasAttributeNS(String namespaceURI, String localName) native;
 
-  /**
-   * Finds the first descendant element of this element that matches the
-   * specified group of selectors.
-   *
-   * [selectors] should be a string using CSS selector syntax.
-   *
-   *     // Gets the first descendant with the class 'classname'
-   *     var element = element.querySelector('.className');
-   *     // Gets the element with id 'id'
-   *     var element = element.querySelector('#id');
-   *     // Gets the first descendant [ImageElement]
-   *     var img = element.querySelector('img');
-   *
-   * For details about CSS selector syntax, see the
-   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
-   */
-  @DomName('Element.querySelector')
-  @DocsEditable()
-  Element querySelector(String selectors) native;
-
-  @JSName('querySelectorAll')
-  @DomName('Element.querySelectorAll')
-  @DocsEditable()
-  @Returns('NodeList')
-  @Creates('NodeList')
-  List<Node> _querySelectorAll(String selectors) native;
-
   @JSName('removeAttribute')
   @DomName('Element.removeAttribute')
   @DocsEditable()
@@ -11242,6 +11958,11 @@
   @DocsEditable()
   void _removeAttributeNS(String namespaceURI, String localName) native;
 
+  @DomName('Element.requestPointerLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void requestPointerLock() native;
+
   /**
    * Scrolls the element by a number of lines.
    *
@@ -11306,27 +12027,6 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
   void requestFullscreen() native;
 
-  @JSName('webkitRequestPointerLock')
-  /**
-   * Locks the mouse pointer to this element.
-   *
-   * ## Other resources
-   *
-   * * [Pointer lock and first person shooter controls]
-   * (http://www.html5rocks.com/en/tutorials/pointerlock/intro/) tutorial from
-   * HTML5Rocks.
-   *
-   * * [Pointer lock specification]
-   * (http://www.w3.org/TR/pointerlock/) from W3C.
-   */
-  @DomName('Element.webkitRequestPointerLock')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Element-requestPointerLock-void
-  void requestPointerLock() native;
-
   // From ChildNode
 
   @DomName('Element.nextElementSibling')
@@ -11361,6 +12061,33 @@
   @DocsEditable()
   final Element _lastElementChild;
 
+  /**
+   * Finds the first descendant element of this element that matches the
+   * specified group of selectors.
+   *
+   * [selectors] should be a string using CSS selector syntax.
+   *
+   *     // Gets the first descendant with the class 'classname'
+   *     var element = element.querySelector('.className');
+   *     // Gets the element with id 'id'
+   *     var element = element.querySelector('#id');
+   *     // Gets the first descendant [ImageElement]
+   *     var img = element.querySelector('img');
+   *
+   * For details about CSS selector syntax, see the
+   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+   */
+  @DomName('Element.querySelector')
+  @DocsEditable()
+  Element querySelector(String selectors) native;
+
+  @JSName('querySelectorAll')
+  @DomName('Element.querySelectorAll')
+  @DocsEditable()
+  @Returns('NodeList')
+  @Creates('NodeList')
+  List<Node> _querySelectorAll(String selectors) native;
+
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
@@ -11386,6 +12113,16 @@
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  @DomName('Element.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
+
+  @DomName('Element.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
+
   /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
@@ -11545,6 +12282,21 @@
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
+  @DomName('Element.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
+
+  @DomName('Element.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
+
+  @DomName('Element.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEnded => endedEvent.forElement(this);
+
   /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
@@ -11585,6 +12337,16 @@
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  @DomName('Element.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
+
+  @DomName('Element.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
+
   /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
@@ -11634,6 +12396,26 @@
   @DocsEditable()
   ElementStream<Event> get onPaste => pasteEvent.forElement(this);
 
+  @DomName('Element.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPause => pauseEvent.forElement(this);
+
+  @DomName('Element.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlay => playEvent.forElement(this);
+
+  @DomName('Element.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlaying => playingEvent.forElement(this);
+
+  @DomName('Element.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
+
   /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
@@ -11656,6 +12438,16 @@
   @Experimental()
   ElementStream<Event> get onSearch => searchEvent.forElement(this);
 
+  @DomName('Element.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
+
+  @DomName('Element.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
+
   /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
@@ -11667,11 +12459,26 @@
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
 
+  @DomName('Element.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onStalled => stalledEvent.forElement(this);
+
   /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
+  @DomName('Element.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
+
+  @DomName('Element.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
+
   /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
@@ -11723,6 +12530,16 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forElement(this);
 
+  @DomName('Element.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
+
+  @DomName('Element.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
+
   /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
@@ -11809,6 +12626,11 @@
   @DocsEditable()
   String height;
 
+  @DomName('HTMLEmbedElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
   String name;
@@ -12424,20 +13246,41 @@
    * used when an explicit accessor is not available.
    */
   Events get on => new Events(this);
+
+  void addEventListener(String type, EventListener listener, [bool useCapture]) {
+    // TODO(leafp): This check is avoid a bug in our dispatch code when
+    // listener is null.  The browser treats this call as a no-op in this
+    // case, so it's fine to short-circuit it, but we should not have to.
+    if (listener != null) {
+      _addEventListener(type, listener, useCapture);
+    }
+  }
+
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) {
+    // TODO(leafp): This check is avoid a bug in our dispatch code when
+    // listener is null.  The browser treats this call as a no-op in this
+    // case, so it's fine to short-circuit it, but we should not have to.
+    if (listener != null) {
+      _removeEventListener(type, listener, useCapture);
+    }
+  }
+
   // To suppress missing implicit constructor warnings.
   factory EventTarget._() { throw new UnsupportedError("Not supported"); }
 
+  @JSName('addEventListener')
   @DomName('EventTarget.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native;
+  void _addEventListener([String type, EventListener listener, bool useCapture]) native;
 
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
   bool dispatchEvent(Event event) native;
 
+  @JSName('removeEventListener')
   @DomName('EventTarget.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+  void _removeEventListener([String type, EventListener listener, bool useCapture]) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12446,6 +13289,29 @@
 
 
 @DocsEditable()
+@DomName('FetchEvent')
+@Experimental() // untriaged
+@Native("FetchEvent")
+class FetchEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory FetchEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('FetchEvent.request')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Request request;
+
+  @DomName('FetchEvent.respondWith')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void respondWith(Object value) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('HTMLFieldSetElement')
 @Unstable()
 @Native("HTMLFieldSetElement")
@@ -13139,10 +14005,33 @@
 
   @DomName('FontFace.FontFace')
   @DocsEditable()
-  factory FontFace(String family, String source, Map descriptors) {
-    return FontFace._create_1(family, source, descriptors);
+  factory FontFace(String family, source, [Map descriptors]) {
+    if ((source is String || source == null) && (family is String || family == null) && descriptors == null) {
+      return FontFace._create_1(family, source);
+    }
+    if ((descriptors is Map || descriptors == null) && (source is String || source == null) && (family is String || family == null)) {
+      return FontFace._create_2(family, source, descriptors);
+    }
+    if ((source is TypedData || source == null) && (family is String || family == null) && descriptors == null) {
+      return FontFace._create_3(family, source);
+    }
+    if ((descriptors is Map || descriptors == null) && (source is TypedData || source == null) && (family is String || family == null)) {
+      return FontFace._create_4(family, source, descriptors);
+    }
+    if ((source is ByteBuffer || source == null) && (family is String || family == null) && descriptors == null) {
+      return FontFace._create_5(family, source);
+    }
+    if ((descriptors is Map || descriptors == null) && (source is ByteBuffer || source == null) && (family is String || family == null)) {
+      return FontFace._create_6(family, source, descriptors);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static FontFace _create_1(family, source, descriptors) => JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
+  static FontFace _create_1(family, source) => JS('FontFace', 'new FontFace(#,#)', family, source);
+  static FontFace _create_2(family, source, descriptors) => JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
+  static FontFace _create_3(family, source) => JS('FontFace', 'new FontFace(#,#)', family, source);
+  static FontFace _create_4(family, source, descriptors) => JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
+  static FontFace _create_5(family, source) => JS('FontFace', 'new FontFace(#,#)', family, source);
+  static FontFace _create_6(family, source, descriptors) => JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
 
   @DomName('FontFace.family')
   @DocsEditable()
@@ -13183,11 +14072,6 @@
   @DocsEditable()
   @Experimental() // untriaged
   String weight;
-
-  @DomName('FontFace.load')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void load() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -13303,30 +14187,6 @@
   // To suppress missing implicit constructor warnings.
   factory FormElement._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `autocomplete` events to event
-   * handlers that are not necessarily instances of [FormElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLFormElement.autocompleteEvent')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
-  @Experimental()
-  static const EventStreamProvider<Event> autocompleteEvent = const EventStreamProvider<Event>('autocomplete');
-
-  /**
-   * Static factory designed to expose `autocompleteerror` events to event
-   * handlers that are not necessarily instances of [FormElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLFormElement.autocompleteerrorEvent')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
-  @Experimental()
-  static const EventStreamProvider<AutocompleteErrorEvent> autocompleteErrorEvent = const EventStreamProvider<AutocompleteErrorEvent>('autocompleteerror');
-
   @DomName('HTMLFormElement.HTMLFormElement')
   @DocsEditable()
   factory FormElement() => document.createElement("form");
@@ -13381,7 +14241,7 @@
 
   @DomName('HTMLFormElement.__getter__')
   @DocsEditable()
-  Element __getter__(int index) native;
+  Element __getter__(index_OR_name) native;
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
@@ -13410,20 +14270,6 @@
   @DomName('HTMLFormElement.submit')
   @DocsEditable()
   void submit() native;
-
-  /// Stream of `autocomplete` events handled by this [FormElement].
-  @DomName('HTMLFormElement.onautocomplete')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
-  @Experimental()
-  ElementStream<Event> get onAutocomplete => autocompleteEvent.forElement(this);
-
-  /// Stream of `autocompleteerror` events handled by this [FormElement].
-  @DomName('HTMLFormElement.onautocompleteerror')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
-  @Experimental()
-  ElementStream<AutocompleteErrorEvent> get onAutocompleteError => autocompleteErrorEvent.forElement(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
@@ -13443,9 +14289,10 @@
   @DocsEditable()
   final List<num> axes;
 
-  @DomName('Gamepad.buttons')
+  @DomName('Gamepad.connected')
   @DocsEditable()
-  final List<num> buttons;
+  @Experimental() // untriaged
+  final bool connected;
 
   @DomName('Gamepad.id')
   @DocsEditable()
@@ -13455,6 +14302,11 @@
   @DocsEditable()
   final int index;
 
+  @DomName('Gamepad.mapping')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String mapping;
+
   @DomName('Gamepad.timestamp')
   @DocsEditable()
   final int timestamp;
@@ -13465,6 +14317,47 @@
 
 
 @DocsEditable()
+@DomName('GamepadButton')
+@Experimental() // untriaged
+@Native("GamepadButton")
+class GamepadButton extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory GamepadButton._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('GamepadButton.pressed')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool pressed;
+
+  @DomName('GamepadButton.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double value;
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('GamepadEvent')
+@Experimental() // untriaged
+@Native("GamepadEvent")
+class GamepadEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory GamepadEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('GamepadEvent.gamepad')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Gamepad gamepad;
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('Geolocation')
 @Unstable()
 @Native("Geolocation")
@@ -13620,6 +14513,16 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  @DomName('GlobalEventHandlers.canplayEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
+
+  @DomName('GlobalEventHandlers.canplaythroughEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
+
   @DomName('GlobalEventHandlers.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13675,6 +14578,21 @@
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  @DomName('GlobalEventHandlers.durationchangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
+
+  @DomName('GlobalEventHandlers.emptiedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
+
+  @DomName('GlobalEventHandlers.endedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+
   @DomName('GlobalEventHandlers.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13715,6 +14633,16 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  @DomName('GlobalEventHandlers.loadeddataEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
+
+  @DomName('GlobalEventHandlers.loadedmetadataEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
+
   @DomName('GlobalEventHandlers.mousedownEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13755,6 +14683,26 @@
   @Experimental() // untriaged
   static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
 
+  @DomName('GlobalEventHandlers.pauseEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
+
+  @DomName('GlobalEventHandlers.playEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
+
+  @DomName('GlobalEventHandlers.playingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
+
+  @DomName('GlobalEventHandlers.ratechangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
+
   @DomName('GlobalEventHandlers.resetEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13770,16 +14718,51 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  @DomName('GlobalEventHandlers.seekedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
+
+  @DomName('GlobalEventHandlers.seekingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
+
   @DomName('GlobalEventHandlers.selectEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  @DomName('GlobalEventHandlers.stalledEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
+
   @DomName('GlobalEventHandlers.submitEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  @DomName('GlobalEventHandlers.suspendEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
+
+  @DomName('GlobalEventHandlers.timeupdateEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
+
+  @DomName('GlobalEventHandlers.volumechangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
+
+  @DomName('GlobalEventHandlers.waitingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
+
   @DomName('GlobalEventHandlers.onabort')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13790,6 +14773,16 @@
   @Experimental() // untriaged
   Stream<Event> get onBlur => blurEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onCanPlayThrough => canPlayThroughEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onchange')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13845,6 +14838,21 @@
   @Experimental() // untriaged
   Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onDurationChange => durationChangeEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEmptied => emptiedEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEnded => endedEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onerror')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13885,6 +14893,16 @@
   @Experimental() // untriaged
   Stream<Event> get onLoad => loadEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onLoadedData => loadedDataEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onLoadedMetadata => loadedMetadataEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onmousedown')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13925,6 +14943,26 @@
   @Experimental() // untriaged
   Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPause => pauseEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPlay => playEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPlaying => playingEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onRateChange => rateChangeEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onreset')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13940,15 +14978,50 @@
   @Experimental() // untriaged
   Stream<Event> get onScroll => scrollEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSeeked => seekedEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSeeking => seekingEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onselect')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onSelect => selectEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onStalled => stalledEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onsubmit')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onSubmit => submitEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSuspend => suspendEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onTimeUpdate => timeUpdateEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onVolumeChange => volumeChangeEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onWaiting => waitingEvent.forTarget(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
@@ -14050,6 +15123,71 @@
 
 
 @DocsEditable()
+@DomName('HeaderMap')
+@Experimental() // untriaged
+@Native("HeaderMap")
+class HeaderMap extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory HeaderMap._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HeaderMap.HeaderMap')
+  @DocsEditable()
+  factory HeaderMap() {
+    return HeaderMap._create_1();
+  }
+  static HeaderMap _create_1() => JS('HeaderMap', 'new HeaderMap()');
+
+  @DomName('HeaderMap.size')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int size;
+
+  @DomName('HeaderMap.clear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clear() native;
+
+  @DomName('HeaderMap.delete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool delete(String key) native;
+
+  @DomName('HeaderMap.forEach')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void forEach(HeaderMapForEachCallback callback, [Object thisArg]) native;
+
+  @DomName('HeaderMap.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get(String key) native;
+
+  @DomName('HeaderMap.has')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool has(String key) native;
+
+  @DomName('HeaderMap.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set(String key, String value) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('HeaderMapForEachCallback')
+@Experimental() // untriaged
+typedef void HeaderMapForEachCallback(String value, String key, HeaderMap map);
+// 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.
+
+
+@DocsEditable()
 @DomName('HTMLHeadingElement')
 @Native("HTMLHeadingElement")
 class HeadingElement extends HtmlElement {
@@ -14156,6 +15294,29 @@
 
 
 @DocsEditable()
+@DomName('HmacKeyAlgorithm')
+@Experimental() // untriaged
+@Native("HmacKeyAlgorithm")
+class HmacKeyAlgorithm extends KeyAlgorithm {
+  // To suppress missing implicit constructor warnings.
+  factory HmacKeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HmacKeyAlgorithm.hash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final KeyAlgorithm hash;
+
+  @DomName('HmacKeyAlgorithm.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('HTMLCollection')
 @Native("HTMLCollection")
 class HtmlCollection extends Interceptor with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> {
@@ -14523,6 +15684,10 @@
 class HtmlFormControlsCollection extends HtmlCollection {
   // To suppress missing implicit constructor warnings.
   factory HtmlFormControlsCollection._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HTMLFormControlsCollection.namedItem')
+  @DocsEditable()
+  Object namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -15063,6 +16228,12 @@
   @DocsEditable()
   String responseType;
 
+  @JSName('responseURL')
+  @DomName('XMLHttpRequest.responseURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String responseUrl;
+
   @JSName('responseXML')
   /**
    * The request response, or null on failure.
@@ -15441,6 +16612,11 @@
   @DocsEditable()
   String height;
 
+  @DomName('HTMLIFrameElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
   String name;
@@ -15495,11 +16671,29 @@
   // To suppress missing implicit constructor warnings.
   factory ImageData._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ImageData.ImageData')
+  @DocsEditable()
+  factory ImageData(data_OR_width, int height_OR_width, [int height]) {
+    if ((height_OR_width is int || height_OR_width == null) && (data_OR_width is int || data_OR_width == null) && height == null) {
+      return ImageData._create_1(data_OR_width, height_OR_width);
+    }
+    if ((height_OR_width is int || height_OR_width == null) && (data_OR_width is Uint8ClampedList || data_OR_width == null) && height == null) {
+      return ImageData._create_2(data_OR_width, height_OR_width);
+    }
+    if ((height is int || height == null) && (height_OR_width is int || height_OR_width == null) && (data_OR_width is Uint8ClampedList || data_OR_width == null)) {
+      return ImageData._create_3(data_OR_width, height_OR_width, height);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  static ImageData _create_1(data_OR_width, height_OR_width) => JS('ImageData', 'new ImageData(#,#)', data_OR_width, height_OR_width);
+  static ImageData _create_2(data_OR_width, height_OR_width) => JS('ImageData', 'new ImageData(#,#)', data_OR_width, height_OR_width);
+  static ImageData _create_3(data_OR_width, height_OR_width, height) => JS('ImageData', 'new ImageData(#,#,#)', data_OR_width, height_OR_width, height);
+
   @DomName('ImageData.data')
   @DocsEditable()
   @Creates('NativeUint8ClampedList')
   @Returns('NativeUint8ClampedList')
-  final List<int> data;
+  final Uint8ClampedList data;
 
   @DomName('ImageData.height')
   @DocsEditable()
@@ -15549,10 +16743,20 @@
   @DocsEditable()
   String crossOrigin;
 
+  @DomName('HTMLImageElement.currentSrc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String currentSrc;
+
   @DomName('HTMLImageElement.height')
   @DocsEditable()
   int height;
 
+  @DomName('HTMLImageElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
   bool isMap;
@@ -15565,6 +16769,11 @@
   @DocsEditable()
   final int naturalWidth;
 
+  @DomName('HTMLImageElement.sizes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String sizes;
+
   @DomName('HTMLImageElement.src')
   @DocsEditable()
   String src;
@@ -15644,20 +16853,6 @@
 
   // To suppress missing implicit constructor warnings.
   factory InputElement._() { throw new UnsupportedError("Not supported"); }
-
-  /**
-   * Static factory designed to expose `speechchange` events to event
-   * handlers that are not necessarily instances of [InputElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLInputElement.webkitSpeechChangeEvent')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
-  static const EventStreamProvider<Event> speechChangeEvent = const EventStreamProvider<Event>('webkitSpeechChange');
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -15912,13 +17107,6 @@
   @DocsEditable()
   void stepUp([int n]) native;
 
-  /// Stream of `speechchange` events handled by this [InputElement].
-  @DomName('HTMLInputElement.onwebkitSpeechChange')
-  @DocsEditable()
-  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
-  @Experimental()
-  ElementStream<Event> get onSpeechChange => speechChangeEvent.forElement(this);
-
 }
 
 
@@ -16554,22 +17742,17 @@
 
 
 @DocsEditable()
-@DomName('KeyPair')
+@DomName('KeyAlgorithm')
 @Experimental() // untriaged
-@Native("KeyPair")
-class KeyPair extends Interceptor {
+@Native("KeyAlgorithm")
+class KeyAlgorithm extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory KeyPair._() { throw new UnsupportedError("Not supported"); }
+  factory KeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('KeyPair.privateKey')
+  @DomName('KeyAlgorithm.name')
   @DocsEditable()
   @Experimental() // untriaged
-  final CryptoKey privateKey;
-
-  @DomName('KeyPair.publicKey')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final CryptoKey publicKey;
+  final String name;
 }
 // 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
@@ -16924,6 +18107,11 @@
   @Experimental()
   final Document import;
 
+  @DomName('HTMLLinkElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
   String media;
@@ -17003,7 +18191,7 @@
 
   @DomName('Location.assign')
   @DocsEditable()
-  void assign(String url) native;
+  void assign([String url]) native;
 
   @DomName('Location.reload')
   @DocsEditable()
@@ -17162,6 +18350,49 @@
 
 
 @DocsEditable()
+@DomName('MediaDeviceInfo')
+@Experimental() // untriaged
+@Native("MediaDeviceInfo")
+class MediaDeviceInfo extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory MediaDeviceInfo._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MediaDeviceInfo.deviceId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String deviceId;
+
+  @DomName('MediaDeviceInfo.groupId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String groupId;
+
+  @DomName('MediaDeviceInfo.kind')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String kind;
+
+  @DomName('MediaDeviceInfo.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String label;
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('MediaDeviceInfoCallback')
+@Experimental() // untriaged
+typedef void MediaDeviceInfoCallback(List<MediaDeviceInfo> devices);
+// 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.
+
+
+@DocsEditable()
 @DomName('HTMLMediaElement')
 @Unstable()
 @Native("HTMLMediaElement")
@@ -17170,218 +18401,6 @@
   factory MediaElement._() { throw new UnsupportedError("Not supported"); }
 
   /**
-   * Static factory designed to expose `canplay` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.canplayEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
-
-  /**
-   * Static factory designed to expose `canplaythrough` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.canplaythroughEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
-
-  /**
-   * Static factory designed to expose `durationchange` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.durationchangeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
-
-  /**
-   * Static factory designed to expose `emptied` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.emptiedEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
-
-  /**
-   * Static factory designed to expose `ended` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.endedEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
-
-  /**
-   * Static factory designed to expose `loadeddata` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.loadeddataEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
-
-  /**
-   * Static factory designed to expose `loadedmetadata` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.loadedmetadataEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
-
-  /**
-   * Static factory designed to expose `loadstart` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.loadstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
-
-  /**
-   * Static factory designed to expose `pause` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.pauseEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
-
-  /**
-   * Static factory designed to expose `play` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.playEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
-
-  /**
-   * Static factory designed to expose `playing` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.playingEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
-
-  /**
-   * Static factory designed to expose `progress` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.progressEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
-
-  /**
-   * Static factory designed to expose `ratechange` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.ratechangeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
-
-  /**
-   * Static factory designed to expose `seeked` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.seekedEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
-
-  /**
-   * Static factory designed to expose `seeking` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.seekingEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
-
-  /**
-   * Static factory designed to expose `show` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.showEvent')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
-  @Experimental()
-  static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
-
-  /**
-   * Static factory designed to expose `stalled` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.stalledEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
-
-  /**
-   * Static factory designed to expose `suspend` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.suspendEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
-
-  /**
-   * Static factory designed to expose `timeupdate` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.timeupdateEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
-
-  /**
-   * Static factory designed to expose `volumechange` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.volumechangeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
-
-  /**
-   * Static factory designed to expose `waiting` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.waitingEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
-
-  /**
    * Static factory designed to expose `keyadded` events to event
    * handlers that are not necessarily instances of [MediaElement].
    *
@@ -17479,6 +18498,11 @@
   @DocsEditable()
   static const int NETWORK_NO_SOURCE = 3;
 
+  @DomName('HTMLMediaElement.audioTracks')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final AudioTrackList audioTracks;
+
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
   bool autoplay;
@@ -17528,6 +18552,11 @@
   @DocsEditable()
   final MediaError error;
 
+  @DomName('HTMLMediaElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
   bool loop;
@@ -17588,6 +18617,11 @@
   @Experimental()
   final TextTrackList textTracks;
 
+  @DomName('HTMLMediaElement.videoTracks')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final VideoTrackList videoTracks;
+
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
   num volume;
@@ -17665,113 +18699,6 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
   void generateKeyRequest(String keySystem, [Uint8List initData]) native;
 
-  /// Stream of `canplay` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.oncanplay')
-  @DocsEditable()
-  ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
-
-  /// Stream of `canplaythrough` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.oncanplaythrough')
-  @DocsEditable()
-  ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
-
-  /// Stream of `durationchange` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.ondurationchange')
-  @DocsEditable()
-  ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
-
-  /// Stream of `emptied` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onemptied')
-  @DocsEditable()
-  ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
-
-  /// Stream of `ended` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onended')
-  @DocsEditable()
-  ElementStream<Event> get onEnded => endedEvent.forElement(this);
-
-  /// Stream of `loadeddata` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onloadeddata')
-  @DocsEditable()
-  ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
-
-  /// Stream of `loadedmetadata` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onloadedmetadata')
-  @DocsEditable()
-  ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
-
-  /// Stream of `loadstart` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onloadstart')
-  @DocsEditable()
-  ElementStream<Event> get onLoadStart => loadStartEvent.forElement(this);
-
-  /// Stream of `pause` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onpause')
-  @DocsEditable()
-  ElementStream<Event> get onPause => pauseEvent.forElement(this);
-
-  /// Stream of `play` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onplay')
-  @DocsEditable()
-  ElementStream<Event> get onPlay => playEvent.forElement(this);
-
-  /// Stream of `playing` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onplaying')
-  @DocsEditable()
-  ElementStream<Event> get onPlaying => playingEvent.forElement(this);
-
-  /// Stream of `progress` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onprogress')
-  @DocsEditable()
-  ElementStream<Event> get onProgress => progressEvent.forElement(this);
-
-  /// Stream of `ratechange` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onratechange')
-  @DocsEditable()
-  ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
-
-  /// Stream of `seeked` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onseeked')
-  @DocsEditable()
-  ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
-
-  /// Stream of `seeking` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onseeking')
-  @DocsEditable()
-  ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
-
-  /// Stream of `show` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onshow')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
-  @Experimental()
-  ElementStream<Event> get onShow => showEvent.forElement(this);
-
-  /// Stream of `stalled` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onstalled')
-  @DocsEditable()
-  ElementStream<Event> get onStalled => stalledEvent.forElement(this);
-
-  /// Stream of `suspend` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onsuspend')
-  @DocsEditable()
-  ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
-
-  /// Stream of `timeupdate` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.ontimeupdate')
-  @DocsEditable()
-  ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
-
-  /// Stream of `volumechange` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onvolumechange')
-  @DocsEditable()
-  ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
-
-  /// Stream of `waiting` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onwaiting')
-  @DocsEditable()
-  ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
-
   /// Stream of `keyadded` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable()
@@ -18038,6 +18965,11 @@
   @DomName('MediaKeys.createSession')
   @DocsEditable()
   MediaKeySession createSession(String type, Uint8List initData) native;
+
+  @DomName('MediaKeys.isTypeSupported')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static bool isTypeSupported(String keySystem, String contentType) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18225,6 +19157,11 @@
   @DocsEditable()
   void addTrack(MediaStreamTrack track) native;
 
+  @DomName('MediaStream.clone')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaStream clone() native;
+
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
   @Creates('JSExtendableArray')
@@ -18367,6 +19304,11 @@
   @DocsEditable()
   final String readyState;
 
+  @DomName('MediaStreamTrack.clone')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaStreamTrack clone() native;
+
   @JSName('getSources')
   @DomName('MediaStreamTrack.getSources')
   @DocsEditable()
@@ -18803,6 +19745,11 @@
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
+  @DomName('MIDIAccess.sysexEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool sysexEnabled;
+
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
   List<MidiInput> inputs() native;
@@ -18827,24 +19774,6 @@
 
 
 @DocsEditable()
-@DomName('MIDIAccessPromise')
-@Experimental() // untriaged
-@Native("MIDIAccessPromise")
-class MidiAccessPromise extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory MidiAccessPromise._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('MIDIAccessPromise.then')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void then(MidiSuccessCallback successCallback, MidiErrorCallback errorCallback) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable()
 @DomName('MIDIConnectionEvent')
 // http://webaudio.github.io/web-midi-api/#midiconnectionevent-interface
 @Experimental()
@@ -19173,6 +20102,18 @@
   @DocsEditable()
   final bool metaKey;
 
+  @JSName('movementX')
+  @DomName('MouseEvent.movementX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int _movementX;
+
+  @JSName('movementY')
+  @DomName('MouseEvent.movementY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int _movementY;
+
   @DomName('MouseEvent.relatedTarget')
   @DocsEditable()
   EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._get_relatedTarget);
@@ -19455,7 +20396,7 @@
 
 @DomName('Navigator')
 @Native("Navigator")
-class Navigator extends Interceptor implements NavigatorOnLine, NavigatorID {
+class Navigator extends NavigatorCpu implements NavigatorLanguage, NavigatorOnLine, NavigatorID {
 
   @DomName('Navigator.language')
   String get language => JS('String', '#.language || #.userLanguage', this,
@@ -19531,6 +20472,11 @@
   // To suppress missing implicit constructor warnings.
   factory Navigator._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('Navigator.connection')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final NetworkInformation connection;
+
   @DomName('Navigator.cookieEnabled')
   @DocsEditable()
   @Unstable()
@@ -19562,6 +20508,11 @@
   @Unstable()
   final String productSub;
 
+  @DomName('Navigator.push')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final PushManager push;
+
   @DomName('Navigator.serviceWorker')
   @DocsEditable()
   @Experimental() // untriaged
@@ -19600,6 +20551,18 @@
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
   final DeprecatedStorageQuota temporaryStorage;
 
+  @DomName('Navigator.getGamepads')
+  @DocsEditable()
+  @Experimental() // untriaged
+  @Returns('_GamepadList')
+  @Creates('_GamepadList')
+  List<Gamepad> getGamepads() native;
+
+  @DomName('Navigator.getMediaDevices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void getMediaDevices(MediaDeviceInfoCallback resultCallback) native;
+
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
@@ -19616,43 +20579,16 @@
   @Unstable()
   void registerProtocolHandler(String scheme, String url, String title) native;
 
-  @DomName('Navigator.requestMIDIAccess')
+  @DomName('Navigator.sendBeacon')
   @DocsEditable()
   @Experimental() // untriaged
-  MidiAccessPromise requestMidiAccess([Map options]) {
-    if (options != null) {
-      var options_1 = convertDartToNative_Dictionary(options);
-      return _requestMidiAccess_1(options_1);
-    }
-    return _requestMidiAccess_2();
-  }
-  @JSName('requestMIDIAccess')
-  @DomName('Navigator.requestMIDIAccess')
-  @DocsEditable()
-  @Experimental() // untriaged
-  MidiAccessPromise _requestMidiAccess_1(options) native;
-  @JSName('requestMIDIAccess')
-  @DomName('Navigator.requestMIDIAccess')
-  @DocsEditable()
-  @Experimental() // untriaged
-  MidiAccessPromise _requestMidiAccess_2() native;
+  bool sendBeacon(String url, data) native;
 
   @DomName('Navigator.unregisterProtocolHandler')
   @DocsEditable()
   @Experimental() // untriaged
   void unregisterProtocolHandler(String scheme, String url) native;
 
-  @JSName('webkitGetGamepads')
-  @DomName('Navigator.webkitGetGamepads')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#widl-Navigator-getGamepads-Gamepad
-  @Returns('_GamepadList')
-  @Creates('_GamepadList')
-  List<Gamepad> getGamepads() native;
-
   // From NavigatorID
 
   @DomName('Navigator.appCodeName')
@@ -19668,6 +20604,11 @@
   @DocsEditable()
   final String appVersion;
 
+  @DomName('Navigator.dartEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool dartEnabled;
+
   @DomName('Navigator.platform')
   @DocsEditable()
   final String platform;
@@ -19681,6 +20622,13 @@
   @DocsEditable()
   final String userAgent;
 
+  // From NavigatorLanguage
+
+  @DomName('Navigator.languages')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<String> languages;
+
   // From NavigatorOnLine
 
   @DomName('Navigator.onLine')
@@ -19695,6 +20643,24 @@
 
 
 @DocsEditable()
+@DomName('NavigatorCPU')
+@Experimental() // untriaged
+@Native("NavigatorCPU")
+class NavigatorCpu extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory NavigatorCpu._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NavigatorCPU.hardwareConcurrency')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int hardwareConcurrency;
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('NavigatorID')
 @Experimental() // untriaged
 abstract class NavigatorID extends Interceptor {
@@ -19707,6 +20673,8 @@
 
   final String appVersion;
 
+  final bool dartEnabled;
+
   final String platform;
 
   final String product;
@@ -19719,6 +20687,29 @@
 
 
 @DocsEditable()
+@DomName('NavigatorLanguage')
+@Experimental() // untriaged
+@Native("NavigatorLanguage")
+class NavigatorLanguage extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory NavigatorLanguage._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NavigatorLanguage.language')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String language;
+
+  @DomName('NavigatorLanguage.languages')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<String> languages;
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('NavigatorOnLine')
 @Experimental() // untriaged
 abstract class NavigatorOnLine extends Interceptor {
@@ -19780,6 +20771,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DocsEditable()
+@DomName('NetworkInformation')
+@Experimental() // untriaged
+@Native("NetworkInformation")
+class NetworkInformation extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory NetworkInformation._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NetworkInformation.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
+}
+// 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.
+
+
 /**
  * Lazy implementation of the child nodes of an element that does not request
  * the actual child nodes of an element until strictly necessary greatly
@@ -20764,6 +21773,11 @@
   @DocsEditable()
   String height;
 
+  @DomName('HTMLObjectElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
   String name;
@@ -21114,6 +22128,10 @@
   final Element _firstElementChild;
 
   final Element _lastElementChild;
+
+  Element querySelector(String selectors);
+
+  List<Node> querySelectorAll(String selectors);
 }
 // 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
@@ -21121,62 +22139,81 @@
 
 
 @DocsEditable()
-@DomName('Path')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
-@Experimental()
-@Native("Path")
-class Path extends Interceptor {
+@DomName('Path2D')
+@Experimental() // untriaged
+@Native("Path2D")
+class Path2D extends Interceptor implements _CanvasPathMethods {
   // To suppress missing implicit constructor warnings.
-  factory Path._() { throw new UnsupportedError("Not supported"); }
+  factory Path2D._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Path.Path')
+  @DomName('Path2D.Path2D')
   @DocsEditable()
-  factory Path([path_OR_text]) {
+  factory Path2D([path_OR_text]) {
     if (path_OR_text == null) {
-      return Path._create_1();
+      return Path2D._create_1();
     }
-    if ((path_OR_text is Path || path_OR_text == null)) {
-      return Path._create_2(path_OR_text);
+    if ((path_OR_text is Path2D || path_OR_text == null)) {
+      return Path2D._create_2(path_OR_text);
     }
     if ((path_OR_text is String || path_OR_text == null)) {
-      return Path._create_3(path_OR_text);
+      return Path2D._create_3(path_OR_text);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static Path _create_1() => JS('Path', 'new Path()');
-  static Path _create_2(path_OR_text) => JS('Path', 'new Path(#)', path_OR_text);
-  static Path _create_3(path_OR_text) => JS('Path', 'new Path(#)', path_OR_text);
+  static Path2D _create_1() => JS('Path2D', 'new Path2D()');
+  static Path2D _create_2(path_OR_text) => JS('Path2D', 'new Path2D(#)', path_OR_text);
+  static Path2D _create_3(path_OR_text) => JS('Path2D', 'new Path2D(#)', path_OR_text);
 
-  @DomName('Path.arc')
+  @DomName('Path2D.addPath')
   @DocsEditable()
+  @Experimental() // untriaged
+  void addPath(Path2D path, [Matrix transform]) native;
+
+  // From CanvasPathMethods
+
+  @DomName('Path2D.arc')
+  @DocsEditable()
+  @Experimental() // untriaged
   void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native;
 
-  @DomName('Path.arcTo')
+  @DomName('Path2D.arcTo')
   @DocsEditable()
+  @Experimental() // untriaged
   void arcTo(num x1, num y1, num x2, num y2, num radius) native;
 
-  @DomName('Path.bezierCurveTo')
+  @DomName('Path2D.bezierCurveTo')
   @DocsEditable()
+  @Experimental() // untriaged
   void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native;
 
-  @DomName('Path.closePath')
+  @DomName('Path2D.closePath')
   @DocsEditable()
+  @Experimental() // untriaged
   void closePath() native;
 
-  @DomName('Path.lineTo')
+  @DomName('Path2D.ellipse')
   @DocsEditable()
+  @Experimental() // untriaged
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) native;
+
+  @DomName('Path2D.lineTo')
+  @DocsEditable()
+  @Experimental() // untriaged
   void lineTo(num x, num y) native;
 
-  @DomName('Path.moveTo')
+  @DomName('Path2D.moveTo')
   @DocsEditable()
+  @Experimental() // untriaged
   void moveTo(num x, num y) native;
 
-  @DomName('Path.quadraticCurveTo')
+  @DomName('Path2D.quadraticCurveTo')
   @DocsEditable()
+  @Experimental() // untriaged
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
 
-  @DomName('Path.rect')
+  @DomName('Path2D.rect')
   @DocsEditable()
+  @Experimental() // untriaged
   void rect(num x, num y, num width, num height) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21558,72 +22595,18 @@
 
 
 @DocsEditable()
-@DomName('Player')
+@DomName('HTMLPictureElement')
 @Experimental() // untriaged
-@Native("Player")
-class Player extends Interceptor {
+@Native("HTMLPictureElement")
+class PictureElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory Player._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Player.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num currentTime;
-
-  @DomName('Player.finished')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final bool finished;
-
-  @DomName('Player.paused')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final bool paused;
-
-  @DomName('Player.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num playbackRate;
-
-  @DomName('Player.source')
-  @DocsEditable()
-  @Experimental() // untriaged
-  TimedItem source;
-
-  @DomName('Player.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num startTime;
-
-  @DomName('Player.timeLag')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double timeLag;
-
-  @DomName('Player.cancel')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void cancel() native;
-
-  @DomName('Player.finish')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void finish() native;
-
-  @DomName('Player.pause')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void pause() native;
-
-  @DomName('Player.play')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void play() native;
-
-  @DomName('Player.reverse')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void reverse() native;
+  factory PictureElement._() { throw new UnsupportedError("Not supported"); }
+  /**
+   * Constructor instantiated by the DOM when a custom element has been created.
+   *
+   * This can only be called by subclasses from their created constructor.
+   */
+  PictureElement.created() : super.created();
 }
 // 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
@@ -21944,6 +22927,60 @@
 
 
 @DocsEditable()
+@DomName('PushEvent')
+@Experimental() // untriaged
+@Native("PushEvent")
+class PushEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory PushEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PushEvent.data')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String data;
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('PushManager')
+@Experimental() // untriaged
+@Native("PushManager")
+class PushManager extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PushManager._() { throw new UnsupportedError("Not supported"); }
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('PushRegistration')
+@Experimental() // untriaged
+@Native("PushRegistration")
+class PushRegistration extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory PushRegistration._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PushRegistration.pushEndpoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String pushEndpoint;
+
+  @DomName('PushRegistration.pushRegistrationId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String pushRegistrationId;
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('HTMLQuoteElement')
 @Native("HTMLQuoteElement")
 class QuoteElement extends HtmlElement {
@@ -22185,6 +23222,45 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+
+@DocsEditable()
+@DomName('Request')
+@Experimental() // untriaged
+@Native("Request")
+class Request extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory Request._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Request.Request')
+  @DocsEditable()
+  factory Request([Map requestInitDict]) {
+    if (requestInitDict != null) {
+      return Request._create_1(requestInitDict);
+    }
+    return Request._create_2();
+  }
+  static Request _create_1(requestInitDict) => JS('Request', 'new Request(#)', requestInitDict);
+  static Request _create_2() => JS('Request', 'new Request()');
+
+  @DomName('Request.headers')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final HeaderMap headers;
+
+  @DomName('Request.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String origin;
+
+  @DomName('Request.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String 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
+// BSD-style license that can be found in the LICENSE file.
+
 // WARNING: Do not edit - generated code.
 
 
@@ -22214,6 +23290,47 @@
 
 
 @DocsEditable()
+@DomName('RsaHashedKeyAlgorithm')
+@Experimental() // untriaged
+@Native("RsaHashedKeyAlgorithm")
+class RsaHashedKeyAlgorithm extends RsaKeyAlgorithm {
+  // To suppress missing implicit constructor warnings.
+  factory RsaHashedKeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('RsaHashedKeyAlgorithm.hash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final KeyAlgorithm hash;
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('RsaKeyAlgorithm')
+@Experimental() // untriaged
+@Native("RsaKeyAlgorithm")
+class RsaKeyAlgorithm extends KeyAlgorithm {
+  // To suppress missing implicit constructor warnings.
+  factory RsaKeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('RsaKeyAlgorithm.modulusLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int modulusLength;
+
+  @DomName('RsaKeyAlgorithm.publicExponent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Uint8List publicExponent;
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('RTCDataChannel')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDataChannel
 @Experimental()
@@ -22477,15 +23594,15 @@
 
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
-  final String candidate;
+  String candidate;
 
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
-  final int sdpMLineIndex;
+  int sdpMLineIndex;
 
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
-  final String sdpMid;
+  String sdpMid;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22986,7 +24103,7 @@
 @DocsEditable()
 @DomName('Screen')
 @Native("Screen")
-class Screen extends EventTarget {
+class Screen extends Interceptor {
 
   @DomName('Screen.availHeight')
   @DomName('Screen.availLeft')
@@ -23040,11 +24157,6 @@
   @DocsEditable()
   final int width;
 
-  @DomName('Screen.lockOrientation')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool lockOrientation(String orientation) native;
-
   @DomName('Screen.unlockOrientation')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23090,6 +24202,11 @@
   @DocsEditable()
   bool defer;
 
+  @DomName('HTMLScriptElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @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
@@ -23249,6 +24366,11 @@
   @DocsEditable()
   void __setter__(int index, OptionElement value) native;
 
+  @DomName('HTMLSelectElement.add')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void add(HtmlElement element, int before) native;
+
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
   bool checkValidity() native;
@@ -23351,7 +24473,7 @@
 
   @DomName('Selection.collapse')
   @DocsEditable()
-  void collapse(Node node, int index) native;
+  void collapse(Node node, [int offset]) native;
 
   @DomName('Selection.collapseToEnd')
   @DocsEditable()
@@ -23404,7 +24526,7 @@
   @DomName('Selection.setPosition')
   @DocsEditable()
   @Experimental() // non-standard
-  void setPosition(Node node, int offset) native;
+  void setPosition(Node node, [int offset]) native;
 
   @DomName('Selection.toString')
   @DocsEditable()
@@ -23416,12 +24538,45 @@
 
 
 @DocsEditable()
+@DomName('ServiceWorkerClients')
+@Experimental() // untriaged
+@Native("ServiceWorkerClients")
+class ServiceWorkerClients extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ServiceWorkerClients._() { throw new UnsupportedError("Not supported"); }
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('ServiceWorkerContainer')
 @Experimental() // untriaged
 @Native("ServiceWorkerContainer")
 class ServiceWorkerContainer extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerContainer._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ServiceWorkerContainer.active')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _ServiceWorker active;
+
+  @DomName('ServiceWorkerContainer.controller')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _ServiceWorker controller;
+
+  @DomName('ServiceWorkerContainer.installing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _ServiceWorker installing;
+
+  @DomName('ServiceWorkerContainer.waiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _ServiceWorker waiting;
 }
 // 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
@@ -23435,6 +24590,26 @@
 class ServiceWorkerGlobalScope extends WorkerGlobalScope {
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ServiceWorkerGlobalScope.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('ServiceWorkerGlobalScope.clients')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final ServiceWorkerClients clients;
+
+  @DomName('ServiceWorkerGlobalScope.scope')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String scope;
+
+  @DomName('ServiceWorkerGlobalScope.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MessageEvent> get onMessage => messageEvent.forTarget(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
@@ -23464,10 +24639,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('shadow');
 
-  @DomName('HTMLShadowElement.resetStyleInheritance')
-  @DocsEditable()
-  bool resetStyleInheritance;
-
   @DomName('HTMLShadowElement.getDistributedNodes')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23510,11 +24681,6 @@
   @Experimental() // untriaged
   final ShadowRoot olderShadowRoot;
 
-  @JSName('resetStyleInheritance')
-  @DomName('ShadowRoot.resetStyleInheritance')
-  @DocsEditable()
-  bool _resetStyleInheritance;
-
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23531,10 +24697,6 @@
   @DocsEditable()
   Element elementFromPoint(int x, int y) native;
 
-  @DomName('ShadowRoot.getElementById')
-  @DocsEditable()
-  Element getElementById(String elementId) native;
-
   @DomName('ShadowRoot.getElementsByClassName')
   @DocsEditable()
   @Creates('NodeList|HtmlCollection')
@@ -23824,14 +24986,29 @@
    */
   SourceElement.created() : super.created();
 
+  @DomName('HTMLSourceElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
   String media;
 
+  @DomName('HTMLSourceElement.sizes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String sizes;
+
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
   String src;
 
+  @DomName('HTMLSourceElement.srcset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String srcset;
+
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
   String type;
@@ -24001,34 +25178,6 @@
   @DocsEditable()
   SpeechGrammar item(int index) native;
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable()
-@DomName('SpeechInputEvent')
-// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_event_interface
-@Experimental()
-@Native("SpeechInputEvent")
-class SpeechInputEvent extends Event {
-  // To suppress missing implicit constructor warnings.
-  factory SpeechInputEvent._() { throw new UnsupportedError("Not supported"); }
-}
-// 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.
-
-
-@DocsEditable()
-@DomName('SpeechInputResult')
-// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_result_interface
-@Experimental()
-@Native("SpeechInputResult")
-class SpeechInputResult extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory SpeechInputResult._() { throw new UnsupportedError("Not supported"); }
-}
 // 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.
@@ -24916,10 +26065,6 @@
   @DocsEditable()
   String media;
 
-  @DomName('HTMLStyleElement.scoped')
-  @DocsEditable()
-  bool scoped;
-
   @DomName('HTMLStyleElement.sheet')
   @DocsEditable()
   final StyleSheet sheet;
@@ -25205,7 +26350,7 @@
   @JSName('insertRow')
   @DomName('HTMLTableElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow(int index) native;
+  HtmlElement _insertRow([int index]) native;
 }
 // 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
@@ -25277,7 +26422,7 @@
   @JSName('insertCell')
   @DomName('HTMLTableRowElement.insertCell')
   @DocsEditable()
-  HtmlElement _insertCell(int index) native;
+  HtmlElement _insertCell([int index]) native;
 }
 // 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
@@ -25336,7 +26481,7 @@
   @JSName('insertRow')
   @DomName('HTMLTableSectionElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow(int index) native;
+  HtmlElement _insertRow([int index]) native;
 }
 // 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
@@ -25610,6 +26755,61 @@
   // To suppress missing implicit constructor warnings.
   factory TextMetrics._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('TextMetrics.actualBoundingBoxAscent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double actualBoundingBoxAscent;
+
+  @DomName('TextMetrics.actualBoundingBoxDescent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double actualBoundingBoxDescent;
+
+  @DomName('TextMetrics.actualBoundingBoxLeft')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double actualBoundingBoxLeft;
+
+  @DomName('TextMetrics.actualBoundingBoxRight')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double actualBoundingBoxRight;
+
+  @DomName('TextMetrics.alphabeticBaseline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double alphabeticBaseline;
+
+  @DomName('TextMetrics.emHeightAscent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double emHeightAscent;
+
+  @DomName('TextMetrics.emHeightDescent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double emHeightDescent;
+
+  @DomName('TextMetrics.fontBoundingBoxAscent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double fontBoundingBoxAscent;
+
+  @DomName('TextMetrics.fontBoundingBoxDescent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double fontBoundingBoxDescent;
+
+  @DomName('TextMetrics.hangingBaseline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double hangingBaseline;
+
+  @DomName('TextMetrics.ideographicBaseline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double ideographicBaseline;
+
   @DomName('TextMetrics.width')
   @DocsEditable()
   final double width;
@@ -25954,72 +27154,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.
 
-
-@DocsEditable()
-@DomName('TimedItem')
-@Experimental() // untriaged
-@Native("TimedItem")
-class TimedItem extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory TimedItem._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('TimedItem.activeDuration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double activeDuration;
-
-  @DomName('TimedItem.currentIteration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int currentIteration;
-
-  @DomName('TimedItem.duration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double duration;
-
-  @DomName('TimedItem.endTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double endTime;
-
-  @DomName('TimedItem.localTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double localTime;
-
-  @DomName('TimedItem.player')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final Player player;
-
-  @DomName('TimedItem.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final double startTime;
-}
-// 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.
-
-
-@DocsEditable()
-@DomName('Timeline')
-@Experimental() // untriaged
-@Native("Timeline")
-class Timeline extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory Timeline._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Timeline.play')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Player play(TimedItem source) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 // WARNING: Do not edit - generated code.
 
 
@@ -26078,6 +27212,11 @@
   @Experimental() // untriaged
   num playbackRate;
 
+  @DomName('Timing.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object __getter__(String name) native;
+
   @DomName('Timing.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
@@ -26122,12 +27261,12 @@
   @JSName('clientX')
   @DomName('Touch.clientX')
   @DocsEditable()
-  final int _clientX;
+  final double _clientX;
 
   @JSName('clientY')
   @DomName('Touch.clientY')
   @DocsEditable()
-  final int _clientY;
+  final double _clientY;
 
   @DomName('Touch.identifier')
   @DocsEditable()
@@ -26136,22 +27275,22 @@
   @JSName('pageX')
   @DomName('Touch.pageX')
   @DocsEditable()
-  final int _pageX;
+  final double _pageX;
 
   @JSName('pageY')
   @DomName('Touch.pageY')
   @DocsEditable()
-  final int _pageY;
+  final double _pageY;
 
   @JSName('screenX')
   @DomName('Touch.screenX')
   @DocsEditable()
-  final int _screenX;
+  final double _screenX;
 
   @JSName('screenY')
   @DomName('Touch.screenY')
   @DocsEditable()
-  final int _screenY;
+  final double _screenY;
 
   @DomName('Touch.target')
   @DocsEditable()
@@ -26177,7 +27316,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  final int _webkitRadiusX;
+  final double _webkitRadiusX;
 
   @JSName('webkitRadiusY')
   @DomName('Touch.webkitRadiusY')
@@ -26185,7 +27324,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  final int _webkitRadiusY;
+  final double _webkitRadiusY;
 
   @JSName('webkitRotationAngle')
   @DomName('Touch.webkitRotationAngle')
@@ -26293,7 +27432,7 @@
   @JSName('initTouchEvent')
   @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) native;
+  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int unused1, int unused2, int unused3, int unused4, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
 
 
   /**
@@ -26431,6 +27570,11 @@
   @DocsEditable()
   bool defaultValue;
 
+  @DomName('HTMLTrackElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String integrity;
+
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
   String kind;
@@ -26785,6 +27929,11 @@
   @Experimental() // untriaged
   String username;
 
+  @DomName('URL.toString')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String toString() native;
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27022,6 +28171,87 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+
+@DocsEditable()
+@DomName('VideoTrack')
+@Experimental() // untriaged
+@Native("VideoTrack")
+class VideoTrack extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory VideoTrack._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('VideoTrack.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String id;
+
+  @DomName('VideoTrack.kind')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String kind;
+
+  @DomName('VideoTrack.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String label;
+
+  @DomName('VideoTrack.language')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String language;
+
+  @DomName('VideoTrack.selected')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool selected;
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('VideoTrackList')
+@Experimental() // untriaged
+@Native("VideoTrackList")
+class VideoTrackList extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory VideoTrackList._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('VideoTrackList.changeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+
+  @DomName('VideoTrackList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+
+  @DomName('VideoTrackList.selectedIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int selectedIndex;
+
+  @DomName('VideoTrackList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VideoTrack __getter__(int index) native;
+
+  @DomName('VideoTrackList.getTrackById')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VideoTrack getTrackById(String id) native;
+
+  @DomName('VideoTrackList.onchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onChange => changeEvent.forTarget(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
+// BSD-style license that can be found in the LICENSE file.
+
 // WARNING: Do not edit - generated code.
 
 
@@ -27285,10 +28515,10 @@
     if ((url is String || url == null) && protocol_OR_protocols == null) {
       return WebSocket._create_1(url);
     }
-    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
+    if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
       return WebSocket._create_2(url, protocol_OR_protocols);
     }
-    if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
+    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
       return WebSocket._create_3(url, protocol_OR_protocols);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -27995,6 +29225,10 @@
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  @DomName('Window.loadstartEvent')
+  @DocsEditable()
+  static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
+
   /**
    * Static factory designed to expose `message` events to event
    * handlers that are not necessarily instances of [Window].
@@ -28055,6 +29289,10 @@
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  @DomName('Window.progressEvent')
+  @DocsEditable()
+  static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
+
   /**
    * Static factory designed to expose `storage` events to event
    * handlers that are not necessarily instances of [Window].
@@ -28667,10 +29905,10 @@
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   WindowBase __getter__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
+    if ((index_OR_name is int)) {
       return _convertNativeToDart_Window(__getter___1(index_OR_name));
     }
-    if ((index_OR_name is String || index_OR_name == null)) {
+    if ((index_OR_name is String)) {
       return _convertNativeToDart_Window(__getter___2(index_OR_name));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -28699,7 +29937,7 @@
    */
   @DomName('Window.alert')
   @DocsEditable()
-  void alert(String message) native;
+  void alert([String message]) native;
 
   @DomName('Window.close')
   @DocsEditable()
@@ -29166,6 +30404,14 @@
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  @DomName('Window.oncanplay')
+  @DocsEditable()
+  Stream<Event> get onCanPlay => Element.canPlayEvent.forTarget(this);
+
+  @DomName('Window.oncanplaythrough')
+  @DocsEditable()
+  Stream<Event> get onCanPlayThrough => Element.canPlayThroughEvent.forTarget(this);
+
   /// Stream of `change` events handled by this [Window].
   @DomName('Window.onchange')
   @DocsEditable()
@@ -29235,6 +30481,18 @@
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  @DomName('Window.ondurationchange')
+  @DocsEditable()
+  Stream<Event> get onDurationChange => Element.durationChangeEvent.forTarget(this);
+
+  @DomName('Window.onemptied')
+  @DocsEditable()
+  Stream<Event> get onEmptied => Element.emptiedEvent.forTarget(this);
+
+  @DomName('Window.onended')
+  @DocsEditable()
+  Stream<Event> get onEnded => Element.endedEvent.forTarget(this);
+
   /// Stream of `error` events handled by this [Window].
   @DomName('Window.onerror')
   @DocsEditable()
@@ -29280,6 +30538,18 @@
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  @DomName('Window.onloadeddata')
+  @DocsEditable()
+  Stream<Event> get onLoadedData => Element.loadedDataEvent.forTarget(this);
+
+  @DomName('Window.onloadedmetadata')
+  @DocsEditable()
+  Stream<Event> get onLoadedMetadata => Element.loadedMetadataEvent.forTarget(this);
+
+  @DomName('Window.onloadstart')
+  @DocsEditable()
+  Stream<Event> get onLoadStart => loadStartEvent.forTarget(this);
+
   /// Stream of `message` events handled by this [Window].
   @DomName('Window.onmessage')
   @DocsEditable()
@@ -29347,11 +30617,31 @@
   @DocsEditable()
   Stream<Event> get onPageShow => pageShowEvent.forTarget(this);
 
+  @DomName('Window.onpause')
+  @DocsEditable()
+  Stream<Event> get onPause => Element.pauseEvent.forTarget(this);
+
+  @DomName('Window.onplay')
+  @DocsEditable()
+  Stream<Event> get onPlay => Element.playEvent.forTarget(this);
+
+  @DomName('Window.onplaying')
+  @DocsEditable()
+  Stream<Event> get onPlaying => Element.playingEvent.forTarget(this);
+
   /// Stream of `popstate` events handled by this [Window].
   @DomName('Window.onpopstate')
   @DocsEditable()
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
+  @DomName('Window.onprogress')
+  @DocsEditable()
+  Stream<Event> get onProgress => progressEvent.forTarget(this);
+
+  @DomName('Window.onratechange')
+  @DocsEditable()
+  Stream<Event> get onRateChange => Element.rateChangeEvent.forTarget(this);
+
   /// Stream of `reset` events handled by this [Window].
   @DomName('Window.onreset')
   @DocsEditable()
@@ -29374,11 +30664,23 @@
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  @DomName('Window.onseeked')
+  @DocsEditable()
+  Stream<Event> get onSeeked => Element.seekedEvent.forTarget(this);
+
+  @DomName('Window.onseeking')
+  @DocsEditable()
+  Stream<Event> get onSeeking => Element.seekingEvent.forTarget(this);
+
   /// Stream of `select` events handled by this [Window].
   @DomName('Window.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  @DomName('Window.onstalled')
+  @DocsEditable()
+  Stream<Event> get onStalled => Element.stalledEvent.forTarget(this);
+
   /// Stream of `storage` events handled by this [Window].
   @DomName('Window.onstorage')
   @DocsEditable()
@@ -29389,6 +30691,14 @@
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  @DomName('Window.onsuspend')
+  @DocsEditable()
+  Stream<Event> get onSuspend => Element.suspendEvent.forTarget(this);
+
+  @DomName('Window.ontimeupdate')
+  @DocsEditable()
+  Stream<Event> get onTimeUpdate => Element.timeUpdateEvent.forTarget(this);
+
   /// Stream of `touchcancel` events handled by this [Window].
   @DomName('Window.ontouchcancel')
   @DocsEditable()
@@ -29427,6 +30737,14 @@
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 
+  @DomName('Window.onvolumechange')
+  @DocsEditable()
+  Stream<Event> get onVolumeChange => Element.volumeChangeEvent.forTarget(this);
+
+  @DomName('Window.onwaiting')
+  @DocsEditable()
+  Stream<Event> get onWaiting => Element.waitingEvent.forTarget(this);
+
   /// Stream of `animationend` events handled by this [Window].
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable()
@@ -29737,19 +31055,6 @@
 
 
 @DocsEditable()
-@DomName('WorkerCrypto')
-@Experimental() // untriaged
-@Native("WorkerCrypto")
-class WorkerCrypto extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory WorkerCrypto._() { throw new UnsupportedError("Not supported"); }
-}
-// 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.
-
-
-@DocsEditable()
 @DomName('WorkerGlobalScope')
 @Experimental() // untriaged
 @Native("WorkerGlobalScope")
@@ -29786,7 +31091,7 @@
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
-  final WorkerCrypto crypto;
+  final Crypto crypto;
 
   @DomName('WorkerGlobalScope.indexedDB')
   @DocsEditable()
@@ -29818,6 +31123,11 @@
   @Experimental() // untriaged
   void close() native;
 
+  @DomName('WorkerGlobalScope.importScripts')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void importScripts(String urls) native;
+
   @DomName('WorkerGlobalScope.openDatabase')
   @DocsEditable()
   @Experimental() // untriaged
@@ -29939,6 +31249,11 @@
   // To suppress missing implicit constructor warnings.
   factory WorkerPerformance._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('WorkerPerformance.memory')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final MemoryInfo memory;
+
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
@@ -30222,6 +31537,16 @@
   // Use implementation from Node.
   // final String _namespaceUri;
 
+  // Use implementation from Node.
+  // final String nodeValue;
+
+  // Shadowing definition.
+  String get text => JS("String", "#.textContent", this);
+
+  void set text(String value) {
+    JS("void", "#.textContent = #", this, value);
+  }
+
   @DomName('Attr.value')
   @DocsEditable()
   String value;
@@ -30268,6 +31593,18 @@
   // To suppress missing implicit constructor warnings.
   factory _CSSValue._() { throw new UnsupportedError("Not supported"); }
 }
+// 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.
+
+
+@DocsEditable()
+@DomName('CanvasPathMethods')
+@Experimental() // untriaged
+abstract class _CanvasPathMethods extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory _CanvasPathMethods._() { throw new UnsupportedError("Not supported"); }
+}
 // 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.
@@ -31155,26 +32492,6 @@
 
 
 @DocsEditable()
-@DomName('NotificationCenter')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/notifications/#showing-a-notification
-@deprecated // deprecated
-@Native("NotificationCenter")
-abstract class _NotificationCenter extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory _NotificationCenter._() { throw new UnsupportedError("Not supported"); }
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => JS('bool', '!!(window.webkitNotifications)');
-}
-// 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.
-
-
-@DocsEditable()
 @DomName('PagePopupController')
 @deprecated // nonstandard
 @Native("PagePopupController")
@@ -31225,12 +32542,23 @@
 
 
 @DocsEditable()
-@DomName('ServiceWorker')
+@DomName('Response')
 @Experimental() // untriaged
-@Native("ServiceWorker")
-abstract class _ServiceWorker extends Interceptor {
+@Native("Response")
+abstract class _Response extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _ServiceWorker._() { throw new UnsupportedError("Not supported"); }
+  factory _Response._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Response.Response')
+  @DocsEditable()
+  factory _Response(Blob body, [Map responseInitDict]) {
+    if (responseInitDict != null) {
+      return _Response._create_1(body, responseInitDict);
+    }
+    return _Response._create_2(body);
+  }
+  static _Response _create_1(body, responseInitDict) => JS('_Response', 'new Response(#,#)', body, responseInitDict);
+  static _Response _create_2(body) => JS('_Response', 'new Response(#)', body);
 }
 // 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
@@ -31238,65 +32566,12 @@
 
 
 @DocsEditable()
-@DomName('SpeechInputResultList')
-// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_result_list_interface
-@Experimental()
-@Native("SpeechInputResultList")
-class _SpeechInputResultList extends Interceptor with ListMixin<SpeechInputResult>, ImmutableListMixin<SpeechInputResult> implements JavaScriptIndexingBehavior, List<SpeechInputResult> {
+@DomName('ServiceWorker')
+@Experimental() // untriaged
+@Native("ServiceWorker")
+abstract class _ServiceWorker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
-  factory _SpeechInputResultList._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SpeechInputResultList.length')
-  @DocsEditable()
-  int get length => JS("int", "#.length", this);
-
-  SpeechInputResult operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
-      throw new RangeError.range(index, 0, length);
-    return JS("SpeechInputResult", "#[#]", this, index);
-  }
-  void operator[]=(int index, SpeechInputResult value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SpeechInputResult> mixins.
-  // SpeechInputResult is the element type.
-
-
-  void set length(int value) {
-    throw new UnsupportedError("Cannot resize immutable List.");
-  }
-
-  SpeechInputResult get first {
-    if (this.length > 0) {
-      return JS('SpeechInputResult', '#[0]', this);
-    }
-    throw new StateError("No elements");
-  }
-
-  SpeechInputResult get last {
-    int len = this.length;
-    if (len > 0) {
-      return JS('SpeechInputResult', '#[#]', this, len - 1);
-    }
-    throw new StateError("No elements");
-  }
-
-  SpeechInputResult get single {
-    int len = this.length;
-    if (len == 1) {
-      return JS('SpeechInputResult', '#[0]', this);
-    }
-    if (len == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
-  }
-
-  SpeechInputResult elementAt(int index) => this[index];
-  // -- end List<SpeechInputResult> mixins.
-
-  @DomName('SpeechInputResultList.item')
-  @DocsEditable()
-  SpeechInputResult item(int index) native;
+  factory _ServiceWorker._() { throw new UnsupportedError("Not supported"); }
 }
 // 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
@@ -31507,71 +32782,6 @@
 
 
 @DocsEditable()
-@DomName('WebKitMediaSource')
-@Experimental() // untriaged
-@Native("WebKitMediaSource")
-abstract class _WebKitMediaSource extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitMediaSource._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('WebKitMediaSource.WebKitMediaSource')
-  @DocsEditable()
-  factory _WebKitMediaSource() {
-    return _WebKitMediaSource._create_1();
-  }
-  static _WebKitMediaSource _create_1() => JS('_WebKitMediaSource', 'new WebKitMediaSource()');
-}
-// 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.
-
-
-@DocsEditable()
-@DomName('WebKitNotification')
-@Experimental() // untriaged
-@Native("WebKitNotification")
-abstract class _WebKitNotification extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitNotification._() { throw new UnsupportedError("Not supported"); }
-}
-// 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.
-
-
-@DocsEditable()
-@DomName('WebKitSourceBuffer')
-@Experimental() // untriaged
-@Native("WebKitSourceBuffer")
-abstract class _WebKitSourceBuffer extends Interceptor {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitSourceBuffer._() { throw new UnsupportedError("Not supported"); }
-}
-// 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.
-
-
-@DocsEditable()
-@DomName('WebKitSourceBufferList')
-@Experimental() // untriaged
-@Native("WebKitSourceBufferList")
-abstract class _WebKitSourceBufferList extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitSourceBufferList._() { throw new UnsupportedError("Not supported"); }
-
-  @JSName('item')
-  @DomName('WebKitSourceBufferList.item')
-  @DocsEditable()
-  @Experimental() // untriaged
-  _WebKitSourceBuffer _item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable()
 @DomName('WindowTimers')
 @Experimental() // untriaged
 abstract class _WindowTimers extends Interceptor {
@@ -31612,7 +32822,7 @@
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
 @Experimental()
 @Native("WorkerNavigator")
-abstract class _WorkerNavigator extends Interceptor implements NavigatorOnLine, NavigatorID {
+abstract class _WorkerNavigator extends NavigatorCpu implements NavigatorOnLine, NavigatorID {
   // To suppress missing implicit constructor warnings.
   factory _WorkerNavigator._() { throw new UnsupportedError("Not supported"); }
 
@@ -35720,6 +36930,10 @@
   Events get on => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _addEventListener([String type, EventListener listener, bool useCapture])
+      => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void addEventListener(String type, EventListener listener, [bool useCapture])
       => throw new UnsupportedError(
         'You can only attach EventListeners to your own window.');
@@ -35727,6 +36941,10 @@
   bool dispatchEvent(Event event) => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _removeEventListener([String type, EventListener listener,
+      bool useCapture]) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void removeEventListener(String type, EventListener listener,
       [bool useCapture]) => throw new UnsupportedError(
           'You can only attach EventListeners to your own window.');
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index da69945..ec2657a 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -124,13 +124,21 @@
   'JsFunction': () => js.JsFunction,
   'JsArray': () => js.JsArray,
   'AbstractWorker': () => AbstractWorker,
-  'Algorithm': () => Algorithm,
+  'AesKeyAlgorithm': () => AesKeyAlgorithm,
   'Animation': () => Animation,
+  'AnimationEffect': () => AnimationEffect,
+  'AnimationNode': () => AnimationNode,
+  'AnimationPlayer': () => AnimationPlayer,
+  'AnimationPlayerEvent': () => AnimationPlayerEvent,
+  'AnimationTimeline': () => AnimationTimeline,
   'ApplicationCache': () => ApplicationCache,
+  'ApplicationCacheErrorEvent': () => ApplicationCacheErrorEvent,
   'Attr': () => _Attr,
+  'AudioTrack': () => AudioTrack,
+  'AudioTrackList': () => AudioTrackList,
   'AutocompleteErrorEvent': () => AutocompleteErrorEvent,
   'BarProp': () => BarProp,
-  'BeforeLoadEvent': () => BeforeLoadEvent,
+  'BatteryManager': () => BatteryManager,
   'BeforeUnloadEvent': () => BeforeUnloadEvent,
   'Blob': () => Blob,
   'CDATASection': () => CDataSection,
@@ -156,14 +164,14 @@
   'CSSViewportRule': () => CssViewportRule,
   'Canvas2DContextAttributes': () => Canvas2DContextAttributes,
   'CanvasGradient': () => CanvasGradient,
+  'CanvasPathMethods': () => _CanvasPathMethods,
   'CanvasPattern': () => CanvasPattern,
-  'CanvasRenderingContext': () => CanvasRenderingContext,
   'CanvasRenderingContext2D': () => CanvasRenderingContext2D,
   'CharacterData': () => CharacterData,
   'ChildNode': () => ChildNode,
+  'Client': () => Client,
   'ClientRect': () => _ClientRect,
   'ClientRectList': () => _ClientRectList,
-  'Clipboard': () => DataTransfer,
   'CloseEvent': () => CloseEvent,
   'Comment': () => Comment,
   'CompositionEvent': () => CompositionEvent,
@@ -183,6 +191,7 @@
   'DOMStringList': () => DomStringList,
   'DOMStringMap': () => DomStringMap,
   'DOMTokenList': () => DomTokenList,
+  'DataTransfer': () => DataTransfer,
   'DataTransferItem': () => DataTransferItem,
   'DataTransferItemList': () => DataTransferItemList,
   'DatabaseSync': () => _DatabaseSync,
@@ -190,6 +199,7 @@
   'DeprecatedStorageInfo': () => DeprecatedStorageInfo,
   'DeprecatedStorageQuota': () => DeprecatedStorageQuota,
   'DeviceAcceleration': () => DeviceAcceleration,
+  'DeviceLightEvent': () => DeviceLightEvent,
   'DeviceMotionEvent': () => DeviceMotionEvent,
   'DeviceOrientationEvent': () => DeviceOrientationEvent,
   'DeviceRotationRate': () => DeviceRotationRate,
@@ -207,6 +217,7 @@
   'Event': () => Event,
   'EventSource': () => EventSource,
   'EventTarget': () => EventTarget,
+  'FetchEvent': () => FetchEvent,
   'File': () => File,
   'FileEntry': () => FileEntry,
   'FileEntrySync': () => _FileEntrySync,
@@ -221,6 +232,8 @@
   'FontFaceSet': () => FontFaceSet,
   'FormData': () => FormData,
   'Gamepad': () => Gamepad,
+  'GamepadButton': () => GamepadButton,
+  'GamepadEvent': () => GamepadEvent,
   'GamepadList': () => _GamepadList,
   'Geolocation': () => Geolocation,
   'Geoposition': () => Geoposition,
@@ -279,6 +292,7 @@
   'HTMLOutputElement': () => OutputElement,
   'HTMLParagraphElement': () => ParagraphElement,
   'HTMLParamElement': () => ParamElement,
+  'HTMLPictureElement': () => PictureElement,
   'HTMLPreElement': () => PreElement,
   'HTMLProgressElement': () => ProgressElement,
   'HTMLQuoteElement': () => QuoteElement,
@@ -302,7 +316,9 @@
   'HTMLUnknownElement': () => UnknownElement,
   'HTMLVideoElement': () => VideoElement,
   'HashChangeEvent': () => HashChangeEvent,
+  'HeaderMap': () => HeaderMap,
   'History': () => History,
+  'HmacKeyAlgorithm': () => HmacKeyAlgorithm,
   'ImageBitmap': () => ImageBitmap,
   'ImageData': () => ImageData,
   'InjectedScriptHost': () => InjectedScriptHost,
@@ -310,17 +326,17 @@
   'InstallEvent': () => InstallEvent,
   'InstallPhaseEvent': () => InstallPhaseEvent,
   'Key': () => CryptoKey,
-  'KeyPair': () => KeyPair,
+  'KeyAlgorithm': () => KeyAlgorithm,
   'KeyboardEvent': () => KeyboardEvent,
   'Location': () => Location,
   'MIDIAccess': () => MidiAccess,
-  'MIDIAccessPromise': () => MidiAccessPromise,
   'MIDIConnectionEvent': () => MidiConnectionEvent,
   'MIDIInput': () => MidiInput,
   'MIDIMessageEvent': () => MidiMessageEvent,
   'MIDIOutput': () => MidiOutput,
   'MIDIPort': () => MidiPort,
   'MediaController': () => MediaController,
+  'MediaDeviceInfo': () => MediaDeviceInfo,
   'MediaError': () => MediaError,
   'MediaKeyError': () => MediaKeyError,
   'MediaKeyEvent': () => MediaKeyEvent,
@@ -348,21 +364,23 @@
   'MutationRecord': () => MutationRecord,
   'NamedNodeMap': () => _NamedNodeMap,
   'Navigator': () => Navigator,
+  'NavigatorCPU': () => NavigatorCpu,
   'NavigatorID': () => NavigatorID,
+  'NavigatorLanguage': () => NavigatorLanguage,
   'NavigatorOnLine': () => NavigatorOnLine,
   'NavigatorUserMediaError': () => NavigatorUserMediaError,
+  'NetworkInformation': () => NetworkInformation,
   'Node': () => Node,
   'NodeFilter': () => NodeFilter,
   'NodeIterator': () => NodeIterator,
   'NodeList': () => NodeList,
   'Notation': () => _Notation,
   'Notification': () => Notification,
-  'NotificationCenter': () => _NotificationCenter,
   'OverflowEvent': () => OverflowEvent,
   'PagePopupController': () => _PagePopupController,
   'PageTransitionEvent': () => PageTransitionEvent,
   'ParentNode': () => ParentNode,
-  'Path': () => Path,
+  'Path2D': () => Path2D,
   'Performance': () => Performance,
   'PerformanceEntry': () => PerformanceEntry,
   'PerformanceMark': () => PerformanceMark,
@@ -370,13 +388,15 @@
   'PerformanceNavigation': () => PerformanceNavigation,
   'PerformanceResourceTiming': () => PerformanceResourceTiming,
   'PerformanceTiming': () => PerformanceTiming,
-  'Player': () => Player,
   'Plugin': () => Plugin,
   'PluginArray': () => PluginArray,
   'PopStateEvent': () => PopStateEvent,
   'PositionError': () => PositionError,
   'ProcessingInstruction': () => ProcessingInstruction,
   'ProgressEvent': () => ProgressEvent,
+  'PushEvent': () => PushEvent,
+  'PushManager': () => PushManager,
+  'PushRegistration': () => PushRegistration,
   'RGBColor': () => _RGBColor,
   'RTCDTMFSender': () => RtcDtmfSender,
   'RTCDTMFToneChangeEvent': () => RtcDtmfToneChangeEvent,
@@ -391,11 +411,16 @@
   'RadioNodeList': () => _RadioNodeList,
   'Range': () => Range,
   'Rect': () => _Rect,
+  'Request': () => Request,
   'ResourceProgressEvent': () => ResourceProgressEvent,
+  'Response': () => _Response,
+  'RsaHashedKeyAlgorithm': () => RsaHashedKeyAlgorithm,
+  'RsaKeyAlgorithm': () => RsaKeyAlgorithm,
   'Screen': () => Screen,
   'SecurityPolicyViolationEvent': () => SecurityPolicyViolationEvent,
   'Selection': () => Selection,
   'ServiceWorker': () => _ServiceWorker,
+  'ServiceWorkerClients': () => ServiceWorkerClients,
   'ServiceWorkerContainer': () => ServiceWorkerContainer,
   'ServiceWorkerGlobalScope': () => ServiceWorkerGlobalScope,
   'ShadowRoot': () => ShadowRoot,
@@ -406,9 +431,6 @@
   'SourceInfo': () => SourceInfo,
   'SpeechGrammar': () => SpeechGrammar,
   'SpeechGrammarList': () => SpeechGrammarList,
-  'SpeechInputEvent': () => SpeechInputEvent,
-  'SpeechInputResult': () => SpeechInputResult,
-  'SpeechInputResultList': () => _SpeechInputResultList,
   'SpeechRecognition': () => SpeechRecognition,
   'SpeechRecognitionAlternative': () => SpeechRecognitionAlternative,
   'SpeechRecognitionError': () => SpeechRecognitionError,
@@ -436,8 +458,6 @@
   'TextTrackCueList': () => TextTrackCueList,
   'TextTrackList': () => TextTrackList,
   'TimeRanges': () => TimeRanges,
-  'TimedItem': () => TimedItem,
-  'Timeline': () => Timeline,
   'Timing': () => Timing,
   'Touch': () => Touch,
   'TouchEvent': () => TouchEvent,
@@ -454,16 +474,14 @@
   'VTTRegionList': () => VttRegionList,
   'ValidityState': () => ValidityState,
   'VideoPlaybackQuality': () => VideoPlaybackQuality,
+  'VideoTrack': () => VideoTrack,
+  'VideoTrackList': () => VideoTrackList,
   '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,
@@ -472,7 +490,6 @@
   'WindowTimers': () => _WindowTimers,
   'Worker': () => Worker,
   'WorkerConsole': () => WorkerConsole,
-  'WorkerCrypto': () => WorkerCrypto,
   'WorkerGlobalScope': () => WorkerGlobalScope,
   'WorkerLocation': () => _WorkerLocation,
   'WorkerNavigator': () => _WorkerNavigator,
@@ -489,9 +506,6 @@
   '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,
 };
 
 // TODO(leafp): We may want to move this elsewhere if html becomes
@@ -615,16 +629,16 @@
 
 
 @DocsEditable()
-@DomName('Algorithm')
+@DomName('AesKeyAlgorithm')
 @Experimental() // untriaged
-class Algorithm extends NativeFieldWrapperClass2 {
+class AesKeyAlgorithm extends KeyAlgorithm {
   // To suppress missing implicit constructor warnings.
-  factory Algorithm._() { throw new UnsupportedError("Not supported"); }
+  factory AesKeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Algorithm.name')
+  @DomName('AesKeyAlgorithm.length')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkAlgorithm.name_Getter(this);
+  int get length => _blink.BlinkAesKeyAlgorithm.length_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -670,6 +684,16 @@
   @DocsEditable()
   void set hreflang(String value) => _blink.BlinkHTMLAnchorElement.hreflang_Setter_DOMString(this, value);
 
+  @DomName('HTMLAnchorElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLAnchorElement.integrity_Getter(this);
+
+  @DomName('HTMLAnchorElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLAnchorElement.integrity_Setter_DOMString(this, value);
+
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
   String get rel => _blink.BlinkHTMLAnchorElement.rel_Getter(this);
@@ -799,21 +823,21 @@
 @DocsEditable()
 @DomName('Animation')
 @Experimental() // untriaged
-class Animation extends TimedItem {
+class Animation extends AnimationNode {
   // To suppress missing implicit constructor warnings.
   factory Animation._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('Animation.Animation')
   @DocsEditable()
   factory Animation(Element target, List<Map> keyframes, [timingInput]) {
-    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return _blink.BlinkAnimation.constructorCallback_Element_SEQ_Dictionary_SEQ_Dictionary(target, keyframes, timingInput);
+    if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
+      return _blink.BlinkAnimation.constructorCallback_Element_SEQ_Dictionary_SEQ(target, keyframes);
     }
     if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
       return _blink.BlinkAnimation.constructorCallback_Element_SEQ_Dictionary_SEQ_double(target, keyframes, timingInput);
     }
-    if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
-      return _blink.BlinkAnimation.constructorCallback_Element_SEQ_Dictionary_SEQ(target, keyframes);
+    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
+      return _blink.BlinkAnimation.constructorCallback_Element_SEQ_Dictionary_SEQ_Dictionary(target, keyframes, timingInput);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -827,6 +851,21 @@
 
 
 @DocsEditable()
+@DomName('AnimationEffect')
+@Experimental() // untriaged
+class AnimationEffect extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationEffect._() { throw new UnsupportedError("Not supported"); }
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('WebKitAnimationEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -852,6 +891,206 @@
 
 
 @DocsEditable()
+@DomName('AnimationNode')
+@Experimental() // untriaged
+class AnimationNode extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationNode._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationNode.activeDuration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get activeDuration => _blink.BlinkAnimationNode.activeDuration_Getter(this);
+
+  @DomName('AnimationNode.currentIteration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get currentIteration => _blink.BlinkAnimationNode.currentIteration_Getter(this);
+
+  @DomName('AnimationNode.duration')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get duration => _blink.BlinkAnimationNode.duration_Getter(this);
+
+  @DomName('AnimationNode.endTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get endTime => _blink.BlinkAnimationNode.endTime_Getter(this);
+
+  @DomName('AnimationNode.localTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get localTime => _blink.BlinkAnimationNode.localTime_Getter(this);
+
+  @DomName('AnimationNode.player')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimationPlayer get player => _blink.BlinkAnimationNode.player_Getter(this);
+
+  @DomName('AnimationNode.startTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get startTime => _blink.BlinkAnimationNode.startTime_Getter(this);
+
+  @DomName('AnimationNode.timing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Timing get timing => _blink.BlinkAnimationNode.timing_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('AnimationPlayer')
+@Experimental() // untriaged
+class AnimationPlayer extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationPlayer._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationPlayer.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get currentTime => _blink.BlinkAnimationPlayer.currentTime_Getter(this);
+
+  @DomName('AnimationPlayer.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set currentTime(num value) => _blink.BlinkAnimationPlayer.currentTime_Setter_double(this, value);
+
+  @DomName('AnimationPlayer.finished')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get finished => _blink.BlinkAnimationPlayer.finished_Getter(this);
+
+  @DomName('AnimationPlayer.paused')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get paused => _blink.BlinkAnimationPlayer.paused_Getter(this);
+
+  @DomName('AnimationPlayer.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get playbackRate => _blink.BlinkAnimationPlayer.playbackRate_Getter(this);
+
+  @DomName('AnimationPlayer.playbackRate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set playbackRate(num value) => _blink.BlinkAnimationPlayer.playbackRate_Setter_double(this, value);
+
+  @DomName('AnimationPlayer.source')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimationNode get source => _blink.BlinkAnimationPlayer.source_Getter(this);
+
+  @DomName('AnimationPlayer.source')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set source(AnimationNode value) => _blink.BlinkAnimationPlayer.source_Setter_AnimationNode(this, value);
+
+  @DomName('AnimationPlayer.startTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num get startTime => _blink.BlinkAnimationPlayer.startTime_Getter(this);
+
+  @DomName('AnimationPlayer.startTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set startTime(num value) => _blink.BlinkAnimationPlayer.startTime_Setter_double(this, value);
+
+  @DomName('AnimationPlayer.timeLag')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get timeLag => _blink.BlinkAnimationPlayer.timeLag_Getter(this);
+
+  @DomName('AnimationPlayer.cancel')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cancel() => _blink.BlinkAnimationPlayer.cancel_Callback(this);
+
+  @DomName('AnimationPlayer.finish')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void finish() => _blink.BlinkAnimationPlayer.finish_Callback(this);
+
+  @DomName('AnimationPlayer.pause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void pause() => _blink.BlinkAnimationPlayer.pause_Callback(this);
+
+  @DomName('AnimationPlayer.play')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void play() => _blink.BlinkAnimationPlayer.play_Callback(this);
+
+  @DomName('AnimationPlayer.reverse')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void reverse() => _blink.BlinkAnimationPlayer.reverse_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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('AnimationPlayerEvent')
+@Experimental() // untriaged
+class AnimationPlayerEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationPlayerEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationPlayerEvent.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get currentTime => _blink.BlinkAnimationPlayerEvent.currentTime_Getter(this);
+
+  @DomName('AnimationPlayerEvent.timelineTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get timelineTime => _blink.BlinkAnimationPlayerEvent.timelineTime_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('AnimationTimeline')
+@Experimental() // untriaged
+class AnimationTimeline extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory AnimationTimeline._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AnimationTimeline.currentTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get currentTime => _blink.BlinkAnimationTimeline.currentTime_Getter(this);
+
+  @DomName('AnimationTimeline.play')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimationPlayer play(AnimationNode source) => _blink.BlinkAnimationTimeline.play_Callback_AnimationNode(this, source);
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 /**
  * ApplicationCache is accessed via [Window.applicationCache].
  */
@@ -1038,6 +1277,41 @@
 
 
 @DocsEditable()
+@DomName('ApplicationCacheErrorEvent')
+@Experimental() // untriaged
+class ApplicationCacheErrorEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory ApplicationCacheErrorEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('ApplicationCacheErrorEvent.message')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get message => _blink.BlinkApplicationCacheErrorEvent.message_Getter(this);
+
+  @DomName('ApplicationCacheErrorEvent.reason')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get reason => _blink.BlinkApplicationCacheErrorEvent.reason_Getter(this);
+
+  @DomName('ApplicationCacheErrorEvent.status')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get status => _blink.BlinkApplicationCacheErrorEvent.status_Getter(this);
+
+  @DomName('ApplicationCacheErrorEvent.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get url => _blink.BlinkApplicationCacheErrorEvent.url_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 /**
  * DOM Area Element, which links regions of an image map with a hyperlink.
  *
@@ -1224,6 +1498,91 @@
 
 
 @DocsEditable()
+@DomName('AudioTrack')
+@Experimental() // untriaged
+class AudioTrack extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory AudioTrack._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AudioTrack.enabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get enabled => _blink.BlinkAudioTrack.enabled_Getter(this);
+
+  @DomName('AudioTrack.enabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set enabled(bool value) => _blink.BlinkAudioTrack.enabled_Setter_boolean(this, value);
+
+  @DomName('AudioTrack.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get id => _blink.BlinkAudioTrack.id_Getter(this);
+
+  @DomName('AudioTrack.kind')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get kind => _blink.BlinkAudioTrack.kind_Getter(this);
+
+  @DomName('AudioTrack.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get label => _blink.BlinkAudioTrack.label_Getter(this);
+
+  @DomName('AudioTrack.language')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get language => _blink.BlinkAudioTrack.language_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('AudioTrackList')
+@Experimental() // untriaged
+class AudioTrackList extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory AudioTrackList._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AudioTrackList.changeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+
+  @DomName('AudioTrackList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkAudioTrackList.length_Getter(this);
+
+  @DomName('AudioTrackList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioTrack __getter__(int index) => _blink.BlinkAudioTrackList.$__getter___Callback_ul(this, index);
+
+  @DomName('AudioTrackList.getTrackById')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioTrack getTrackById(String id) => _blink.BlinkAudioTrackList.getTrackById_Callback_DOMString(this, id);
+
+  @DomName('AudioTrackList.onchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onChange => changeEvent.forTarget(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('AutocompleteErrorEvent')
 // http://wiki.whatwg.org/wiki/RequestAutocomplete
 @Experimental()
@@ -1328,11 +1687,28 @@
 
 
 @DocsEditable()
-@DomName('BeforeLoadEvent')
-@Experimental()
-class BeforeLoadEvent extends Event {
+@DomName('BatteryManager')
+// https://dvcs.w3.org/hg/dap/raw-file/default/battery/Overview.html#batterymanager-interface
+@Experimental() // stable
+class BatteryManager extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory BeforeLoadEvent._() { throw new UnsupportedError("Not supported"); }
+  factory BatteryManager._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('BatteryManager.charging')
+  @DocsEditable()
+  bool get charging => _blink.BlinkBatteryManager.charging_Getter(this);
+
+  @DomName('BatteryManager.chargingTime')
+  @DocsEditable()
+  double get chargingTime => _blink.BlinkBatteryManager.chargingTime_Getter(this);
+
+  @DomName('BatteryManager.dischargingTime')
+  @DocsEditable()
+  double get dischargingTime => _blink.BlinkBatteryManager.dischargingTime_Getter(this);
+
+  @DomName('BatteryManager.level')
+  @DocsEditable()
+  double get level => _blink.BlinkBatteryManager.level_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1382,6 +1758,11 @@
   @DocsEditable()
   String get type => _blink.BlinkBlob.type_Getter(this);
 
+  @DomName('Blob.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() => _blink.BlinkBlob.close_Callback(this);
+
   Blob slice([int start, int end, String contentType]) {
     if (contentType != null) {
       return _blink.BlinkBlob.slice_Callback_ll_ll_DOMString(this, start, end, contentType);
@@ -1782,6 +2163,16 @@
   @DocsEditable()
   void set alpha(bool value) => _blink.BlinkCanvas2DContextAttributes.alpha_Setter_boolean(this, value);
 
+  @DomName('Canvas2DContextAttributes.storage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get storage => _blink.BlinkCanvas2DContextAttributes.storage_Getter(this);
+
+  @DomName('Canvas2DContextAttributes.storage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set storage(String value) => _blink.BlinkCanvas2DContextAttributes.storage_Setter_DOMString(this, value);
+
 }
 // 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
@@ -1850,7 +2241,7 @@
 
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
-  CanvasRenderingContext getContext(String contextId, [Map attrs]) => _blink.BlinkHTMLCanvasElement.getContext_Callback_DOMString_Dictionary(this, contextId, attrs);
+  Object getContext(String contextId, [Map attrs]) => _blink.BlinkHTMLCanvasElement.getContext_Callback_DOMString_Dictionary(this, contextId, attrs);
 
   @DomName('HTMLCanvasElement.toDataURL')
   @DocsEditable()
@@ -2045,37 +2436,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.
 
-// WARNING: Do not edit - generated code.
 
-
-@DocsEditable()
-/**
- * A rendering context for a canvas element.
- *
- * This context is extended by [CanvasRenderingContext2D] and
- * [WebGLRenderingContext].
- */
-@DomName('CanvasRenderingContext')
-class CanvasRenderingContext extends NativeFieldWrapperClass2 {
-  // To suppress missing implicit constructor warnings.
-  factory CanvasRenderingContext._() { throw new UnsupportedError("Not supported"); }
-
-  /// Reference to the canvas element to which this context belongs.
-  @DomName('CanvasRenderingContext.canvas')
-  @DocsEditable()
-  CanvasElement get canvas => _blink.BlinkCanvasRenderingContext.canvas_Getter(this);
-
+abstract class CanvasRenderingContext {
+  CanvasElement get canvas;
 }
-// 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.
-
 
 @DomName('CanvasRenderingContext2D')
-class CanvasRenderingContext2D extends CanvasRenderingContext {
+class CanvasRenderingContext2D extends NativeFieldWrapperClass2 implements CanvasRenderingContext {
   // To suppress missing implicit constructor warnings.
   factory CanvasRenderingContext2D._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('CanvasRenderingContext2D.canvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CanvasElement get canvas => _blink.BlinkCanvasRenderingContext2D.canvas_Getter(this);
+
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
@@ -2244,39 +2619,34 @@
   @DocsEditable()
   void set textBaseline(String value) => _blink.BlinkCanvasRenderingContext2D.textBaseline_Setter_DOMString(this, value);
 
-  @DomName('CanvasRenderingContext2D.arc')
-  @DocsEditable()
-  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.arc_Callback_float_float_float_float_float_boolean(this, x, y, radius, startAngle, endAngle, anticlockwise);
-
-  @DomName('CanvasRenderingContext2D.arcTo')
-  @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkCanvasRenderingContext2D.arcTo_Callback_float_float_float_float_float(this, x1, y1, x2, y2, radius);
-
   @DomName('CanvasRenderingContext2D.beginPath')
   @DocsEditable()
   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.BlinkCanvasRenderingContext2D.bezierCurveTo_Callback_float_float_float_float_float_float(this, cp1x, cp1y, cp2x, cp2y, x, y);
-
   @DomName('CanvasRenderingContext2D.clearRect')
   @DocsEditable()
   void clearRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.clearRect_Callback_float_float_float_float(this, x, y, width, height);
 
-  void clip([String winding]) {
-    if (winding != null) {
-      _blink.BlinkCanvasRenderingContext2D.clip_Callback_DOMString(this, winding);
+  void clip([path_OR_winding, String winding]) {
+    if (path_OR_winding == null && winding == null) {
+      _blink.BlinkCanvasRenderingContext2D.clip_Callback(this);
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.clip_Callback(this);
-    return;
+    if ((path_OR_winding is String) && winding == null) {
+      _blink.BlinkCanvasRenderingContext2D.clip_Callback_DOMString(this, path_OR_winding);
+      return;
+    }
+    if ((path_OR_winding is Path2D) && winding == null) {
+      _blink.BlinkCanvasRenderingContext2D.clip_Callback_Path2D(this, path_OR_winding);
+      return;
+    }
+    if ((winding is String) && (path_OR_winding is Path2D)) {
+      _blink.BlinkCanvasRenderingContext2D.clip_Callback_Path2D_DOMString(this, path_OR_winding, winding);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('CanvasRenderingContext2D.closePath')
-  @DocsEditable()
-  void closePath() => _blink.BlinkCanvasRenderingContext2D.closePath_Callback(this);
-
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
   ImageData createImageData(num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.createImageData_Callback_float_float(this, sw, sh);
@@ -2289,9 +2659,15 @@
   @DocsEditable()
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => _blink.BlinkCanvasRenderingContext2D.createLinearGradient_Callback_float_float_float_float(this, x0, y0, x1, y1);
 
-  @DomName('CanvasRenderingContext2D.createPattern')
-  @DocsEditable()
-  CanvasPattern createPattern(CanvasElement canvas, String repetitionType) => _blink.BlinkCanvasRenderingContext2D.createPattern_Callback_HTMLCanvasElement_DOMString(this, canvas, repetitionType);
+  CanvasPattern createPattern(canvas_OR_image, String repetitionType) {
+    if ((repetitionType is String || repetitionType == null) && (canvas_OR_image is CanvasElement)) {
+      return _blink.BlinkCanvasRenderingContext2D.createPattern_Callback_HTMLCanvasElement_DOMString(this, canvas_OR_image, repetitionType);
+    }
+    if ((repetitionType is String || repetitionType == null) && (canvas_OR_image is VideoElement)) {
+      return _blink.BlinkCanvasRenderingContext2D.createPattern_Callback_HTMLVideoElement_DOMString(this, canvas_OR_image, repetitionType);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
 
   @DomName('CanvasRenderingContext2D.createPatternFromImage')
   @DocsEditable()
@@ -2301,75 +2677,88 @@
   @DocsEditable()
   CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => _blink.BlinkCanvasRenderingContext2D.createRadialGradient_Callback_float_float_float_float_float_float(this, x0, y0, r0, x1, y1, r1);
 
-  @DomName('CanvasRenderingContext2D.drawCustomFocusRing')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool drawCustomFocusRing(Element element) => _blink.BlinkCanvasRenderingContext2D.drawCustomFocusRing_Callback_Element(this, element);
+  void drawFocusIfNeeded(element_OR_path, [Element element]) {
+    if ((element_OR_path is Element) && element == null) {
+      _blink.BlinkCanvasRenderingContext2D.drawFocusIfNeeded_Callback_Element(this, element_OR_path);
+      return;
+    }
+    if ((element is Element) && (element_OR_path is Path2D)) {
+      _blink.BlinkCanvasRenderingContext2D.drawFocusIfNeeded_Callback_Path2D_Element(this, element_OR_path, element);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
 
   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]) {
-    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) {
+    if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_HTMLImageElement_float_float(this, 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) {
+    if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement) && dx == null && dy == null && dw == null && dh == null) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_HTMLImageElement_float_float_float_float(this, 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)) {
+    if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement)) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_HTMLImageElement_float_float_float_float_float_float_float_float(this, 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) {
+    if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_HTMLCanvasElement_float_float(this, 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) {
+    if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement) && dx == null && dy == null && dw == null && dh == null) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_HTMLCanvasElement_float_float_float_float(this, 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)) {
+    if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement)) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_HTMLCanvasElement_float_float_float_float_float_float_float_float(this, 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) {
+    if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_HTMLVideoElement_float_float(this, 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) {
+    if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement) && dx == null && dy == null && dw == null && dh == null) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_HTMLVideoElement_float_float_float_float(this, 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)) {
+    if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement)) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_HTMLVideoElement_float_float_float_float_float_float_float_float(this, 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) {
+    if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_ImageBitmap_float_float(this, 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) {
+    if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap) && dx == null && dy == null && dw == null && dh == null) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_ImageBitmap_float_float_float_float(this, 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)) {
+    if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap)) {
       _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_ImageBitmap_float_float_float_float_float_float_float_float(this, 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");
   }
 
-  @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.BlinkCanvasRenderingContext2D.ellipse_Callback_float_float_float_float_float_float_float_boolean(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
-
-  void fill([String winding]) {
-    if (winding != null) {
-      _blink.BlinkCanvasRenderingContext2D.fill_Callback_DOMString(this, winding);
+  void fill([path_OR_winding, String winding]) {
+    if (path_OR_winding == null && winding == null) {
+      _blink.BlinkCanvasRenderingContext2D.fill_Callback(this);
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.fill_Callback(this);
-    return;
+    if ((path_OR_winding is String) && winding == null) {
+      _blink.BlinkCanvasRenderingContext2D.fill_Callback_DOMString(this, path_OR_winding);
+      return;
+    }
+    if ((path_OR_winding is Path2D) && winding == null) {
+      _blink.BlinkCanvasRenderingContext2D.fill_Callback_Path2D(this, path_OR_winding);
+      return;
+    }
+    if ((winding is String) && (path_OR_winding is Path2D)) {
+      _blink.BlinkCanvasRenderingContext2D.fill_Callback_Path2D_DOMString(this, path_OR_winding, winding);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('CanvasRenderingContext2D.fillRect')
@@ -2399,49 +2788,53 @@
   @DocsEditable()
   List<num> _getLineDash() => _blink.BlinkCanvasRenderingContext2D.getLineDash_Callback(this);
 
-  bool isPointInPath(num x, num y, [String winding]) {
-    if (winding != null) {
-      return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_float_float_DOMString(this, x, y, winding);
+  @DomName('CanvasRenderingContext2D.isContextLost')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isContextLost() => _blink.BlinkCanvasRenderingContext2D.isContextLost_Callback(this);
+
+  bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding]) {
+    if ((x_OR_y is num) && (path_OR_x is num) && winding_OR_y == null && winding == null) {
+      return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_float_float(this, path_OR_x, x_OR_y);
     }
-    return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_float_float(this, x, y);
+    if ((winding_OR_y is String) && (x_OR_y is num) && (path_OR_x is num) && winding == null) {
+      return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_float_float_DOMString(this, path_OR_x, x_OR_y, winding_OR_y);
+    }
+    if ((winding_OR_y is num) && (x_OR_y is num) && (path_OR_x is Path2D) && winding == null) {
+      return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_Path2D_float_float(this, path_OR_x, x_OR_y, winding_OR_y);
+    }
+    if ((winding is String) && (winding_OR_y is num) && (x_OR_y is num) && (path_OR_x is Path2D)) {
+      return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_Path2D_float_float_DOMString(this, path_OR_x, x_OR_y, winding_OR_y, winding);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('CanvasRenderingContext2D.isPointInStroke')
-  @DocsEditable()
-  bool isPointInStroke(num x, num y) => _blink.BlinkCanvasRenderingContext2D.isPointInStroke_Callback_float_float(this, x, y);
-
-  @DomName('CanvasRenderingContext2D.lineTo')
-  @DocsEditable()
-  void lineTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.lineTo_Callback_float_float(this, x, y);
+  bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) {
+    if ((x_OR_y is num) && (path_OR_x is num) && y == null) {
+      return _blink.BlinkCanvasRenderingContext2D.isPointInStroke_Callback_float_float(this, path_OR_x, x_OR_y);
+    }
+    if ((y is num) && (x_OR_y is num) && (path_OR_x is Path2D)) {
+      return _blink.BlinkCanvasRenderingContext2D.isPointInStroke_Callback_Path2D_float_float(this, path_OR_x, x_OR_y, y);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
 
   @DomName('CanvasRenderingContext2D.measureText')
   @DocsEditable()
   TextMetrics measureText(String text) => _blink.BlinkCanvasRenderingContext2D.measureText_Callback_DOMString(this, text);
 
-  @DomName('CanvasRenderingContext2D.moveTo')
-  @DocsEditable()
-  void moveTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.moveTo_Callback_float_float(this, x, y);
-
   void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num 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) {
+    if ((dy is num) && (dx is num) && (imagedata is ImageData) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
       _blink.BlinkCanvasRenderingContext2D.putImageData_Callback_ImageData_float_float(this, 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)) {
+    if ((dirtyHeight is num) && (dirtyWidth is num) && (dirtyY is num) && (dirtyX is num) && (dy is num) && (dx is num) && (imagedata is ImageData)) {
       _blink.BlinkCanvasRenderingContext2D.putImageData_Callback_ImageData_float_float_float_float_float_float(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('CanvasRenderingContext2D.quadraticCurveTo')
-  @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkCanvasRenderingContext2D.quadraticCurveTo_Callback_float_float_float_float(this, cpx, cpy, x, y);
-
-  @DomName('CanvasRenderingContext2D.rect')
-  @DocsEditable()
-  void rect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.rect_Callback_float_float_float_float(this, x, y, width, height);
-
   @DomName('CanvasRenderingContext2D.resetTransform')
   @DocsEditable()
   @Experimental() // untriaged
@@ -2461,7 +2854,16 @@
 
   @DomName('CanvasRenderingContext2D.scale')
   @DocsEditable()
-  void scale(num sx, num sy) => _blink.BlinkCanvasRenderingContext2D.scale_Callback_float_float(this, sx, sy);
+  void scale(num x, num y) => _blink.BlinkCanvasRenderingContext2D.scale_Callback_float_float(this, x, y);
+
+  void scrollPathIntoView([Path2D path]) {
+    if (path != null) {
+      _blink.BlinkCanvasRenderingContext2D.scrollPathIntoView_Callback_Path2D(this, path);
+      return;
+    }
+    _blink.BlinkCanvasRenderingContext2D.scrollPathIntoView_Callback(this);
+    return;
+  }
 
   @DomName('CanvasRenderingContext2D.setLineDash')
   @DocsEditable()
@@ -2469,11 +2871,19 @@
 
   @DomName('CanvasRenderingContext2D.setTransform')
   @DocsEditable()
-  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.BlinkCanvasRenderingContext2D.setTransform_Callback_float_float_float_float_float_float(this, m11, m12, m21, m22, dx, dy);
+  void setTransform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.setTransform_Callback_float_float_float_float_float_float(this, a, b, c, d, e, f);
 
-  @DomName('CanvasRenderingContext2D.stroke')
-  @DocsEditable()
-  void stroke() => _blink.BlinkCanvasRenderingContext2D.stroke_Callback(this);
+  void stroke([Path2D path]) {
+    if (path == null) {
+      _blink.BlinkCanvasRenderingContext2D.stroke_Callback(this);
+      return;
+    }
+    if ((path is Path2D)) {
+      _blink.BlinkCanvasRenderingContext2D.stroke_Callback_Path2D(this, path);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
 
   @DomName('CanvasRenderingContext2D.strokeRect')
   @DocsEditable()
@@ -2490,11 +2900,48 @@
 
   @DomName('CanvasRenderingContext2D.transform')
   @DocsEditable()
-  void transform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.BlinkCanvasRenderingContext2D.transform_Callback_float_float_float_float_float_float(this, m11, m12, m21, m22, dx, dy);
+  void transform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.transform_Callback_float_float_float_float_float_float(this, a, b, c, d, e, f);
 
   @DomName('CanvasRenderingContext2D.translate')
   @DocsEditable()
-  void translate(num tx, num ty) => _blink.BlinkCanvasRenderingContext2D.translate_Callback_float_float(this, tx, ty);
+  void translate(num x, num y) => _blink.BlinkCanvasRenderingContext2D.translate_Callback_float_float(this, x, y);
+
+  @DomName('CanvasRenderingContext2D.arc')
+  @DocsEditable()
+  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.arc_Callback_float_float_float_float_float_boolean(this, x, y, radius, startAngle, endAngle, anticlockwise);
+
+  @DomName('CanvasRenderingContext2D.arcTo')
+  @DocsEditable()
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkCanvasRenderingContext2D.arcTo_Callback_float_float_float_float_float(this, x1, y1, x2, y2, radius);
+
+  @DomName('CanvasRenderingContext2D.bezierCurveTo')
+  @DocsEditable()
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkCanvasRenderingContext2D.bezierCurveTo_Callback_float_float_float_float_float_float(this, cp1x, cp1y, cp2x, cp2y, x, y);
+
+  @DomName('CanvasRenderingContext2D.closePath')
+  @DocsEditable()
+  void closePath() => _blink.BlinkCanvasRenderingContext2D.closePath_Callback(this);
+
+  @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.BlinkCanvasRenderingContext2D.ellipse_Callback_float_float_float_float_float_float_float_boolean(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
+
+  @DomName('CanvasRenderingContext2D.lineTo')
+  @DocsEditable()
+  void lineTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.lineTo_Callback_float_float(this, x, y);
+
+  @DomName('CanvasRenderingContext2D.moveTo')
+  @DocsEditable()
+  void moveTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.moveTo_Callback_float_float(this, x, y);
+
+  @DomName('CanvasRenderingContext2D.quadraticCurveTo')
+  @DocsEditable()
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkCanvasRenderingContext2D.quadraticCurveTo_Callback_float_float_float_float(this, cpx, cpy, x, y);
+
+  @DomName('CanvasRenderingContext2D.rect')
+  @DocsEditable()
+  void rect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.rect_Callback_float_float_float_float(this, x, y, width, height);
 
 
   /**
@@ -2536,6 +2983,7 @@
   @DomName('CanvasRenderingContext2D.arc')
   void arc(num x,  num y,  num radius,  num startAngle, num endAngle,
       [bool anticlockwise = false]) {
+    // TODO(terry): This should not be needed: dartbug.com/20939.
     _arc(x, y, radius, startAngle, endAngle, anticlockwise);
   }
 
@@ -2822,6 +3270,31 @@
 
 
 @DocsEditable()
+@DomName('Client')
+@Experimental() // untriaged
+class Client extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory Client._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Client.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get id => _blink.BlinkClient.id_Getter(this);
+
+  @DomName('Client.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> messagePorts]) => _blink.BlinkClient.postMessage_Callback_SerializedScriptValue_A_MessagePort_A(this, message, messagePorts);
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('CloseEvent')
 class CloseEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -2934,7 +3407,7 @@
   @DomName('ConsoleBase.assertCondition')
   @DocsEditable()
   @Experimental() // untriaged
-  void assertCondition(bool condition, Object arg) => _blink.BlinkConsoleBase.assertCondition_Callback_boolean_object(this, condition, arg);
+  void assertCondition(bool condition, Object arg) => _blink.BlinkConsoleBase.assert_Callback_boolean_object(this, condition, arg);
 
   @DomName('ConsoleBase.clear')
   @DocsEditable()
@@ -3076,14 +3549,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-  @DomName('HTMLContentElement.resetStyleInheritance')
-  @DocsEditable()
-  bool get resetStyleInheritance => _blink.BlinkHTMLContentElement.resetStyleInheritance_Getter(this);
-
-  @DomName('HTMLContentElement.resetStyleInheritance')
-  @DocsEditable()
-  void set resetStyleInheritance(bool value) => _blink.BlinkHTMLContentElement.resetStyleInheritance_Setter_boolean(this, value);
-
   @DomName('HTMLContentElement.select')
   @DocsEditable()
   String get select => _blink.BlinkHTMLContentElement.select_Getter(this);
@@ -3186,7 +3651,7 @@
   @DomName('Key.algorithm')
   @DocsEditable()
   @Experimental() // untriaged
-  Algorithm get algorithm => _blink.BlinkKey.algorithm_Getter(this);
+  KeyAlgorithm get algorithm => _blink.BlinkKey.algorithm_Getter(this);
 
   @DomName('Key.extractable')
   @DocsEditable()
@@ -3678,6 +4143,11 @@
   @DocsEditable()
   CssRule get parentRule => _blink.BlinkCSSStyleDeclaration.parentRule_Getter(this);
 
+  @DomName('CSSStyleDeclaration.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object __getter__(String name) => _blink.BlinkCSSStyleDeclaration.$__getter___Callback_DOMString(this, name);
+
   @DomName('CSSStyleDeclaration.__propertyQuery__')
   @DocsEditable()
   @Experimental() // untriaged
@@ -7066,75 +7536,70 @@
 
 
 @DocsEditable()
-@DomName('Clipboard')
+@DomName('DataTransfer')
+@Experimental() // untriaged
 class DataTransfer extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory DataTransfer._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Clipboard.dropEffect')
+  @DomName('DataTransfer.dropEffect')
   @DocsEditable()
-  String get dropEffect => _blink.BlinkClipboard.dropEffect_Getter(this);
+  @Experimental() // untriaged
+  String get dropEffect => _blink.BlinkDataTransfer.dropEffect_Getter(this);
 
-  @DomName('Clipboard.dropEffect')
+  @DomName('DataTransfer.dropEffect')
   @DocsEditable()
-  void set dropEffect(String value) => _blink.BlinkClipboard.dropEffect_Setter_DOMString(this, value);
+  @Experimental() // untriaged
+  void set dropEffect(String value) => _blink.BlinkDataTransfer.dropEffect_Setter_DOMString(this, value);
 
-  @DomName('Clipboard.effectAllowed')
+  @DomName('DataTransfer.effectAllowed')
   @DocsEditable()
-  String get effectAllowed => _blink.BlinkClipboard.effectAllowed_Getter(this);
+  @Experimental() // untriaged
+  String get effectAllowed => _blink.BlinkDataTransfer.effectAllowed_Getter(this);
 
-  @DomName('Clipboard.effectAllowed')
+  @DomName('DataTransfer.effectAllowed')
   @DocsEditable()
-  void set effectAllowed(String value) => _blink.BlinkClipboard.effectAllowed_Setter_DOMString(this, value);
+  @Experimental() // untriaged
+  void set effectAllowed(String value) => _blink.BlinkDataTransfer.effectAllowed_Setter_DOMString(this, value);
 
-  @DomName('Clipboard.files')
+  @DomName('DataTransfer.files')
   @DocsEditable()
-  List<File> get files => _blink.BlinkClipboard.files_Getter(this);
+  @Experimental() // untriaged
+  List<File> get files => _blink.BlinkDataTransfer.files_Getter(this);
 
-  @DomName('Clipboard.items')
+  @DomName('DataTransfer.items')
   @DocsEditable()
-  DataTransferItemList get items => _blink.BlinkClipboard.items_Getter(this);
+  @Experimental() // untriaged
+  DataTransferItemList get items => _blink.BlinkDataTransfer.items_Getter(this);
 
-  @DomName('Clipboard.types')
+  @DomName('DataTransfer.types')
   @DocsEditable()
-  List<String> get types => _blink.BlinkClipboard.types_Getter(this);
+  @Experimental() // untriaged
+  List<String> get types => _blink.BlinkDataTransfer.types_Getter(this);
 
   void clearData([String type]) {
     if (type != null) {
-      _blink.BlinkClipboard.clearData_Callback_DOMString(this, type);
+      _blink.BlinkDataTransfer.clearData_Callback_DOMString(this, type);
       return;
     }
-    _blink.BlinkClipboard.clearData_Callback(this);
+    _blink.BlinkDataTransfer.clearData_Callback(this);
     return;
   }
 
-  /**
-   * Gets the data for the specified type.
-   *
-   * The data is only available from within a drop operation (such as an
-   * [Element.onDrop] event) and will return null before the event is
-   * triggered.
-   *
-   * Data transfer is prohibited across domains. If a drag originates
-   * from content from another domain or protocol (HTTP vs HTTPS) then the
-   * data cannot be accessed.
-   *
-   * The [type] can have values such as:
-   *
-   * * `'Text'`
-   * * `'URL'`
-   */
-  @DomName('Clipboard.getData')
+  @DomName('DataTransfer.getData')
   @DocsEditable()
-  String getData(String type) => _blink.BlinkClipboard.getData_Callback_DOMString(this, type);
+  @Experimental() // untriaged
+  String getData(String type) => _blink.BlinkDataTransfer.getData_Callback_DOMString(this, type);
 
-  @DomName('Clipboard.setData')
+  @DomName('DataTransfer.setData')
   @DocsEditable()
-  bool setData(String type, String data) => _blink.BlinkClipboard.setData_Callback_DOMString_DOMString(this, type, data);
+  @Experimental() // untriaged
+  bool setData(String type, String data) => _blink.BlinkDataTransfer.setData_Callback_DOMString_DOMString(this, type, data);
 
-  @DomName('Clipboard.setDragImage')
+  @DomName('DataTransfer.setDragImage')
   @DocsEditable()
-  void setDragImage(Element image, int x, int y) => _blink.BlinkClipboard.setDragImage_Callback_Element_long_long(this, image, x, y);
+  @Experimental() // untriaged
+  void setDragImage(Element image, int x, int y) => _blink.BlinkDataTransfer.setDragImage_Callback_Element_long_long(this, image, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7206,12 +7671,12 @@
   DataTransferItem __getter__(int index) => _blink.BlinkDataTransferItemList.$__getter___Callback_ul(this, index);
 
   DataTransferItem add(data_OR_file, [String type]) {
+    if ((type is String) && (data_OR_file is String)) {
+      return _blink.BlinkDataTransferItemList.add_Callback_DOMString_DOMString(this, data_OR_file, type);
+    }
     if ((data_OR_file is File || data_OR_file == null) && type == null) {
       return _blink.BlinkDataTransferItemList.add_Callback_File(this, data_OR_file);
     }
-    if ((type is String || type == null) && (data_OR_file is String || data_OR_file == null)) {
-      return _blink.BlinkDataTransferItemList.add_Callback_DOMString_DOMString(this, data_OR_file, type);
-    }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
@@ -7420,6 +7885,26 @@
 
 
 @DocsEditable()
+@DomName('DeviceLightEvent')
+@Experimental() // untriaged
+class DeviceLightEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory DeviceLightEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('DeviceLightEvent.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get value => _blink.BlinkDeviceLightEvent.value_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('DeviceMotionEvent')
 // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
 @Experimental()
@@ -7829,6 +8314,11 @@
   @DocsEditable()
   void set _body(HtmlElement value) => _blink.BlinkDocument.body_Setter_HTMLElement(this, value);
 
+  @DomName('Document.contentType')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get contentType => _blink.BlinkDocument.contentType_Getter(this);
+
   @DomName('Document.cookie')
   @DocsEditable()
   String get cookie => _blink.BlinkDocument.cookie_Getter(this);
@@ -7876,6 +8366,11 @@
   @DocsEditable()
   String get _lastModified => _blink.BlinkDocument.lastModified_Getter(this);
 
+  @DomName('Document.pointerLockElement')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element get pointerLockElement => _blink.BlinkDocument.pointerLockElement_Getter(this);
+
   @DomName('Document.preferredStylesheetSet')
   @DocsEditable()
   String get _preferredStylesheetSet => _blink.BlinkDocument.preferredStylesheetSet_Getter(this);
@@ -7908,7 +8403,7 @@
   @DomName('Document.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  Timeline get timeline => _blink.BlinkDocument.timeline_Getter(this);
+  AnimationTimeline get timeline => _blink.BlinkDocument.timeline_Getter(this);
 
   @DomName('Document.title')
   @DocsEditable()
@@ -7985,12 +8480,9 @@
   @DocsEditable()
   Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.BlinkDocument.createElementNS_Callback_DOMString_DOMString(this, namespaceURI, qualifiedName, typeExtension);
 
-  Event _createEvent([String eventType]) {
-    if (eventType != null) {
-      return _blink.BlinkDocument.createEvent_Callback_DOMString(this, eventType);
-    }
-    return _blink.BlinkDocument.createEvent_Callback(this);
-  }
+  @DomName('Document.createEvent')
+  @DocsEditable()
+  Event _createEvent(String eventType) => _blink.BlinkDocument.createEvent_Callback_DOMString(this, eventType);
 
   NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) {
     if (filter != null) {
@@ -8014,7 +8506,13 @@
   @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.BlinkDocument.createTouch_Callback_Window_EventTarget_long_long_long_long_long_long_long_float_float(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
+  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num webkitRadiusX, num webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.BlinkDocument.createTouch_Callback_Window_EventTarget_long_double_double_double_double_double_double_float_float(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
+
+  @DomName('Document.createTouchList')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  TouchList _createTouchList(Touch touches) => _blink.BlinkDocument.createTouchList_Callback_Touch(this, touches);
 
   TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) {
     if (filter != null) {
@@ -8034,11 +8532,16 @@
   @DocsEditable()
   bool execCommand(String command, bool userInterface, String value) => _blink.BlinkDocument.execCommand_Callback_DOMString_boolean_DOMString(this, command, userInterface, value);
 
+  @DomName('Document.exitPointerLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void exitPointerLock() => _blink.BlinkDocument.exitPointerLock_Callback(this);
+
   @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.BlinkDocument.getCSSCanvasContext_Callback_DOMString_DOMString_long_long(this, contextId, name, width, height);
+  Object _getCssCanvasContext(String contextId, String name, int width, int height) => _blink.BlinkDocument.getCSSCanvasContext_Callback_DOMString_DOMString_long_long(this, contextId, name, width, height);
 
   @DomName('Document.getElementById')
   @DocsEditable()
@@ -8083,31 +8586,6 @@
   @DocsEditable()
   String queryCommandValue(String command) => _blink.BlinkDocument.queryCommandValue_Callback_DOMString(this, command);
 
-  /**
-   * Finds the first descendant element of this document that matches the
-   * specified group of selectors.
-   *
-   * Unless your webpage contains multiple documents, the top-level
-   * [querySelector]
-   * method behaves the same as this method, so you should use it instead to
-   * save typing a few characters.
-   *
-   * [selectors] should be a string using CSS selector syntax.
-   *
-   *     var element1 = document.querySelector('.className');
-   *     var element2 = document.querySelector('#id');
-   *
-   * For details about CSS selector syntax, see the
-   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
-   */
-  @DomName('Document.querySelector')
-  @DocsEditable()
-  Element querySelector(String selectors) => _blink.BlinkDocument.querySelector_Callback_DOMString(this, selectors);
-
-  @DomName('Document.querySelectorAll')
-  @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocument.querySelectorAll_Callback_DOMString(this, selectors);
-
   @DomName('Document.webkitExitFullscreen')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -8140,6 +8618,31 @@
   @DocsEditable()
   Element get _lastElementChild => _blink.BlinkDocument.lastElementChild_Getter(this);
 
+  /**
+   * Finds the first descendant element of this document that matches the
+   * specified group of selectors.
+   *
+   * Unless your webpage contains multiple documents, the top-level
+   * [querySelector]
+   * method behaves the same as this method, so you should use it instead to
+   * save typing a few characters.
+   *
+   * [selectors] should be a string using CSS selector syntax.
+   *
+   *     var element1 = document.querySelector('.className');
+   *     var element2 = document.querySelector('#id');
+   *
+   * For details about CSS selector syntax, see the
+   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+   */
+  @DomName('Document.querySelector')
+  @DocsEditable()
+  Element querySelector(String selectors) => _blink.BlinkDocument.querySelector_Callback_DOMString(this, selectors);
+
+  @DomName('Document.querySelectorAll')
+  @DocsEditable()
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocument.querySelectorAll_Callback_DOMString(this, selectors);
+
   /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
   @DocsEditable()
@@ -8165,6 +8668,16 @@
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  @DomName('Document.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onCanPlay => Element.canPlayEvent.forTarget(this);
+
+  @DomName('Document.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onCanPlayThrough => Element.canPlayThroughEvent.forTarget(this);
+
   /// Stream of `change` events handled by this [Document].
   @DomName('Document.onchange')
   @DocsEditable()
@@ -8230,6 +8743,21 @@
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  @DomName('Document.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onDurationChange => Element.durationChangeEvent.forTarget(this);
+
+  @DomName('Document.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEmptied => Element.emptiedEvent.forTarget(this);
+
+  @DomName('Document.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEnded => Element.endedEvent.forTarget(this);
+
   /// Stream of `error` events handled by this [Document].
   @DomName('Document.onerror')
   @DocsEditable()
@@ -8270,6 +8798,16 @@
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  @DomName('Document.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onLoadedData => Element.loadedDataEvent.forTarget(this);
+
+  @DomName('Document.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onLoadedMetadata => Element.loadedMetadataEvent.forTarget(this);
+
   /// Stream of `mousedown` events handled by this [Document].
   @DomName('Document.onmousedown')
   @DocsEditable()
@@ -8317,6 +8855,26 @@
   @DocsEditable()
   Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
 
+  @DomName('Document.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPause => Element.pauseEvent.forTarget(this);
+
+  @DomName('Document.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPlay => Element.playEvent.forTarget(this);
+
+  @DomName('Document.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPlaying => Element.playingEvent.forTarget(this);
+
+  @DomName('Document.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onRateChange => Element.rateChangeEvent.forTarget(this);
+
   /// Stream of `readystatechange` events handled by this [Document].
   @DomName('Document.onreadystatechange')
   @DocsEditable()
@@ -8351,6 +8909,16 @@
   @Experimental()
   Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation => securityPolicyViolationEvent.forTarget(this);
 
+  @DomName('Document.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSeeked => Element.seekedEvent.forTarget(this);
+
+  @DomName('Document.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSeeking => Element.seekingEvent.forTarget(this);
+
   /// Stream of `select` events handled by this [Document].
   @DomName('Document.onselect')
   @DocsEditable()
@@ -8366,11 +8934,26 @@
   @DocsEditable()
   Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
 
+  @DomName('Document.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onStalled => Element.stalledEvent.forTarget(this);
+
   /// Stream of `submit` events handled by this [Document].
   @DomName('Document.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  @DomName('Document.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSuspend => Element.suspendEvent.forTarget(this);
+
+  @DomName('Document.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onTimeUpdate => Element.timeUpdateEvent.forTarget(this);
+
   /// Stream of `touchcancel` events handled by this [Document].
   @DomName('Document.ontouchcancel')
   @DocsEditable()
@@ -8399,6 +8982,16 @@
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  @DomName('Document.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onVolumeChange => Element.volumeChangeEvent.forTarget(this);
+
+  @DomName('Document.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onWaiting => Element.waitingEvent.forTarget(this);
+
   /// Stream of `fullscreenchange` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenchange')
   @DocsEditable()
@@ -8604,6 +9197,23 @@
   // To suppress missing implicit constructor warnings.
   factory DocumentFragment._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('DocumentFragment.getElementById')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element getElementById(String elementId) => _blink.BlinkDocumentFragment.getElementById_Callback_DOMString(this, elementId);
+
+  @DomName('DocumentFragment.childElementCount')
+  @DocsEditable()
+  int get _childElementCount => _blink.BlinkDocumentFragment.childElementCount_Getter(this);
+
+  @DomName('DocumentFragment.firstElementChild')
+  @DocsEditable()
+  Element get _firstElementChild => _blink.BlinkDocumentFragment.firstElementChild_Getter(this);
+
+  @DomName('DocumentFragment.lastElementChild')
+  @DocsEditable()
+  Element get _lastElementChild => _blink.BlinkDocumentFragment.lastElementChild_Getter(this);
+
   /**
    * Finds the first descendant element of this document fragment that matches
    * the specified group of selectors.
@@ -8624,18 +9234,6 @@
   @DocsEditable()
   List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocumentFragment.querySelectorAll_Callback_DOMString(this, selectors);
 
-  @DomName('DocumentFragment.childElementCount')
-  @DocsEditable()
-  int get _childElementCount => _blink.BlinkDocumentFragment.childElementCount_Getter(this);
-
-  @DomName('DocumentFragment.firstElementChild')
-  @DocsEditable()
-  Element get _firstElementChild => _blink.BlinkDocumentFragment.firstElementChild_Getter(this);
-
-  @DomName('DocumentFragment.lastElementChild')
-  @DocsEditable()
-  Element get _lastElementChild => _blink.BlinkDocumentFragment.lastElementChild_Getter(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
@@ -8650,6 +9248,12 @@
   // To suppress missing implicit constructor warnings.
   factory DomError._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('DOMError.DOMError')
+  @DocsEditable()
+  factory DomError(String name, [String message]) {
+    return _blink.BlinkDOMError.constructorCallback_DOMString_DOMString(name, message);
+  }
+
   @DomName('DOMError.message')
   @DocsEditable()
   @Experimental() // untriaged
@@ -8922,6 +9526,11 @@
   @DocsEditable()
   int get length => _blink.BlinkDOMTokenList.length_Getter(this);
 
+  @DomName('DOMTokenList.add')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void add(String tokens) => _blink.BlinkDOMTokenList.add_Callback_DOMString(this, tokens);
+
   @DomName('DOMTokenList.contains')
   @DocsEditable()
   bool contains(String token) => _blink.BlinkDOMTokenList.contains_Callback_DOMString(this, token);
@@ -8930,6 +9539,11 @@
   @DocsEditable()
   String item(int index) => _blink.BlinkDOMTokenList.item_Callback_ul(this, index);
 
+  @DomName('DOMTokenList.remove')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void remove(String tokens) => _blink.BlinkDOMTokenList.remove_Callback_DOMString(this, tokens);
+
   @DomName('DOMTokenList.toString')
   @DocsEditable()
   String toString() => _blink.BlinkDOMTokenList.toString_Callback(this);
@@ -9219,6 +9833,16 @@
   @DocsEditable()
   ElementStream<Event> get onBlur;
 
+  @DomName('Element.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlay;
+
+  @DomName('Element.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlayThrough;
+
   /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
@@ -9378,6 +10002,21 @@
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop;
 
+  @DomName('Element.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onDurationChange;
+
+  @DomName('Element.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEmptied;
+
+  @DomName('Element.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEnded;
+
   /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
@@ -9418,6 +10057,16 @@
   @DocsEditable()
   ElementStream<Event> get onLoad;
 
+  @DomName('Element.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedData;
+
+  @DomName('Element.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedMetadata;
+
   /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
@@ -9467,6 +10116,26 @@
   @DocsEditable()
   ElementStream<Event> get onPaste;
 
+  @DomName('Element.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPause;
+
+  @DomName('Element.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlay;
+
+  @DomName('Element.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlaying;
+
+  @DomName('Element.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onRateChange;
+
   /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
@@ -9489,6 +10158,16 @@
   @Experimental()
   ElementStream<Event> get onSearch;
 
+  @DomName('Element.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeked;
+
+  @DomName('Element.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeking;
+
   /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
@@ -9500,11 +10179,26 @@
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart;
 
+  @DomName('Element.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onStalled;
+
   /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit;
 
+  @DomName('Element.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSuspend;
+
+  @DomName('Element.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onTimeUpdate;
+
   /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
@@ -9556,6 +10250,16 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd;
 
+  @DomName('Element.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onVolumeChange;
+
+  @DomName('Element.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onWaiting;
+
   /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
@@ -9657,6 +10361,16 @@
   @DocsEditable()
   ElementStream<Event> get onBlur => Element.blurEvent._forElementList(this);
 
+  @DomName('Element.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlay => Element.canPlayEvent._forElementList(this);
+
+  @DomName('Element.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlayThrough => Element.canPlayThroughEvent._forElementList(this);
+
   /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
@@ -9816,6 +10530,21 @@
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => Element.dropEvent._forElementList(this);
 
+  @DomName('Element.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onDurationChange => Element.durationChangeEvent._forElementList(this);
+
+  @DomName('Element.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEmptied => Element.emptiedEvent._forElementList(this);
+
+  @DomName('Element.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEnded => Element.endedEvent._forElementList(this);
+
   /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
@@ -9856,6 +10585,16 @@
   @DocsEditable()
   ElementStream<Event> get onLoad => Element.loadEvent._forElementList(this);
 
+  @DomName('Element.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedData => Element.loadedDataEvent._forElementList(this);
+
+  @DomName('Element.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedMetadata => Element.loadedMetadataEvent._forElementList(this);
+
   /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
@@ -9905,6 +10644,26 @@
   @DocsEditable()
   ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
 
+  @DomName('Element.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPause => Element.pauseEvent._forElementList(this);
+
+  @DomName('Element.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlay => Element.playEvent._forElementList(this);
+
+  @DomName('Element.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlaying => Element.playingEvent._forElementList(this);
+
+  @DomName('Element.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onRateChange => Element.rateChangeEvent._forElementList(this);
+
   /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
@@ -9927,6 +10686,16 @@
   @Experimental()
   ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
 
+  @DomName('Element.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeked => Element.seekedEvent._forElementList(this);
+
+  @DomName('Element.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeking => Element.seekingEvent._forElementList(this);
+
   /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
@@ -9938,11 +10707,26 @@
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
 
+  @DomName('Element.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onStalled => Element.stalledEvent._forElementList(this);
+
   /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => Element.submitEvent._forElementList(this);
 
+  @DomName('Element.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSuspend => Element.suspendEvent._forElementList(this);
+
+  @DomName('Element.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onTimeUpdate => Element.timeUpdateEvent._forElementList(this);
+
   /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
@@ -9994,6 +10778,16 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent._forElementList(this);
 
+  @DomName('Element.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onVolumeChange => Element.volumeChangeEvent._forElementList(this);
+
+  @DomName('Element.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onWaiting => Element.waitingEvent._forElementList(this);
+
   /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
@@ -10926,6 +11720,16 @@
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  @DomName('Element.canplayEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
+
+  @DomName('Element.canplaythroughEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
+
   /**
    * Static factory designed to expose `change` events to event
    * handlers that are not necessarily instances of [Element].
@@ -11114,6 +11918,21 @@
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  @DomName('Element.durationchangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
+
+  @DomName('Element.emptiedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
+
+  @DomName('Element.endedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+
   /**
    * Static factory designed to expose `error` events to event
    * handlers that are not necessarily instances of [Element].
@@ -11194,6 +12013,16 @@
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  @DomName('Element.loadeddataEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
+
+  @DomName('Element.loadedmetadataEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
+
   /**
    * Static factory designed to expose `mousedown` events to event
    * handlers that are not necessarily instances of [Element].
@@ -11282,6 +12111,26 @@
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  @DomName('Element.pauseEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
+
+  @DomName('Element.playEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
+
+  @DomName('Element.playingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
+
+  @DomName('Element.ratechangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
+
   /**
    * Static factory designed to expose `reset` events to event
    * handlers that are not necessarily instances of [Element].
@@ -11319,6 +12168,16 @@
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  @DomName('Element.seekedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
+
+  @DomName('Element.seekingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
+
   /**
    * Static factory designed to expose `select` events to event
    * handlers that are not necessarily instances of [Element].
@@ -11340,6 +12199,11 @@
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  @DomName('Element.stalledEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
+
   /**
    * Static factory designed to expose `submit` events to event
    * handlers that are not necessarily instances of [Element].
@@ -11350,6 +12214,16 @@
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  @DomName('Element.suspendEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
+
+  @DomName('Element.timeupdateEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
+
   /**
    * Static factory designed to expose `touchcancel` events to event
    * handlers that are not necessarily instances of [Element].
@@ -11426,6 +12300,16 @@
   @DocsEditable()
   static const EventStreamProvider<TransitionEvent> transitionEndEvent = const EventStreamProvider<TransitionEvent>('transitionend');
 
+  @DomName('Element.volumechangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
+
+  @DomName('Element.waitingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
+
   /**
    * Static factory designed to expose `fullscreenchange` events to event
    * handlers that are not necessarily instances of [Element].
@@ -11594,18 +12478,10 @@
   @DocsEditable()
   String get tagName => _blink.BlinkElement.tagName_Getter(this);
 
-  Animation animate(List<Map> keyframes, [timingInput]) {
-    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
-      return _blink.BlinkElement.animate_Callback_SEQ_Dictionary_SEQ_Dictionary(this, keyframes, timingInput);
-    }
-    if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
-      return _blink.BlinkElement.animate_Callback_SEQ_Dictionary_SEQ_double(this, keyframes, timingInput);
-    }
-    if ((keyframes is List<Map> || keyframes == null) && timingInput == null) {
-      return _blink.BlinkElement.animate_Callback_SEQ_Dictionary_SEQ(this, keyframes);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
+  @DomName('Element.animate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AnimationPlayer animate(Object effect, [Object timing]) => _blink.BlinkElement.animate_Callback_object_object(this, effect, timing);
 
   @DomName('Element.blur')
   @DocsEditable()
@@ -11728,30 +12604,6 @@
   @Experimental() // untriaged
   bool matches(String selectors) => _blink.BlinkElement.matches_Callback_DOMString(this, selectors);
 
-  /**
-   * Finds the first descendant element of this element that matches the
-   * specified group of selectors.
-   *
-   * [selectors] should be a string using CSS selector syntax.
-   *
-   *     // Gets the first descendant with the class 'classname'
-   *     var element = element.querySelector('.className');
-   *     // Gets the element with id 'id'
-   *     var element = element.querySelector('#id');
-   *     // Gets the first descendant [ImageElement]
-   *     var img = element.querySelector('img');
-   *
-   * For details about CSS selector syntax, see the
-   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
-   */
-  @DomName('Element.querySelector')
-  @DocsEditable()
-  Element querySelector(String selectors) => _blink.BlinkElement.querySelector_Callback_DOMString(this, selectors);
-
-  @DomName('Element.querySelectorAll')
-  @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.BlinkElement.querySelectorAll_Callback_DOMString(this, selectors);
-
   @DomName('Element.removeAttribute')
   @DocsEditable()
   void _removeAttribute(String name) => _blink.BlinkElement.removeAttribute_Callback_DOMString(this, name);
@@ -11760,6 +12612,11 @@
   @DocsEditable()
   void _removeAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.removeAttributeNS_Callback_DOMString_DOMString(this, namespaceURI, localName);
 
+  @DomName('Element.requestPointerLock')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void requestPointerLock() => _blink.BlinkElement.requestPointerLock_Callback(this);
+
   /**
    * Scrolls the element by a number of lines.
    *
@@ -11829,26 +12686,6 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
   void requestFullscreen() => _blink.BlinkElement.webkitRequestFullscreen_Callback(this);
 
-  /**
-   * Locks the mouse pointer to this element.
-   *
-   * ## Other resources
-   *
-   * * [Pointer lock and first person shooter controls]
-   * (http://www.html5rocks.com/en/tutorials/pointerlock/intro/) tutorial from
-   * HTML5Rocks.
-   *
-   * * [Pointer lock specification]
-   * (http://www.w3.org/TR/pointerlock/) from W3C.
-   */
-  @DomName('Element.webkitRequestPointerLock')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Element-requestPointerLock-void
-  void requestPointerLock() => _blink.BlinkElement.webkitRequestPointerLock_Callback(this);
-
   @DomName('Element.nextElementSibling')
   @DocsEditable()
   Element get nextElementSibling => _blink.BlinkElement.nextElementSibling_Getter(this);
@@ -11877,6 +12714,30 @@
   @DocsEditable()
   Element get _lastElementChild => _blink.BlinkElement.lastElementChild_Getter(this);
 
+  /**
+   * Finds the first descendant element of this element that matches the
+   * specified group of selectors.
+   *
+   * [selectors] should be a string using CSS selector syntax.
+   *
+   *     // Gets the first descendant with the class 'classname'
+   *     var element = element.querySelector('.className');
+   *     // Gets the element with id 'id'
+   *     var element = element.querySelector('#id');
+   *     // Gets the first descendant [ImageElement]
+   *     var img = element.querySelector('img');
+   *
+   * For details about CSS selector syntax, see the
+   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+   */
+  @DomName('Element.querySelector')
+  @DocsEditable()
+  Element querySelector(String selectors) => _blink.BlinkElement.querySelector_Callback_DOMString(this, selectors);
+
+  @DomName('Element.querySelectorAll')
+  @DocsEditable()
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkElement.querySelectorAll_Callback_DOMString(this, selectors);
+
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
@@ -11902,6 +12763,16 @@
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  @DomName('Element.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
+
+  @DomName('Element.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
+
   /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
@@ -12061,6 +12932,21 @@
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
+  @DomName('Element.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
+
+  @DomName('Element.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
+
+  @DomName('Element.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onEnded => endedEvent.forElement(this);
+
   /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
@@ -12101,6 +12987,16 @@
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  @DomName('Element.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
+
+  @DomName('Element.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
+
   /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
@@ -12150,6 +13046,26 @@
   @DocsEditable()
   ElementStream<Event> get onPaste => pasteEvent.forElement(this);
 
+  @DomName('Element.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPause => pauseEvent.forElement(this);
+
+  @DomName('Element.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlay => playEvent.forElement(this);
+
+  @DomName('Element.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onPlaying => playingEvent.forElement(this);
+
+  @DomName('Element.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
+
   /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
@@ -12172,6 +13088,16 @@
   @Experimental()
   ElementStream<Event> get onSearch => searchEvent.forElement(this);
 
+  @DomName('Element.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
+
+  @DomName('Element.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
+
   /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
@@ -12183,11 +13109,26 @@
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
 
+  @DomName('Element.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onStalled => stalledEvent.forElement(this);
+
   /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
+  @DomName('Element.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
+
+  @DomName('Element.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
+
   /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
@@ -12239,6 +13180,16 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forElement(this);
 
+  @DomName('Element.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
+
+  @DomName('Element.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
+
   /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
@@ -12317,6 +13268,16 @@
   @DocsEditable()
   void set height(String value) => _blink.BlinkHTMLEmbedElement.height_Setter_DOMString(this, value);
 
+  @DomName('HTMLEmbedElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLEmbedElement.integrity_Getter(this);
+
+  @DomName('HTMLEmbedElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLEmbedElement.integrity_Setter_DOMString(this, value);
+
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
   String get name => _blink.BlinkHTMLEmbedElement.name_Getter(this);
@@ -12918,20 +13879,82 @@
    * used when an explicit accessor is not available.
    */
   Events get on => new Events(this);
+
+  void addEventListener(String type, EventListener listener, [bool useCapture]) {
+    // TODO(leafp): This check is avoid a bug in our dispatch code when
+    // listener is null.  The browser treats this call as a no-op in this
+    // case, so it's fine to short-circuit it, but we should not have to.
+    if (listener != null) {
+      _addEventListener(type, listener, useCapture);
+    }
+  }
+
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) {
+    // TODO(leafp): This check is avoid a bug in our dispatch code when
+    // listener is null.  The browser treats this call as a no-op in this
+    // case, so it's fine to short-circuit it, but we should not have to.
+    if (listener != null) {
+      _removeEventListener(type, listener, useCapture);
+    }
+  }
+
   // To suppress missing implicit constructor warnings.
   factory EventTarget._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('EventTarget.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.BlinkEventTarget.addEventListener_Callback_DOMString_EventListener_boolean(this, type, listener, useCapture);
+  void _addEventListener([String type, EventListener listener, bool useCapture]) {
+    if (listener != null) {
+      _blink.BlinkEventTarget.addEventListener_Callback_DOMString_EventListener_boolean(this, type, listener, useCapture);
+      return;
+    }
+    if (type != null) {
+      _blink.BlinkEventTarget.addEventListener_Callback_DOMString(this, type);
+      return;
+    }
+    _blink.BlinkEventTarget.addEventListener_Callback(this);
+    return;
+  }
 
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
   bool dispatchEvent(Event event) => _blink.BlinkEventTarget.dispatchEvent_Callback_Event(this, event);
 
-  @DomName('EventTarget.removeEventListener')
+  void _removeEventListener([String type, EventListener listener, bool useCapture]) {
+    if (listener != null) {
+      _blink.BlinkEventTarget.removeEventListener_Callback_DOMString_EventListener_boolean(this, type, listener, useCapture);
+      return;
+    }
+    if (type != null) {
+      _blink.BlinkEventTarget.removeEventListener_Callback_DOMString(this, type);
+      return;
+    }
+    _blink.BlinkEventTarget.removeEventListener_Callback(this);
+    return;
+  }
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('FetchEvent')
+@Experimental() // untriaged
+class FetchEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory FetchEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('FetchEvent.request')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.BlinkEventTarget.removeEventListener_Callback_DOMString_EventListener_boolean(this, type, listener, useCapture);
+  @Experimental() // untriaged
+  Request get request => _blink.BlinkFetchEvent.request_Getter(this);
+
+  @DomName('FetchEvent.respondWith')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void respondWith(Object value) => _blink.BlinkFetchEvent.respondWith_Callback_ScriptValue(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13647,8 +14670,17 @@
 
   @DomName('FontFace.FontFace')
   @DocsEditable()
-  factory FontFace(String family, String source, Map descriptors) {
-    return _blink.BlinkFontFace.constructorCallback_DOMString_DOMString_Dictionary(family, source, descriptors);
+  factory FontFace(String family, source, [Map descriptors]) {
+    if ((descriptors is Map || descriptors == null) && (source is String || source == null) && (family is String || family == null)) {
+      return _blink.BlinkFontFace.constructorCallback_DOMString_DOMString_Dictionary(family, source, descriptors);
+    }
+    if ((descriptors is Map || descriptors == null) && (source is TypedData || source == null) && (family is String || family == null)) {
+      return _blink.BlinkFontFace.constructorCallback_DOMString_ArrayBufferView_Dictionary(family, source, descriptors);
+    }
+    if ((descriptors is Map || descriptors == null) && (source is ByteBuffer || source == null) && (family is String || family == null)) {
+      return _blink.BlinkFontFace.constructorCallback_DOMString_ArrayBuffer_Dictionary(family, source, descriptors);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('FontFace.family')
@@ -13726,11 +14758,6 @@
   @Experimental() // untriaged
   void set weight(String value) => _blink.BlinkFontFace.weight_Setter_DOMString(this, value);
 
-  @DomName('FontFace.load')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void load() => _blink.BlinkFontFace.load_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
@@ -13850,30 +14877,6 @@
   // To suppress missing implicit constructor warnings.
   factory FormElement._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `autocomplete` events to event
-   * handlers that are not necessarily instances of [FormElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLFormElement.autocompleteEvent')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
-  @Experimental()
-  static const EventStreamProvider<Event> autocompleteEvent = const EventStreamProvider<Event>('autocomplete');
-
-  /**
-   * Static factory designed to expose `autocompleteerror` events to event
-   * handlers that are not necessarily instances of [FormElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLFormElement.autocompleteerrorEvent')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
-  @Experimental()
-  static const EventStreamProvider<AutocompleteErrorEvent> autocompleteErrorEvent = const EventStreamProvider<AutocompleteErrorEvent>('autocompleteerror');
-
   @DomName('HTMLFormElement.HTMLFormElement')
   @DocsEditable()
   factory FormElement() => document.createElement("form");
@@ -13964,9 +14967,15 @@
   @DocsEditable()
   void set target(String value) => _blink.BlinkHTMLFormElement.target_Setter_DOMString(this, value);
 
-  @DomName('HTMLFormElement.__getter__')
-  @DocsEditable()
-  Element __getter__(int index) => _blink.BlinkHTMLFormElement.$__getter___Callback_ul(this, index);
+  Element __getter__(index_OR_name) {
+    if ((index_OR_name is int || index_OR_name == null)) {
+      return _blink.BlinkHTMLFormElement.$__getter___Callback_ul(this, index_OR_name);
+    }
+    if ((index_OR_name is String || index_OR_name == null)) {
+      return _blink.BlinkHTMLFormElement.$__getter___Callback_DOMString(this, index_OR_name);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
@@ -13986,20 +14995,6 @@
   @DocsEditable()
   void submit() => _blink.BlinkHTMLFormElement.submit_Callback(this);
 
-  /// Stream of `autocomplete` events handled by this [FormElement].
-  @DomName('HTMLFormElement.onautocomplete')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
-  @Experimental()
-  ElementStream<Event> get onAutocomplete => autocompleteEvent.forElement(this);
-
-  /// Stream of `autocompleteerror` events handled by this [FormElement].
-  @DomName('HTMLFormElement.onautocompleteerror')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
-  @Experimental()
-  ElementStream<AutocompleteErrorEvent> get onAutocompleteError => autocompleteErrorEvent.forElement(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
@@ -14020,9 +15015,10 @@
   @DocsEditable()
   List<num> get axes => _blink.BlinkGamepad.axes_Getter(this);
 
-  @DomName('Gamepad.buttons')
+  @DomName('Gamepad.connected')
   @DocsEditable()
-  List<num> get buttons => _blink.BlinkGamepad.buttons_Getter(this);
+  @Experimental() // untriaged
+  bool get connected => _blink.BlinkGamepad.connected_Getter(this);
 
   @DomName('Gamepad.id')
   @DocsEditable()
@@ -14032,6 +15028,11 @@
   @DocsEditable()
   int get index => _blink.BlinkGamepad.index_Getter(this);
 
+  @DomName('Gamepad.mapping')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get mapping => _blink.BlinkGamepad.mapping_Getter(this);
+
   @DomName('Gamepad.timestamp')
   @DocsEditable()
   int get timestamp => _blink.BlinkGamepad.timestamp_Getter(this);
@@ -14041,6 +15042,51 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('GamepadButton')
+@Experimental() // untriaged
+class GamepadButton extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory GamepadButton._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('GamepadButton.pressed')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get pressed => _blink.BlinkGamepadButton.pressed_Getter(this);
+
+  @DomName('GamepadButton.value')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get value => _blink.BlinkGamepadButton.value_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('GamepadEvent')
+@Experimental() // untriaged
+class GamepadEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory GamepadEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('GamepadEvent.gamepad')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Gamepad get gamepad => _blink.BlinkGamepadEvent.gamepad_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
 
 @DocsEditable()
 @DomName('Geolocation')
@@ -14178,6 +15224,16 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  @DomName('GlobalEventHandlers.canplayEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
+
+  @DomName('GlobalEventHandlers.canplaythroughEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
+
   @DomName('GlobalEventHandlers.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14233,6 +15289,21 @@
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  @DomName('GlobalEventHandlers.durationchangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
+
+  @DomName('GlobalEventHandlers.emptiedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
+
+  @DomName('GlobalEventHandlers.endedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+
   @DomName('GlobalEventHandlers.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14273,6 +15344,16 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  @DomName('GlobalEventHandlers.loadeddataEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
+
+  @DomName('GlobalEventHandlers.loadedmetadataEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
+
   @DomName('GlobalEventHandlers.mousedownEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14313,6 +15394,26 @@
   @Experimental() // untriaged
   static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
 
+  @DomName('GlobalEventHandlers.pauseEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
+
+  @DomName('GlobalEventHandlers.playEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
+
+  @DomName('GlobalEventHandlers.playingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
+
+  @DomName('GlobalEventHandlers.ratechangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
+
   @DomName('GlobalEventHandlers.resetEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14328,16 +15429,51 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  @DomName('GlobalEventHandlers.seekedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
+
+  @DomName('GlobalEventHandlers.seekingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
+
   @DomName('GlobalEventHandlers.selectEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  @DomName('GlobalEventHandlers.stalledEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
+
   @DomName('GlobalEventHandlers.submitEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  @DomName('GlobalEventHandlers.suspendEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
+
+  @DomName('GlobalEventHandlers.timeupdateEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
+
+  @DomName('GlobalEventHandlers.volumechangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
+
+  @DomName('GlobalEventHandlers.waitingEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
+
   @DomName('GlobalEventHandlers.onabort')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14348,6 +15484,16 @@
   @Experimental() // untriaged
   Stream<Event> get onBlur => blurEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.oncanplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.oncanplaythrough')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onCanPlayThrough => canPlayThroughEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onchange')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14403,6 +15549,21 @@
   @Experimental() // untriaged
   Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.ondurationchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onDurationChange => durationChangeEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onemptied')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEmptied => emptiedEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEnded => endedEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onerror')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14443,6 +15604,16 @@
   @Experimental() // untriaged
   Stream<Event> get onLoad => loadEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.onloadeddata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onLoadedData => loadedDataEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onloadedmetadata')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onLoadedMetadata => loadedMetadataEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onmousedown')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14483,6 +15654,26 @@
   @Experimental() // untriaged
   Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.onpause')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPause => pauseEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onplay')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPlay => playEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onplaying')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPlaying => playingEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onratechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onRateChange => rateChangeEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onreset')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14498,15 +15689,50 @@
   @Experimental() // untriaged
   Stream<Event> get onScroll => scrollEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.onseeked')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSeeked => seekedEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onseeking')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSeeking => seekingEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onselect')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onSelect => selectEvent.forTarget(this);
 
+  @DomName('GlobalEventHandlers.onstalled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onStalled => stalledEvent.forTarget(this);
+
   @DomName('GlobalEventHandlers.onsubmit')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onSubmit => submitEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onsuspend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onSuspend => suspendEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.ontimeupdate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onTimeUpdate => timeUpdateEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onvolumechange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onVolumeChange => volumeChangeEvent.forTarget(this);
+
+  @DomName('GlobalEventHandlers.onwaiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onWaiting => waitingEvent.forTarget(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
@@ -14615,6 +15841,76 @@
 
 
 @DocsEditable()
+@DomName('HeaderMap')
+@Experimental() // untriaged
+class HeaderMap extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory HeaderMap._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HeaderMap.HeaderMap')
+  @DocsEditable()
+  factory HeaderMap() {
+    return _blink.BlinkHeaderMap.constructorCallback();
+  }
+
+  @DomName('HeaderMap.size')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get size => _blink.BlinkHeaderMap.size_Getter(this);
+
+  @DomName('HeaderMap.clear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clear() => _blink.BlinkHeaderMap.clear_Callback(this);
+
+  @DomName('HeaderMap.delete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool delete(String key) => _blink.BlinkHeaderMap.delete_Callback_DOMString(this, key);
+
+  void forEach(HeaderMapForEachCallback callback, [Object thisArg]) {
+    if (thisArg != null) {
+      _blink.BlinkHeaderMap.forEach_Callback_HeaderMapForEachCallback_ScriptValue(this, callback, thisArg);
+      return;
+    }
+    _blink.BlinkHeaderMap.forEach_Callback_HeaderMapForEachCallback(this, callback);
+    return;
+  }
+
+  @DomName('HeaderMap.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get(String key) => _blink.BlinkHeaderMap.get_Callback_DOMString(this, key);
+
+  @DomName('HeaderMap.has')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool has(String key) => _blink.BlinkHeaderMap.has_Callback_DOMString(this, key);
+
+  @DomName('HeaderMap.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set(String key, String value) => _blink.BlinkHeaderMap.set_Callback_DOMString_DOMString(this, key, value);
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('HeaderMapForEachCallback')
+@Experimental() // untriaged
+typedef void HeaderMapForEachCallback(String value, String key, HeaderMap map);
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('HTMLHeadingElement')
 class HeadingElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -14716,6 +16012,31 @@
 
 
 @DocsEditable()
+@DomName('HmacKeyAlgorithm')
+@Experimental() // untriaged
+class HmacKeyAlgorithm extends KeyAlgorithm {
+  // To suppress missing implicit constructor warnings.
+  factory HmacKeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HmacKeyAlgorithm.hash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  KeyAlgorithm get hash => _blink.BlinkHmacKeyAlgorithm.hash_Getter(this);
+
+  @DomName('HmacKeyAlgorithm.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkHmacKeyAlgorithm.length_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('HTMLCollection')
 class HtmlCollection extends NativeFieldWrapperClass2 with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> {
   // To suppress missing implicit constructor warnings.
@@ -15722,6 +17043,10 @@
   // To suppress missing implicit constructor warnings.
   factory HtmlFormControlsCollection._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('HTMLFormControlsCollection.namedItem')
+  @DocsEditable()
+  Object namedItem(String name) => _blink.BlinkHTMLFormControlsCollection.namedItem_Callback_DOMString(this, name);
+
 }
 // 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
@@ -16231,6 +17556,11 @@
   @DocsEditable()
   void set responseType(String value) => _blink.BlinkXMLHttpRequest.responseType_Setter_DOMString(this, value);
 
+  @DomName('XMLHttpRequest.responseURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get responseUrl => _blink.BlinkXMLHttpRequest.responseURL_Getter(this);
+
   /**
    * The request response, or null on failure.
    *
@@ -16642,6 +17972,16 @@
   @DocsEditable()
   void set height(String value) => _blink.BlinkHTMLIFrameElement.height_Setter_DOMString(this, value);
 
+  @DomName('HTMLIFrameElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLIFrameElement.integrity_Getter(this);
+
+  @DomName('HTMLIFrameElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLIFrameElement.integrity_Setter_DOMString(this, value);
+
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
   String get name => _blink.BlinkHTMLIFrameElement.name_Getter(this);
@@ -16726,9 +18066,21 @@
   // To suppress missing implicit constructor warnings.
   factory ImageData._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ImageData.ImageData')
+  @DocsEditable()
+  factory ImageData(data_OR_width, int height_OR_width, [int height]) {
+    if ((height_OR_width is int || height_OR_width == null) && (data_OR_width is int || data_OR_width == null) && height == null) {
+      return _blink.BlinkImageData.constructorCallback_ul_ul(data_OR_width, height_OR_width);
+    }
+    if ((height is int || height == null) && (height_OR_width is int || height_OR_width == null) && (data_OR_width is Uint8ClampedList || data_OR_width == null)) {
+      return _blink.BlinkImageData.constructorCallback_Uint8ClampedArray_ul_ul(data_OR_width, height_OR_width, height);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
   @DomName('ImageData.data')
   @DocsEditable()
-  List<int> get _data => _blink.BlinkImageData.data_Getter(this);
+  Uint8ClampedList get _data => _blink.BlinkImageData.data_Getter(this);
 
   @DomName('ImageData.height')
   @DocsEditable()
@@ -16785,6 +18137,11 @@
   @DocsEditable()
   void set crossOrigin(String value) => _blink.BlinkHTMLImageElement.crossOrigin_Setter_DOMString(this, value);
 
+  @DomName('HTMLImageElement.currentSrc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get currentSrc => _blink.BlinkHTMLImageElement.currentSrc_Getter(this);
+
   @DomName('HTMLImageElement.height')
   @DocsEditable()
   int get height => _blink.BlinkHTMLImageElement.height_Getter(this);
@@ -16793,6 +18150,16 @@
   @DocsEditable()
   void set height(int value) => _blink.BlinkHTMLImageElement.height_Setter_long(this, value);
 
+  @DomName('HTMLImageElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLImageElement.integrity_Getter(this);
+
+  @DomName('HTMLImageElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLImageElement.integrity_Setter_DOMString(this, value);
+
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
   bool get isMap => _blink.BlinkHTMLImageElement.isMap_Getter(this);
@@ -16809,6 +18176,16 @@
   @DocsEditable()
   int get naturalWidth => _blink.BlinkHTMLImageElement.naturalWidth_Getter(this);
 
+  @DomName('HTMLImageElement.sizes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get sizes => _blink.BlinkHTMLImageElement.sizes_Getter(this);
+
+  @DomName('HTMLImageElement.sizes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set sizes(String value) => _blink.BlinkHTMLImageElement.sizes_Setter_DOMString(this, value);
+
   @DomName('HTMLImageElement.src')
   @DocsEditable()
   String get src => _blink.BlinkHTMLImageElement.src_Getter(this);
@@ -16906,20 +18283,6 @@
 
   // To suppress missing implicit constructor warnings.
   factory InputElement._() { throw new UnsupportedError("Not supported"); }
-
-  /**
-   * Static factory designed to expose `speechchange` events to event
-   * handlers that are not necessarily instances of [InputElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLInputElement.webkitSpeechChangeEvent')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
-  static const EventStreamProvider<Event> speechChangeEvent = const EventStreamProvider<Event>('webkitSpeechChange');
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -17344,13 +18707,6 @@
     return;
   }
 
-  /// Stream of `speechchange` events handled by this [InputElement].
-  @DomName('HTMLInputElement.onwebkitSpeechChange')
-  @DocsEditable()
-  // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
-  @Experimental()
-  ElementStream<Event> get onSpeechChange => speechChangeEvent.forElement(this);
-
 }
 
 
@@ -17994,21 +19350,16 @@
 
 
 @DocsEditable()
-@DomName('KeyPair')
+@DomName('KeyAlgorithm')
 @Experimental() // untriaged
-class KeyPair extends NativeFieldWrapperClass2 {
+class KeyAlgorithm extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
-  factory KeyPair._() { throw new UnsupportedError("Not supported"); }
+  factory KeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('KeyPair.privateKey')
+  @DomName('KeyAlgorithm.name')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoKey get privateKey => _blink.BlinkKeyPair.privateKey_Getter(this);
-
-  @DomName('KeyPair.publicKey')
-  @DocsEditable()
-  @Experimental() // untriaged
-  CryptoKey get publicKey => _blink.BlinkKeyPair.publicKey_Getter(this);
+  String get name => _blink.BlinkKeyAlgorithm.name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18377,6 +19728,16 @@
   @Experimental()
   Document get import => _blink.BlinkHTMLLinkElement.import_Getter(this);
 
+  @DomName('HTMLLinkElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLLinkElement.integrity_Getter(this);
+
+  @DomName('HTMLLinkElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLLinkElement.integrity_Setter_DOMString(this, value);
+
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
   String get media => _blink.BlinkHTMLLinkElement.media_Getter(this);
@@ -18503,7 +19864,7 @@
 
   @DomName('Location.assign')
   @DocsEditable()
-  void assign(String url) => _blink.BlinkLocation.assign_Callback_DOMString(this, url);
+  void assign([String url]) => _blink.BlinkLocation.assign_Callback_DOMString(this, url);
 
   @DomName('Location.reload')
   @DocsEditable()
@@ -18682,6 +20043,51 @@
 
 
 @DocsEditable()
+@DomName('MediaDeviceInfo')
+@Experimental() // untriaged
+class MediaDeviceInfo extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory MediaDeviceInfo._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('MediaDeviceInfo.deviceId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get deviceId => _blink.BlinkMediaDeviceInfo.deviceId_Getter(this);
+
+  @DomName('MediaDeviceInfo.groupId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get groupId => _blink.BlinkMediaDeviceInfo.groupId_Getter(this);
+
+  @DomName('MediaDeviceInfo.kind')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get kind => _blink.BlinkMediaDeviceInfo.kind_Getter(this);
+
+  @DomName('MediaDeviceInfo.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get label => _blink.BlinkMediaDeviceInfo.label_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('MediaDeviceInfoCallback')
+@Experimental() // untriaged
+typedef void MediaDeviceInfoCallback(List<MediaDeviceInfo> devices);
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('HTMLMediaElement')
 @Unstable()
 class MediaElement extends HtmlElement {
@@ -18689,218 +20095,6 @@
   factory MediaElement._() { throw new UnsupportedError("Not supported"); }
 
   /**
-   * Static factory designed to expose `canplay` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.canplayEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
-
-  /**
-   * Static factory designed to expose `canplaythrough` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.canplaythroughEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
-
-  /**
-   * Static factory designed to expose `durationchange` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.durationchangeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
-
-  /**
-   * Static factory designed to expose `emptied` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.emptiedEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
-
-  /**
-   * Static factory designed to expose `ended` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.endedEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
-
-  /**
-   * Static factory designed to expose `loadeddata` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.loadeddataEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
-
-  /**
-   * Static factory designed to expose `loadedmetadata` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.loadedmetadataEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
-
-  /**
-   * Static factory designed to expose `loadstart` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.loadstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
-
-  /**
-   * Static factory designed to expose `pause` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.pauseEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
-
-  /**
-   * Static factory designed to expose `play` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.playEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
-
-  /**
-   * Static factory designed to expose `playing` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.playingEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
-
-  /**
-   * Static factory designed to expose `progress` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.progressEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
-
-  /**
-   * Static factory designed to expose `ratechange` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.ratechangeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
-
-  /**
-   * Static factory designed to expose `seeked` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.seekedEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
-
-  /**
-   * Static factory designed to expose `seeking` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.seekingEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
-
-  /**
-   * Static factory designed to expose `show` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.showEvent')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
-  @Experimental()
-  static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
-
-  /**
-   * Static factory designed to expose `stalled` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.stalledEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
-
-  /**
-   * Static factory designed to expose `suspend` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.suspendEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
-
-  /**
-   * Static factory designed to expose `timeupdate` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.timeupdateEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
-
-  /**
-   * Static factory designed to expose `volumechange` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.volumechangeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
-
-  /**
-   * Static factory designed to expose `waiting` events to event
-   * handlers that are not necessarily instances of [MediaElement].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('HTMLMediaElement.waitingEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
-
-  /**
    * Static factory designed to expose `keyadded` events to event
    * handlers that are not necessarily instances of [MediaElement].
    *
@@ -18998,6 +20192,11 @@
   @DocsEditable()
   static const int NETWORK_NO_SOURCE = 3;
 
+  @DomName('HTMLMediaElement.audioTracks')
+  @DocsEditable()
+  @Experimental() // untriaged
+  AudioTrackList get audioTracks => _blink.BlinkHTMLMediaElement.audioTracks_Getter(this);
+
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
   bool get autoplay => _blink.BlinkHTMLMediaElement.autoplay_Getter(this);
@@ -19076,6 +20275,16 @@
   @DocsEditable()
   MediaError get error => _blink.BlinkHTMLMediaElement.error_Getter(this);
 
+  @DomName('HTMLMediaElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLMediaElement.integrity_Getter(this);
+
+  @DomName('HTMLMediaElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLMediaElement.integrity_Setter_DOMString(this, value);
+
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
   bool get loop => _blink.BlinkHTMLMediaElement.loop_Getter(this);
@@ -19160,6 +20369,11 @@
   @Experimental()
   TextTrackList get textTracks => _blink.BlinkHTMLMediaElement.textTracks_Getter(this);
 
+  @DomName('HTMLMediaElement.videoTracks')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VideoTrackList get videoTracks => _blink.BlinkHTMLMediaElement.videoTracks_Getter(this);
+
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
   num get volume => _blink.BlinkHTMLMediaElement.volume_Getter(this);
@@ -19242,113 +20456,6 @@
     return;
   }
 
-  /// Stream of `canplay` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.oncanplay')
-  @DocsEditable()
-  ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
-
-  /// Stream of `canplaythrough` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.oncanplaythrough')
-  @DocsEditable()
-  ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
-
-  /// Stream of `durationchange` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.ondurationchange')
-  @DocsEditable()
-  ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
-
-  /// Stream of `emptied` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onemptied')
-  @DocsEditable()
-  ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
-
-  /// Stream of `ended` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onended')
-  @DocsEditable()
-  ElementStream<Event> get onEnded => endedEvent.forElement(this);
-
-  /// Stream of `loadeddata` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onloadeddata')
-  @DocsEditable()
-  ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
-
-  /// Stream of `loadedmetadata` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onloadedmetadata')
-  @DocsEditable()
-  ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
-
-  /// Stream of `loadstart` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onloadstart')
-  @DocsEditable()
-  ElementStream<Event> get onLoadStart => loadStartEvent.forElement(this);
-
-  /// Stream of `pause` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onpause')
-  @DocsEditable()
-  ElementStream<Event> get onPause => pauseEvent.forElement(this);
-
-  /// Stream of `play` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onplay')
-  @DocsEditable()
-  ElementStream<Event> get onPlay => playEvent.forElement(this);
-
-  /// Stream of `playing` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onplaying')
-  @DocsEditable()
-  ElementStream<Event> get onPlaying => playingEvent.forElement(this);
-
-  /// Stream of `progress` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onprogress')
-  @DocsEditable()
-  ElementStream<Event> get onProgress => progressEvent.forElement(this);
-
-  /// Stream of `ratechange` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onratechange')
-  @DocsEditable()
-  ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
-
-  /// Stream of `seeked` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onseeked')
-  @DocsEditable()
-  ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
-
-  /// Stream of `seeking` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onseeking')
-  @DocsEditable()
-  ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
-
-  /// Stream of `show` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onshow')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
-  @Experimental()
-  ElementStream<Event> get onShow => showEvent.forElement(this);
-
-  /// Stream of `stalled` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onstalled')
-  @DocsEditable()
-  ElementStream<Event> get onStalled => stalledEvent.forElement(this);
-
-  /// Stream of `suspend` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onsuspend')
-  @DocsEditable()
-  ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
-
-  /// Stream of `timeupdate` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.ontimeupdate')
-  @DocsEditable()
-  ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
-
-  /// Stream of `volumechange` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onvolumechange')
-  @DocsEditable()
-  ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
-
-  /// Stream of `waiting` events handled by this [MediaElement].
-  @DomName('HTMLMediaElement.onwaiting')
-  @DocsEditable()
-  ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
-
   /// Stream of `keyadded` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable()
@@ -19627,6 +20734,11 @@
   @DocsEditable()
   MediaKeySession createSession(String type, Uint8List initData) => _blink.BlinkMediaKeys.createSession_Callback_DOMString_Uint8Array(this, type, initData);
 
+  @DomName('MediaKeys.isTypeSupported')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static bool isTypeSupported(String keySystem, String contentType) => _blink.BlinkMediaKeys.isTypeSupported_Callback_DOMString_DOMString(keySystem, contentType);
+
 }
 // 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
@@ -19828,6 +20940,11 @@
   @DocsEditable()
   void addTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.addTrack_Callback_MediaStreamTrack(this, track);
 
+  @DomName('MediaStream.clone')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaStream clone() => _blink.BlinkMediaStream.clone_Callback(this);
+
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
   List<MediaStreamTrack> getAudioTracks() => _blink.BlinkMediaStream.getAudioTracks_Callback(this);
@@ -19967,6 +21084,11 @@
   @DocsEditable()
   String get readyState => _blink.BlinkMediaStreamTrack.readyState_Getter(this);
 
+  @DomName('MediaStreamTrack.clone')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MediaStreamTrack clone() => _blink.BlinkMediaStreamTrack.clone_Callback(this);
+
   @DomName('MediaStreamTrack.getSources')
   @DocsEditable()
   @Experimental() // untriaged
@@ -20408,6 +21530,11 @@
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
+  @DomName('MIDIAccess.sysexEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get sysexEnabled => _blink.BlinkMIDIAccess.sysexEnabled_Getter(this);
+
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
   List<MidiInput> inputs() => _blink.BlinkMIDIAccess.inputs_Callback(this);
@@ -20435,26 +21562,6 @@
 
 
 @DocsEditable()
-@DomName('MIDIAccessPromise')
-@Experimental() // untriaged
-class MidiAccessPromise extends NativeFieldWrapperClass2 {
-  // To suppress missing implicit constructor warnings.
-  factory MidiAccessPromise._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('MIDIAccessPromise.then')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void then(MidiSuccessCallback successCallback, MidiErrorCallback errorCallback) => _blink.BlinkMIDIAccessPromise.then_Callback_MIDISuccessCallback_MIDIErrorCallback(this, successCallback, errorCallback);
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('MIDIConnectionEvent')
 // http://webaudio.github.io/web-midi-api/#midiconnectionevent-interface
 @Experimental()
@@ -20811,6 +21918,16 @@
   @DocsEditable()
   bool get metaKey => _blink.BlinkMouseEvent.metaKey_Getter(this);
 
+  @DomName('MouseEvent.movementX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get _movementX => _blink.BlinkMouseEvent.movementX_Getter(this);
+
+  @DomName('MouseEvent.movementY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get _movementY => _blink.BlinkMouseEvent.movementY_Getter(this);
+
   @DomName('MouseEvent.offsetX')
   @DocsEditable()
   @Unstable()
@@ -21073,7 +22190,7 @@
 
 
 @DomName('Navigator')
-class Navigator extends NativeFieldWrapperClass2 implements NavigatorOnLine, NavigatorID {
+class Navigator extends NavigatorCpu implements NavigatorLanguage, NavigatorOnLine, NavigatorID {
 
 
   /**
@@ -21134,6 +22251,11 @@
   // To suppress missing implicit constructor warnings.
   factory Navigator._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('Navigator.connection')
+  @DocsEditable()
+  @Experimental() // untriaged
+  NetworkInformation get connection => _blink.BlinkNavigator.connection_Getter(this);
+
   @DomName('Navigator.cookieEnabled')
   @DocsEditable()
   @Unstable()
@@ -21150,10 +22272,6 @@
   @Unstable()
   Geolocation get geolocation => _blink.BlinkNavigator.geolocation_Getter(this);
 
-  @DomName('Navigator.language')
-  @DocsEditable()
-  String get language => _blink.BlinkNavigator.language_Getter(this);
-
   @DomName('Navigator.maxTouchPoints')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21169,6 +22287,11 @@
   @Unstable()
   String get productSub => _blink.BlinkNavigator.productSub_Getter(this);
 
+  @DomName('Navigator.push')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PushManager get push => _blink.BlinkNavigator.push_Getter(this);
+
   @DomName('Navigator.serviceWorker')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21205,6 +22328,16 @@
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
   DeprecatedStorageQuota get temporaryStorage => _blink.BlinkNavigator.webkitTemporaryStorage_Getter(this);
 
+  @DomName('Navigator.getGamepads')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Gamepad> getGamepads() => _blink.BlinkNavigator.getGamepads_Callback(this);
+
+  @DomName('Navigator.getMediaDevices')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void getMediaDevices(MediaDeviceInfoCallback resultCallback) => _blink.BlinkNavigator.getMediaDevices_Callback_MediaDeviceInfoCallback(this, resultCallback);
+
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
@@ -21221,29 +22354,32 @@
   @Unstable()
   void registerProtocolHandler(String scheme, String url, String title) => _blink.BlinkNavigator.registerProtocolHandler_Callback_DOMString_DOMString_DOMString(this, scheme, url, title);
 
-  @DomName('Navigator.requestMIDIAccess')
-  @DocsEditable()
-  @Experimental() // untriaged
-  MidiAccessPromise requestMidiAccess([Map options]) => _blink.BlinkNavigator.requestMIDIAccess_Callback_Dictionary(this, options);
+  bool sendBeacon(String url, data) {
+    if ((data is String || data == null) && (url is String || url == null)) {
+      return _blink.BlinkNavigator.sendBeacon_Callback_DOMString_DOMString(this, url, data);
+    }
+    if ((data is TypedData || data == null) && (url is String || url == null)) {
+      return _blink.BlinkNavigator.sendBeacon_Callback_DOMString_ArrayBufferView(this, url, data);
+    }
+    if ((data is FormData || data == null) && (url is String || url == null)) {
+      return _blink.BlinkNavigator.sendBeacon_Callback_DOMString_FormData(this, url, data);
+    }
+    if ((data is Blob || data == null) && (url is String || url == null)) {
+      return _blink.BlinkNavigator.sendBeacon_Callback_DOMString_Blob(this, url, data);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
 
   @DomName('Navigator.unregisterProtocolHandler')
   @DocsEditable()
   @Experimental() // untriaged
   void unregisterProtocolHandler(String scheme, String url) => _blink.BlinkNavigator.unregisterProtocolHandler_Callback_DOMString_DOMString(this, scheme, url);
 
-  @DomName('Navigator.webkitGetGamepads')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#widl-Navigator-getGamepads-Gamepad
-  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.BlinkNavigator.webkitGetUserMedia_Callback_Dictionary_NavigatorUserMediaSuccessCallback_NavigatorUserMediaErrorCallback(this, options, successCallback, errorCallback);
+  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, _NavigatorUserMediaErrorCallback errorCallback) => _blink.BlinkNavigator.webkitGetUserMedia_Callback_Dictionary_NavigatorUserMediaSuccessCallback_NavigatorUserMediaErrorCallback(this, options, successCallback, errorCallback);
 
   @DomName('Navigator.appCodeName')
   @DocsEditable()
@@ -21258,6 +22394,11 @@
   @DocsEditable()
   String get appVersion => _blink.BlinkNavigator.appVersion_Getter(this);
 
+  @DomName('Navigator.dartEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get dartEnabled => _blink.BlinkNavigator.dartEnabled_Getter(this);
+
   @DomName('Navigator.platform')
   @DocsEditable()
   String get platform => _blink.BlinkNavigator.platform_Getter(this);
@@ -21271,6 +22412,15 @@
   @DocsEditable()
   String get userAgent => _blink.BlinkNavigator.userAgent_Getter(this);
 
+  @DomName('Navigator.language')
+  @DocsEditable()
+  String get language => _blink.BlinkNavigator.language_Getter(this);
+
+  @DomName('Navigator.languages')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> get languages => _blink.BlinkNavigator.languages_Getter(this);
+
   @DomName('Navigator.onLine')
   @DocsEditable()
   @Unstable()
@@ -21285,6 +22435,26 @@
 
 
 @DocsEditable()
+@DomName('NavigatorCPU')
+@Experimental() // untriaged
+class NavigatorCpu extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory NavigatorCpu._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NavigatorCPU.hardwareConcurrency')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get hardwareConcurrency => _blink.BlinkNavigatorCPU.hardwareConcurrency_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('NavigatorID')
 @Experimental() // untriaged
 abstract class NavigatorID extends NativeFieldWrapperClass2 {
@@ -21306,6 +22476,11 @@
   @Experimental() // untriaged
   String get appVersion => _blink.BlinkNavigatorID.appVersion_Getter(this);
 
+  @DomName('NavigatorID.dartEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get dartEnabled => _blink.BlinkNavigatorID.dartEnabled_Getter(this);
+
   @DomName('NavigatorID.platform')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21330,6 +22505,31 @@
 
 
 @DocsEditable()
+@DomName('NavigatorLanguage')
+@Experimental() // untriaged
+class NavigatorLanguage extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory NavigatorLanguage._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NavigatorLanguage.language')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get language => _blink.BlinkNavigatorLanguage.language_Getter(this);
+
+  @DomName('NavigatorLanguage.languages')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> get languages => _blink.BlinkNavigatorLanguage.languages_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('NavigatorOnLine')
 @Experimental() // untriaged
 abstract class NavigatorOnLine extends NativeFieldWrapperClass2 {
@@ -21396,6 +22596,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.
 
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('NetworkInformation')
+@Experimental() // untriaged
+class NetworkInformation extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory NetworkInformation._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('NetworkInformation.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get type => _blink.BlinkNetworkInformation.type_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
 
 /**
  * Lazy implementation of the child nodes of an element that does not request
@@ -22397,6 +23617,16 @@
   @DocsEditable()
   void set height(String value) => _blink.BlinkHTMLObjectElement.height_Setter_DOMString(this, value);
 
+  @DomName('HTMLObjectElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLObjectElement.integrity_Getter(this);
+
+  @DomName('HTMLObjectElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLObjectElement.integrity_Setter_DOMString(this, value);
+
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
   String get name => _blink.BlinkHTMLObjectElement.name_Getter(this);
@@ -22819,6 +24049,16 @@
   @Experimental() // untriaged
   Element get _lastElementChild => _blink.BlinkParentNode.lastElementChild_Getter(this);
 
+  @DomName('ParentNode.querySelector')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element querySelector(String selectors) => _blink.BlinkParentNode.querySelector_Callback_DOMString(this, selectors);
+
+  @DomName('ParentNode.querySelectorAll')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<Node> querySelectorAll(String selectors) => _blink.BlinkParentNode.querySelectorAll_Callback_DOMString(this, selectors);
+
 }
 // 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
@@ -22828,59 +24068,80 @@
 
 
 @DocsEditable()
-@DomName('Path')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
-@Experimental()
-class Path extends NativeFieldWrapperClass2 {
+@DomName('Path2D')
+@Experimental() // untriaged
+class Path2D extends NativeFieldWrapperClass2 implements _CanvasPathMethods {
   // To suppress missing implicit constructor warnings.
-  factory Path._() { throw new UnsupportedError("Not supported"); }
+  factory Path2D._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Path.Path')
+  @DomName('Path2D.Path2D')
   @DocsEditable()
-  factory Path([path_OR_text]) {
+  factory Path2D([path_OR_text]) {
     if (path_OR_text == null) {
-      return _blink.BlinkPath.constructorCallback();
+      return _blink.BlinkPath2D.constructorCallback();
     }
-    if ((path_OR_text is Path || path_OR_text == null)) {
-      return _blink.BlinkPath.constructorCallback_Path2D(path_OR_text);
+    if ((path_OR_text is Path2D || path_OR_text == null)) {
+      return _blink.BlinkPath2D.constructorCallback_Path2D(path_OR_text);
     }
     if ((path_OR_text is String || path_OR_text == null)) {
-      return _blink.BlinkPath.constructorCallback_DOMString(path_OR_text);
+      return _blink.BlinkPath2D.constructorCallback_DOMString(path_OR_text);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('Path.arc')
-  @DocsEditable()
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath.arc_Callback_float_float_float_float_float_boolean(this, x, y, radius, startAngle, endAngle, anticlockwise);
+  void addPath(Path2D path, [Matrix transform]) {
+    if (transform != null) {
+      _blink.BlinkPath2D.addPath_Callback_Path2D_SVGMatrix(this, path, transform);
+      return;
+    }
+    _blink.BlinkPath2D.addPath_Callback_Path2D(this, path);
+    return;
+  }
 
-  @DomName('Path.arcTo')
+  @DomName('Path2D.arc')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkPath.arcTo_Callback_float_float_float_float_float(this, x1, y1, x2, y2, radius);
+  @Experimental() // untriaged
+  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.arc_Callback_float_float_float_float_float_boolean(this, x, y, radius, startAngle, endAngle, anticlockwise);
 
-  @DomName('Path.bezierCurveTo')
+  @DomName('Path2D.arcTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkPath.bezierCurveTo_Callback_float_float_float_float_float_float(this, cp1x, cp1y, cp2x, cp2y, x, y);
+  @Experimental() // untriaged
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkPath2D.arcTo_Callback_float_float_float_float_float(this, x1, y1, x2, y2, radius);
 
-  @DomName('Path.closePath')
+  @DomName('Path2D.bezierCurveTo')
   @DocsEditable()
-  void closePath() => _blink.BlinkPath.closePath_Callback(this);
+  @Experimental() // untriaged
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkPath2D.bezierCurveTo_Callback_float_float_float_float_float_float(this, cp1x, cp1y, cp2x, cp2y, x, y);
 
-  @DomName('Path.lineTo')
+  @DomName('Path2D.closePath')
   @DocsEditable()
-  void lineTo(num x, num y) => _blink.BlinkPath.lineTo_Callback_float_float(this, x, y);
+  @Experimental() // untriaged
+  void closePath() => _blink.BlinkPath2D.closePath_Callback(this);
 
-  @DomName('Path.moveTo')
+  @DomName('Path2D.ellipse')
   @DocsEditable()
-  void moveTo(num x, num y) => _blink.BlinkPath.moveTo_Callback_float_float(this, x, y);
+  @Experimental() // untriaged
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.ellipse_Callback_float_float_float_float_float_float_float_boolean(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
 
-  @DomName('Path.quadraticCurveTo')
+  @DomName('Path2D.lineTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkPath.quadraticCurveTo_Callback_float_float_float_float(this, cpx, cpy, x, y);
+  @Experimental() // untriaged
+  void lineTo(num x, num y) => _blink.BlinkPath2D.lineTo_Callback_float_float(this, x, y);
 
-  @DomName('Path.rect')
+  @DomName('Path2D.moveTo')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) => _blink.BlinkPath.rect_Callback_float_float_float_float(this, x, y, width, height);
+  @Experimental() // untriaged
+  void moveTo(num x, num y) => _blink.BlinkPath2D.moveTo_Callback_float_float(this, x, y);
+
+  @DomName('Path2D.quadraticCurveTo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkPath2D.quadraticCurveTo_Callback_float_float_float_float(this, cpx, cpy, x, y);
+
+  @DomName('Path2D.rect')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void rect(num x, num y, num width, num height) => _blink.BlinkPath2D.rect_Callback_float_float_float_float(this, x, y, width, height);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23276,91 +24537,17 @@
 
 
 @DocsEditable()
-@DomName('Player')
+@DomName('HTMLPictureElement')
 @Experimental() // untriaged
-class Player extends NativeFieldWrapperClass2 {
+class PictureElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory Player._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Player.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get currentTime => _blink.BlinkPlayer.currentTime_Getter(this);
-
-  @DomName('Player.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void set currentTime(num value) => _blink.BlinkPlayer.currentTime_Setter_double(this, value);
-
-  @DomName('Player.finished')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool get finished => _blink.BlinkPlayer.finished_Getter(this);
-
-  @DomName('Player.paused')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool get paused => _blink.BlinkPlayer.paused_Getter(this);
-
-  @DomName('Player.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get playbackRate => _blink.BlinkPlayer.playbackRate_Getter(this);
-
-  @DomName('Player.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void set playbackRate(num value) => _blink.BlinkPlayer.playbackRate_Setter_double(this, value);
-
-  @DomName('Player.source')
-  @DocsEditable()
-  @Experimental() // untriaged
-  TimedItem get source => _blink.BlinkPlayer.source_Getter(this);
-
-  @DomName('Player.source')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void set source(TimedItem value) => _blink.BlinkPlayer.source_Setter_TimedItem(this, value);
-
-  @DomName('Player.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  num get startTime => _blink.BlinkPlayer.startTime_Getter(this);
-
-  @DomName('Player.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void set startTime(num value) => _blink.BlinkPlayer.startTime_Setter_double(this, value);
-
-  @DomName('Player.timeLag')
-  @DocsEditable()
-  @Experimental() // untriaged
-  double get timeLag => _blink.BlinkPlayer.timeLag_Getter(this);
-
-  @DomName('Player.cancel')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void cancel() => _blink.BlinkPlayer.cancel_Callback(this);
-
-  @DomName('Player.finish')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void finish() => _blink.BlinkPlayer.finish_Callback(this);
-
-  @DomName('Player.pause')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void pause() => _blink.BlinkPlayer.pause_Callback(this);
-
-  @DomName('Player.play')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void play() => _blink.BlinkPlayer.play_Callback(this);
-
-  @DomName('Player.reverse')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void reverse() => _blink.BlinkPlayer.reverse_Callback(this);
+  factory PictureElement._() { throw new UnsupportedError("Not supported"); }
+  /**
+   * Constructor instantiated by the DOM when a custom element has been created.
+   *
+   * This can only be called by subclasses from their created constructor.
+   */
+  PictureElement.created() : super.created();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23702,6 +24889,66 @@
 
 
 @DocsEditable()
+@DomName('PushEvent')
+@Experimental() // untriaged
+class PushEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory PushEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PushEvent.data')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get data => _blink.BlinkPushEvent.data_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('PushManager')
+@Experimental() // untriaged
+class PushManager extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory PushManager._() { throw new UnsupportedError("Not supported"); }
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('PushRegistration')
+@Experimental() // untriaged
+class PushRegistration extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory PushRegistration._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('PushRegistration.pushEndpoint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get pushEndpoint => _blink.BlinkPushRegistration.pushEndpoint_Getter(this);
+
+  @DomName('PushRegistration.pushRegistrationId')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get pushRegistrationId => _blink.BlinkPushRegistration.pushRegistrationId_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('HTMLQuoteElement')
 class QuoteElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -23946,6 +25193,47 @@
 // WARNING: Do not edit - generated code.
 
 
+@DocsEditable()
+@DomName('Request')
+@Experimental() // untriaged
+class Request extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory Request._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Request.Request')
+  @DocsEditable()
+  factory Request([Map requestInitDict]) {
+    return _blink.BlinkRequest.constructorCallback_Dictionary(requestInitDict);
+  }
+
+  @DomName('Request.headers')
+  @DocsEditable()
+  @Experimental() // untriaged
+  HeaderMap get headers => _blink.BlinkRequest.headers_Getter(this);
+
+  @DomName('Request.origin')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get origin => _blink.BlinkRequest.origin_Getter(this);
+
+  @DomName('Request.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get url => _blink.BlinkRequest.url_Getter(this);
+
+  @DomName('Request.url')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set url(String value) => _blink.BlinkRequest.url_Setter_DOMString(this, value);
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
 @DomName('RequestAnimationFrameCallback')
 typedef void RequestAnimationFrameCallback(num highResTime);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23976,6 +25264,51 @@
 
 
 @DocsEditable()
+@DomName('RsaHashedKeyAlgorithm')
+@Experimental() // untriaged
+class RsaHashedKeyAlgorithm extends RsaKeyAlgorithm {
+  // To suppress missing implicit constructor warnings.
+  factory RsaHashedKeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('RsaHashedKeyAlgorithm.hash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  KeyAlgorithm get hash => _blink.BlinkRsaHashedKeyAlgorithm.hash_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('RsaKeyAlgorithm')
+@Experimental() // untriaged
+class RsaKeyAlgorithm extends KeyAlgorithm {
+  // To suppress missing implicit constructor warnings.
+  factory RsaKeyAlgorithm._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('RsaKeyAlgorithm.modulusLength')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get modulusLength => _blink.BlinkRsaKeyAlgorithm.modulusLength_Getter(this);
+
+  @DomName('RsaKeyAlgorithm.publicExponent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Uint8List get publicExponent => _blink.BlinkRsaKeyAlgorithm.publicExponent_Getter(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('RTCDataChannel')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDataChannel
 @Experimental()
@@ -24082,20 +25415,20 @@
   void close() => _blink.BlinkRTCDataChannel.close_Callback(this);
 
   void send(data) {
-    if ((data is TypedData || data == null)) {
-      _blink.BlinkRTCDataChannel.send_Callback_ArrayBufferView(this, data);
-      return;
-    }
-    if ((data is ByteBuffer || data == null)) {
-      _blink.BlinkRTCDataChannel.send_Callback_ArrayBuffer(this, data);
+    if ((data is String || data == null)) {
+      _blink.BlinkRTCDataChannel.send_Callback_DOMString(this, data);
       return;
     }
     if ((data is Blob || data == null)) {
       _blink.BlinkRTCDataChannel.send_Callback_Blob(this, data);
       return;
     }
-    if ((data is String || data == null)) {
-      _blink.BlinkRTCDataChannel.send_Callback_DOMString(this, data);
+    if ((data is TypedData || data == null)) {
+      _blink.BlinkRTCDataChannel.send_Callback_ArrayBufferView(this, data);
+      return;
+    }
+    if ((data is ByteBuffer || data == null)) {
+      _blink.BlinkRTCDataChannel.send_Callback_ArrayBuffer(this, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -24268,14 +25601,26 @@
   @DocsEditable()
   String get candidate => _blink.BlinkRTCIceCandidate.candidate_Getter(this);
 
+  @DomName('RTCIceCandidate.candidate')
+  @DocsEditable()
+  void set candidate(String value) => _blink.BlinkRTCIceCandidate.candidate_Setter_DOMString(this, value);
+
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
   int get sdpMLineIndex => _blink.BlinkRTCIceCandidate.sdpMLineIndex_Getter(this);
 
+  @DomName('RTCIceCandidate.sdpMLineIndex')
+  @DocsEditable()
+  void set sdpMLineIndex(int value) => _blink.BlinkRTCIceCandidate.sdpMLineIndex_Setter_us(this, value);
+
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
   String get sdpMid => _blink.BlinkRTCIceCandidate.sdpMid_Getter(this);
 
+  @DomName('RTCIceCandidate.sdpMid')
+  @DocsEditable()
+  void set sdpMid(String value) => _blink.BlinkRTCIceCandidate.sdpMid_Setter_DOMString(this, value);
+
 }
 // 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
@@ -24664,7 +26009,7 @@
 
 @DocsEditable()
 @DomName('Screen')
-class Screen extends EventTarget {
+class Screen extends NativeFieldWrapperClass2 {
 
   @DomName('Screen.availHeight')
   @DomName('Screen.availLeft')
@@ -24714,11 +26059,6 @@
   @DocsEditable()
   int get width => _blink.BlinkScreen.width_Getter(this);
 
-  @DomName('Screen.lockOrientation')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool lockOrientation(String orientation) => _blink.BlinkScreen.lockOrientation_Callback_DOMString(this, orientation);
-
   @DomName('Screen.unlockOrientation')
   @DocsEditable()
   @Experimental() // untriaged
@@ -24783,6 +26123,16 @@
   @DocsEditable()
   void set defer(bool value) => _blink.BlinkHTMLScriptElement.defer_Setter_boolean(this, value);
 
+  @DomName('HTMLScriptElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLScriptElement.integrity_Getter(this);
+
+  @DomName('HTMLScriptElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLScriptElement.integrity_Setter_DOMString(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
@@ -24990,6 +26340,11 @@
   @DocsEditable()
   void __setter__(int index, OptionElement value) => _blink.BlinkHTMLSelectElement.$__setter___Callback_ul_HTMLOptionElement(this, index, value);
 
+  @DomName('HTMLSelectElement.add')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void add(HtmlElement element, int before) => _blink.BlinkHTMLSelectElement.add_Callback_HTMLElement_long(this, element, before);
+
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
   bool checkValidity() => _blink.BlinkHTMLSelectElement.checkValidity_Callback(this);
@@ -25091,9 +26446,14 @@
   @DocsEditable()
   void addRange(Range range) => _blink.BlinkSelection.addRange_Callback_Range(this, range);
 
-  @DomName('Selection.collapse')
-  @DocsEditable()
-  void collapse(Node node, int index) => _blink.BlinkSelection.collapse_Callback_Node_long(this, node, index);
+  void collapse(Node node, [int offset]) {
+    if (offset != null) {
+      _blink.BlinkSelection.collapse_Callback_Node_long(this, node, offset);
+      return;
+    }
+    _blink.BlinkSelection.collapse_Callback_Node(this, node);
+    return;
+  }
 
   @DomName('Selection.collapseToEnd')
   @DocsEditable()
@@ -25143,10 +26503,14 @@
   @Experimental() // non-standard
   void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.BlinkSelection.setBaseAndExtent_Callback_Node_long_Node_long(this, baseNode, baseOffset, extentNode, extentOffset);
 
-  @DomName('Selection.setPosition')
-  @DocsEditable()
-  @Experimental() // non-standard
-  void setPosition(Node node, int offset) => _blink.BlinkSelection.setPosition_Callback_Node_long(this, node, offset);
+  void setPosition(Node node, [int offset]) {
+    if (offset != null) {
+      _blink.BlinkSelection.setPosition_Callback_Node_long(this, node, offset);
+      return;
+    }
+    _blink.BlinkSelection.setPosition_Callback_Node(this, node);
+    return;
+  }
 
   @DomName('Selection.toString')
   @DocsEditable()
@@ -25161,12 +26525,47 @@
 
 
 @DocsEditable()
+@DomName('ServiceWorkerClients')
+@Experimental() // untriaged
+class ServiceWorkerClients extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory ServiceWorkerClients._() { throw new UnsupportedError("Not supported"); }
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('ServiceWorkerContainer')
 @Experimental() // untriaged
 class ServiceWorkerContainer extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerContainer._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ServiceWorkerContainer.active')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _ServiceWorker get active => _blink.BlinkServiceWorkerContainer.active_Getter(this);
+
+  @DomName('ServiceWorkerContainer.controller')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _ServiceWorker get controller => _blink.BlinkServiceWorkerContainer.controller_Getter(this);
+
+  @DomName('ServiceWorkerContainer.installing')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _ServiceWorker get installing => _blink.BlinkServiceWorkerContainer.installing_Getter(this);
+
+  @DomName('ServiceWorkerContainer.waiting')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _ServiceWorker get waiting => _blink.BlinkServiceWorkerContainer.waiting_Getter(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
@@ -25182,6 +26581,26 @@
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('ServiceWorkerGlobalScope.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('ServiceWorkerGlobalScope.clients')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ServiceWorkerClients get clients => _blink.BlinkServiceWorkerGlobalScope.clients_Getter(this);
+
+  @DomName('ServiceWorkerGlobalScope.scope')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get scope => _blink.BlinkServiceWorkerGlobalScope.scope_Getter(this);
+
+  @DomName('ServiceWorkerGlobalScope.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MessageEvent> get onMessage => messageEvent.forTarget(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
@@ -25212,14 +26631,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-  @DomName('HTMLShadowElement.resetStyleInheritance')
-  @DocsEditable()
-  bool get resetStyleInheritance => _blink.BlinkHTMLShadowElement.resetStyleInheritance_Getter(this);
-
-  @DomName('HTMLShadowElement.resetStyleInheritance')
-  @DocsEditable()
-  void set resetStyleInheritance(bool value) => _blink.BlinkHTMLShadowElement.resetStyleInheritance_Setter_boolean(this, value);
-
   @DomName('HTMLShadowElement.getDistributedNodes')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25263,14 +26674,6 @@
   @Experimental() // untriaged
   ShadowRoot get olderShadowRoot => _blink.BlinkShadowRoot.olderShadowRoot_Getter(this);
 
-  @DomName('ShadowRoot.resetStyleInheritance')
-  @DocsEditable()
-  bool get _resetStyleInheritance => _blink.BlinkShadowRoot.resetStyleInheritance_Getter(this);
-
-  @DomName('ShadowRoot.resetStyleInheritance')
-  @DocsEditable()
-  void set _resetStyleInheritance(bool value) => _blink.BlinkShadowRoot.resetStyleInheritance_Setter_boolean(this, value);
-
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25599,6 +27002,16 @@
    */
   SourceElement.created() : super.created();
 
+  @DomName('HTMLSourceElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLSourceElement.integrity_Getter(this);
+
+  @DomName('HTMLSourceElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLSourceElement.integrity_Setter_DOMString(this, value);
+
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
   String get media => _blink.BlinkHTMLSourceElement.media_Getter(this);
@@ -25607,6 +27020,16 @@
   @DocsEditable()
   void set media(String value) => _blink.BlinkHTMLSourceElement.media_Setter_DOMString(this, value);
 
+  @DomName('HTMLSourceElement.sizes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get sizes => _blink.BlinkHTMLSourceElement.sizes_Getter(this);
+
+  @DomName('HTMLSourceElement.sizes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set sizes(String value) => _blink.BlinkHTMLSourceElement.sizes_Setter_DOMString(this, value);
+
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
   String get src => _blink.BlinkHTMLSourceElement.src_Getter(this);
@@ -25615,6 +27038,16 @@
   @DocsEditable()
   void set src(String value) => _blink.BlinkHTMLSourceElement.src_Setter_DOMString(this, value);
 
+  @DomName('HTMLSourceElement.srcset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get srcset => _blink.BlinkHTMLSourceElement.srcset_Getter(this);
+
+  @DomName('HTMLSourceElement.srcset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set srcset(String value) => _blink.BlinkHTMLSourceElement.srcset_Setter_DOMString(this, value);
+
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
   String get type => _blink.BlinkHTMLSourceElement.type_Getter(this);
@@ -25823,38 +27256,6 @@
 
 
 @DocsEditable()
-@DomName('SpeechInputEvent')
-// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_event_interface
-@Experimental()
-class SpeechInputEvent extends Event {
-  // To suppress missing implicit constructor warnings.
-  factory SpeechInputEvent._() { throw new UnsupportedError("Not supported"); }
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('SpeechInputResult')
-// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_result_interface
-@Experimental()
-class SpeechInputResult extends NativeFieldWrapperClass2 {
-  // To suppress missing implicit constructor warnings.
-  factory SpeechInputResult._() { throw new UnsupportedError("Not supported"); }
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('SpeechRecognition')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental()
@@ -26813,14 +28214,6 @@
   @DocsEditable()
   void set media(String value) => _blink.BlinkHTMLStyleElement.media_Setter_DOMString(this, value);
 
-  @DomName('HTMLStyleElement.scoped')
-  @DocsEditable()
-  bool get scoped => _blink.BlinkHTMLStyleElement.scoped_Getter(this);
-
-  @DomName('HTMLStyleElement.scoped')
-  @DocsEditable()
-  void set scoped(bool value) => _blink.BlinkHTMLStyleElement.scoped_Setter_boolean(this, value);
-
   @DomName('HTMLStyleElement.sheet')
   @DocsEditable()
   StyleSheet get sheet => _blink.BlinkHTMLStyleElement.sheet_Getter(this);
@@ -27117,9 +28510,12 @@
   @DocsEditable()
   void deleteTHead() => _blink.BlinkHTMLTableElement.deleteTHead_Callback(this);
 
-  @DomName('HTMLTableElement.insertRow')
-  @DocsEditable()
-  HtmlElement _insertRow(int index) => _blink.BlinkHTMLTableElement.insertRow_Callback_long(this, index);
+  HtmlElement _insertRow([int index]) {
+    if (index != null) {
+      return _blink.BlinkHTMLTableElement.insertRow_Callback_long(this, index);
+    }
+    return _blink.BlinkHTMLTableElement.insertRow_Callback(this);
+  }
 }
 // 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
@@ -27170,9 +28566,12 @@
   @DocsEditable()
   void deleteCell(int index) => _blink.BlinkHTMLTableRowElement.deleteCell_Callback_long(this, index);
 
-  @DomName('HTMLTableRowElement.insertCell')
-  @DocsEditable()
-  HtmlElement _insertCell(int index) => _blink.BlinkHTMLTableRowElement.insertCell_Callback_long(this, index);
+  HtmlElement _insertCell([int index]) {
+    if (index != null) {
+      return _blink.BlinkHTMLTableRowElement.insertCell_Callback_long(this, index);
+    }
+    return _blink.BlinkHTMLTableRowElement.insertCell_Callback(this);
+  }
 }
 // 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
@@ -27211,9 +28610,12 @@
   @DocsEditable()
   void deleteRow(int index) => _blink.BlinkHTMLTableSectionElement.deleteRow_Callback_long(this, index);
 
-  @DomName('HTMLTableSectionElement.insertRow')
-  @DocsEditable()
-  HtmlElement _insertRow(int index) => _blink.BlinkHTMLTableSectionElement.insertRow_Callback_long(this, index);
+  HtmlElement _insertRow([int index]) {
+    if (index != null) {
+      return _blink.BlinkHTMLTableSectionElement.insertRow_Callback_long(this, index);
+    }
+    return _blink.BlinkHTMLTableSectionElement.insertRow_Callback(this);
+  }
 }
 // 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
@@ -27564,6 +28966,61 @@
   // To suppress missing implicit constructor warnings.
   factory TextMetrics._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('TextMetrics.actualBoundingBoxAscent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get actualBoundingBoxAscent => _blink.BlinkTextMetrics.actualBoundingBoxAscent_Getter(this);
+
+  @DomName('TextMetrics.actualBoundingBoxDescent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get actualBoundingBoxDescent => _blink.BlinkTextMetrics.actualBoundingBoxDescent_Getter(this);
+
+  @DomName('TextMetrics.actualBoundingBoxLeft')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get actualBoundingBoxLeft => _blink.BlinkTextMetrics.actualBoundingBoxLeft_Getter(this);
+
+  @DomName('TextMetrics.actualBoundingBoxRight')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get actualBoundingBoxRight => _blink.BlinkTextMetrics.actualBoundingBoxRight_Getter(this);
+
+  @DomName('TextMetrics.alphabeticBaseline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get alphabeticBaseline => _blink.BlinkTextMetrics.alphabeticBaseline_Getter(this);
+
+  @DomName('TextMetrics.emHeightAscent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get emHeightAscent => _blink.BlinkTextMetrics.emHeightAscent_Getter(this);
+
+  @DomName('TextMetrics.emHeightDescent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get emHeightDescent => _blink.BlinkTextMetrics.emHeightDescent_Getter(this);
+
+  @DomName('TextMetrics.fontBoundingBoxAscent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get fontBoundingBoxAscent => _blink.BlinkTextMetrics.fontBoundingBoxAscent_Getter(this);
+
+  @DomName('TextMetrics.fontBoundingBoxDescent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get fontBoundingBoxDescent => _blink.BlinkTextMetrics.fontBoundingBoxDescent_Getter(this);
+
+  @DomName('TextMetrics.hangingBaseline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get hangingBaseline => _blink.BlinkTextMetrics.hangingBaseline_Getter(this);
+
+  @DomName('TextMetrics.ideographicBaseline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get ideographicBaseline => _blink.BlinkTextMetrics.ideographicBaseline_Getter(this);
+
   @DomName('TextMetrics.width')
   @DocsEditable()
   double get width => _blink.BlinkTextMetrics.width_Getter(this);
@@ -27946,76 +29403,6 @@
 // WARNING: Do not edit - generated code.
 
 
-@DocsEditable()
-@DomName('TimedItem')
-@Experimental() // untriaged
-class TimedItem extends NativeFieldWrapperClass2 {
-  // To suppress missing implicit constructor warnings.
-  factory TimedItem._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('TimedItem.activeDuration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  double get activeDuration => _blink.BlinkTimedItem.activeDuration_Getter(this);
-
-  @DomName('TimedItem.currentIteration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  int get currentIteration => _blink.BlinkTimedItem.currentIteration_Getter(this);
-
-  @DomName('TimedItem.duration')
-  @DocsEditable()
-  @Experimental() // untriaged
-  double get duration => _blink.BlinkTimedItem.duration_Getter(this);
-
-  @DomName('TimedItem.endTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  double get endTime => _blink.BlinkTimedItem.endTime_Getter(this);
-
-  @DomName('TimedItem.localTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  double get localTime => _blink.BlinkTimedItem.localTime_Getter(this);
-
-  @DomName('TimedItem.player')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Player get player => _blink.BlinkTimedItem.player_Getter(this);
-
-  @DomName('TimedItem.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
-  double get startTime => _blink.BlinkTimedItem.startTime_Getter(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
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('Timeline')
-@Experimental() // untriaged
-class Timeline extends NativeFieldWrapperClass2 {
-  // To suppress missing implicit constructor warnings.
-  factory Timeline._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Timeline.play')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Player play(TimedItem source) => _blink.BlinkTimeline.play_Callback_TimedItem(this, source);
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
 @DomName('TimeoutHandler')
 typedef void TimeoutHandler();
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28112,6 +29499,11 @@
   @Experimental() // untriaged
   void set playbackRate(num value) => _blink.BlinkTiming.playbackRate_Setter_double(this, value);
 
+  @DomName('Timing.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object __getter__(String name) => _blink.BlinkTiming.$__getter___Callback_DOMString(this, name);
+
   @DomName('Timing.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28157,11 +29549,11 @@
 
   @DomName('Touch.clientX')
   @DocsEditable()
-  int get _clientX => _blink.BlinkTouch.clientX_Getter(this);
+  double get _clientX => _blink.BlinkTouch.clientX_Getter(this);
 
   @DomName('Touch.clientY')
   @DocsEditable()
-  int get _clientY => _blink.BlinkTouch.clientY_Getter(this);
+  double get _clientY => _blink.BlinkTouch.clientY_Getter(this);
 
   @DomName('Touch.identifier')
   @DocsEditable()
@@ -28169,19 +29561,19 @@
 
   @DomName('Touch.pageX')
   @DocsEditable()
-  int get _pageX => _blink.BlinkTouch.pageX_Getter(this);
+  double get _pageX => _blink.BlinkTouch.pageX_Getter(this);
 
   @DomName('Touch.pageY')
   @DocsEditable()
-  int get _pageY => _blink.BlinkTouch.pageY_Getter(this);
+  double get _pageY => _blink.BlinkTouch.pageY_Getter(this);
 
   @DomName('Touch.screenX')
   @DocsEditable()
-  int get _screenX => _blink.BlinkTouch.screenX_Getter(this);
+  double get _screenX => _blink.BlinkTouch.screenX_Getter(this);
 
   @DomName('Touch.screenY')
   @DocsEditable()
-  int get _screenY => _blink.BlinkTouch.screenY_Getter(this);
+  double get _screenY => _blink.BlinkTouch.screenY_Getter(this);
 
   @DomName('Touch.target')
   @DocsEditable()
@@ -28199,14 +29591,14 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitRadiusX => _blink.BlinkTouch.webkitRadiusX_Getter(this);
+  double get _webkitRadiusX => _blink.BlinkTouch.webkitRadiusX_Getter(this);
 
   @DomName('Touch.webkitRadiusY')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitRadiusY => _blink.BlinkTouch.webkitRadiusY_Getter(this);
+  double get _webkitRadiusY => _blink.BlinkTouch.webkitRadiusY_Getter(this);
 
   @DomName('Touch.webkitRotationAngle')
   @DocsEditable()
@@ -28311,7 +29703,7 @@
 
   @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.BlinkTouchEvent.initTouchEvent_Callback_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean(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 unused1, int unused2, int unused3, int unused4, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkTouchEvent.initTouchEvent_Callback_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean(this, touches, targetTouches, changedTouches, type, view, unused1, unused2, unused3, unused4, ctrlKey, altKey, shiftKey, metaKey);
 
 
   /**
@@ -28454,6 +29846,16 @@
   @DocsEditable()
   void set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.default_Setter_boolean(this, value);
 
+  @DomName('HTMLTrackElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get integrity => _blink.BlinkHTMLTrackElement.integrity_Getter(this);
+
+  @DomName('HTMLTrackElement.integrity')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set integrity(String value) => _blink.BlinkHTMLTrackElement.integrity_Setter_DOMString(this, value);
+
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
   String get kind => _blink.BlinkHTMLTrackElement.kind_Getter(this);
@@ -28752,10 +30154,10 @@
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return _blink.BlinkURL.createObjectURL_Callback_Blob(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaStream)) {
       return _blink.BlinkURL.createObjectURL_Callback_MediaStream(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaSource)) {
       return _blink.BlinkURL.createObjectURL_Callback_MediaSource(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -29257,6 +30659,96 @@
 // WARNING: Do not edit - generated code.
 
 
+@DocsEditable()
+@DomName('VideoTrack')
+@Experimental() // untriaged
+class VideoTrack extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory VideoTrack._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('VideoTrack.id')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get id => _blink.BlinkVideoTrack.id_Getter(this);
+
+  @DomName('VideoTrack.kind')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get kind => _blink.BlinkVideoTrack.kind_Getter(this);
+
+  @DomName('VideoTrack.label')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get label => _blink.BlinkVideoTrack.label_Getter(this);
+
+  @DomName('VideoTrack.language')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get language => _blink.BlinkVideoTrack.language_Getter(this);
+
+  @DomName('VideoTrack.selected')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get selected => _blink.BlinkVideoTrack.selected_Getter(this);
+
+  @DomName('VideoTrack.selected')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set selected(bool value) => _blink.BlinkVideoTrack.selected_Setter_boolean(this, value);
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('VideoTrackList')
+@Experimental() // untriaged
+class VideoTrackList extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory VideoTrackList._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('VideoTrackList.changeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+
+  @DomName('VideoTrackList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkVideoTrackList.length_Getter(this);
+
+  @DomName('VideoTrackList.selectedIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get selectedIndex => _blink.BlinkVideoTrackList.selectedIndex_Getter(this);
+
+  @DomName('VideoTrackList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VideoTrack __getter__(int index) => _blink.BlinkVideoTrackList.$__getter___Callback_ul(this, index);
+
+  @DomName('VideoTrackList.getTrackById')
+  @DocsEditable()
+  @Experimental() // untriaged
+  VideoTrack getTrackById(String id) => _blink.BlinkVideoTrackList.getTrackById_Callback_DOMString(this, id);
+
+  @DomName('VideoTrackList.onchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onChange => changeEvent.forTarget(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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
 @DomName('VoidCallback')
 // http://www.w3.org/TR/file-system-api/#the-voidcallback-interface
 @Experimental()
@@ -29601,12 +31093,12 @@
     if ((url is String || url == null) && protocol_OR_protocols == null) {
       return _blink.BlinkWebSocket.constructorCallback_DOMString(url);
     }
-    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return _blink.BlinkWebSocket.constructorCallback_DOMString_SEQ_DOMString_SEQ(url, protocol_OR_protocols);
-    }
     if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
       return _blink.BlinkWebSocket.constructorCallback_DOMString_DOMString(url, protocol_OR_protocols);
     }
+    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
+      return _blink.BlinkWebSocket.constructorCallback_DOMString_SEQ_DOMString_SEQ(url, protocol_OR_protocols);
+    }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
@@ -29671,20 +31163,20 @@
   }
 
   void send(data) {
-    if ((data is TypedData || data == null)) {
-      _blink.BlinkWebSocket.send_Callback_ArrayBufferView(this, data);
-      return;
-    }
-    if ((data is ByteBuffer || data == null)) {
-      _blink.BlinkWebSocket.send_Callback_ArrayBuffer(this, data);
+    if ((data is String || data == null)) {
+      _blink.BlinkWebSocket.send_Callback_DOMString(this, data);
       return;
     }
     if ((data is Blob || data == null)) {
       _blink.BlinkWebSocket.send_Callback_Blob(this, data);
       return;
     }
-    if ((data is String || data == null)) {
-      _blink.BlinkWebSocket.send_Callback_DOMString(this, data);
+    if ((data is TypedData || data == null)) {
+      _blink.BlinkWebSocket.send_Callback_ArrayBufferView(this, data);
+      return;
+    }
+    if ((data is ByteBuffer || data == null)) {
+      _blink.BlinkWebSocket.send_Callback_ArrayBuffer(this, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -30033,6 +31525,10 @@
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  @DomName('Window.loadstartEvent')
+  @DocsEditable()
+  static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
+
   /**
    * Static factory designed to expose `message` events to event
    * handlers that are not necessarily instances of [Window].
@@ -30093,6 +31589,10 @@
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  @DomName('Window.progressEvent')
+  @DocsEditable()
+  static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
+
   /**
    * Static factory designed to expose `storage` events to event
    * handlers that are not necessarily instances of [Window].
@@ -30712,27 +32212,23 @@
   WindowBase get window => _blink.BlinkWindow.window_Getter(this);
 
   WindowBase __getter__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
+    if ((index_OR_name is int)) {
       return _blink.BlinkWindow.$__getter___Callback_ul(this, index_OR_name);
     }
-    if ((index_OR_name is String || index_OR_name == null)) {
+    if ((index_OR_name is String)) {
       return _blink.BlinkWindow.$__getter___Callback_DOMString(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  /**
-   * Displays a modal alert to the user.
-   *
-   * ## Other resources
-   *
-   * * [User prompts]
-   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
-   * from WHATWG.
-   */
-  @DomName('Window.alert')
-  @DocsEditable()
-  void alert(String message) => _blink.BlinkWindow.alert_Callback_DOMString(this, message);
+  void alert([String message]) {
+    if (message != null) {
+      _blink.BlinkWindow.alert_Callback_DOMString(this, message);
+      return;
+    }
+    _blink.BlinkWindow.alert_Callback(this);
+    return;
+  }
 
   @DomName('Window.cancelAnimationFrame')
   @DocsEditable()
@@ -31050,6 +32546,14 @@
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  @DomName('Window.oncanplay')
+  @DocsEditable()
+  Stream<Event> get onCanPlay => Element.canPlayEvent.forTarget(this);
+
+  @DomName('Window.oncanplaythrough')
+  @DocsEditable()
+  Stream<Event> get onCanPlayThrough => Element.canPlayThroughEvent.forTarget(this);
+
   /// Stream of `change` events handled by this [Window].
   @DomName('Window.onchange')
   @DocsEditable()
@@ -31119,6 +32623,18 @@
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  @DomName('Window.ondurationchange')
+  @DocsEditable()
+  Stream<Event> get onDurationChange => Element.durationChangeEvent.forTarget(this);
+
+  @DomName('Window.onemptied')
+  @DocsEditable()
+  Stream<Event> get onEmptied => Element.emptiedEvent.forTarget(this);
+
+  @DomName('Window.onended')
+  @DocsEditable()
+  Stream<Event> get onEnded => Element.endedEvent.forTarget(this);
+
   /// Stream of `error` events handled by this [Window].
   @DomName('Window.onerror')
   @DocsEditable()
@@ -31164,6 +32680,18 @@
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  @DomName('Window.onloadeddata')
+  @DocsEditable()
+  Stream<Event> get onLoadedData => Element.loadedDataEvent.forTarget(this);
+
+  @DomName('Window.onloadedmetadata')
+  @DocsEditable()
+  Stream<Event> get onLoadedMetadata => Element.loadedMetadataEvent.forTarget(this);
+
+  @DomName('Window.onloadstart')
+  @DocsEditable()
+  Stream<Event> get onLoadStart => loadStartEvent.forTarget(this);
+
   /// Stream of `message` events handled by this [Window].
   @DomName('Window.onmessage')
   @DocsEditable()
@@ -31231,11 +32759,31 @@
   @DocsEditable()
   Stream<Event> get onPageShow => pageShowEvent.forTarget(this);
 
+  @DomName('Window.onpause')
+  @DocsEditable()
+  Stream<Event> get onPause => Element.pauseEvent.forTarget(this);
+
+  @DomName('Window.onplay')
+  @DocsEditable()
+  Stream<Event> get onPlay => Element.playEvent.forTarget(this);
+
+  @DomName('Window.onplaying')
+  @DocsEditable()
+  Stream<Event> get onPlaying => Element.playingEvent.forTarget(this);
+
   /// Stream of `popstate` events handled by this [Window].
   @DomName('Window.onpopstate')
   @DocsEditable()
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
+  @DomName('Window.onprogress')
+  @DocsEditable()
+  Stream<Event> get onProgress => progressEvent.forTarget(this);
+
+  @DomName('Window.onratechange')
+  @DocsEditable()
+  Stream<Event> get onRateChange => Element.rateChangeEvent.forTarget(this);
+
   /// Stream of `reset` events handled by this [Window].
   @DomName('Window.onreset')
   @DocsEditable()
@@ -31258,11 +32806,23 @@
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  @DomName('Window.onseeked')
+  @DocsEditable()
+  Stream<Event> get onSeeked => Element.seekedEvent.forTarget(this);
+
+  @DomName('Window.onseeking')
+  @DocsEditable()
+  Stream<Event> get onSeeking => Element.seekingEvent.forTarget(this);
+
   /// Stream of `select` events handled by this [Window].
   @DomName('Window.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  @DomName('Window.onstalled')
+  @DocsEditable()
+  Stream<Event> get onStalled => Element.stalledEvent.forTarget(this);
+
   /// Stream of `storage` events handled by this [Window].
   @DomName('Window.onstorage')
   @DocsEditable()
@@ -31273,6 +32833,14 @@
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  @DomName('Window.onsuspend')
+  @DocsEditable()
+  Stream<Event> get onSuspend => Element.suspendEvent.forTarget(this);
+
+  @DomName('Window.ontimeupdate')
+  @DocsEditable()
+  Stream<Event> get onTimeUpdate => Element.timeUpdateEvent.forTarget(this);
+
   /// Stream of `touchcancel` events handled by this [Window].
   @DomName('Window.ontouchcancel')
   @DocsEditable()
@@ -31311,6 +32879,14 @@
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 
+  @DomName('Window.onvolumechange')
+  @DocsEditable()
+  Stream<Event> get onVolumeChange => Element.volumeChangeEvent.forTarget(this);
+
+  @DomName('Window.onwaiting')
+  @DocsEditable()
+  Stream<Event> get onWaiting => Element.waitingEvent.forTarget(this);
+
   /// Stream of `animationend` events handled by this [Window].
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable()
@@ -31586,21 +33162,6 @@
 
 
 @DocsEditable()
-@DomName('WorkerCrypto')
-@Experimental() // untriaged
-class WorkerCrypto extends NativeFieldWrapperClass2 {
-  // To suppress missing implicit constructor warnings.
-  factory WorkerCrypto._() { throw new UnsupportedError("Not supported"); }
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('WorkerGlobalScope')
 @Experimental() // untriaged
 class WorkerGlobalScope extends EventTarget implements _WindowTimers, WindowBase64 {
@@ -31636,7 +33197,7 @@
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerCrypto get crypto => _blink.BlinkWorkerGlobalScope.crypto_Getter(this);
+  Crypto get crypto => _blink.BlinkWorkerGlobalScope.crypto_Getter(this);
 
   @DomName('WorkerGlobalScope.indexedDB')
   @DocsEditable()
@@ -31668,6 +33229,11 @@
   @Experimental() // untriaged
   void close() => _blink.BlinkWorkerGlobalScope.close_Callback(this);
 
+  @DomName('WorkerGlobalScope.importScripts')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void importScripts(String urls) => _blink.BlinkWorkerGlobalScope.importScripts_Callback_DOMString(this, urls);
+
   @DomName('WorkerGlobalScope.openDatabase')
   @DocsEditable()
   @Experimental() // untriaged
@@ -31771,6 +33337,11 @@
   // To suppress missing implicit constructor warnings.
   factory WorkerPerformance._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('WorkerPerformance.memory')
+  @DocsEditable()
+  @Experimental() // untriaged
+  MemoryInfo get memory => _blink.BlinkWorkerPerformance.memory_Getter(this);
+
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32070,6 +33641,21 @@
   @Experimental() // untriaged
   String get _namespaceUri => _blink.BlinkAttr.namespaceURI_Getter(this);
 
+  @DomName('Attr.nodeValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get nodeValue => _blink.BlinkAttr.nodeValue_Getter(this);
+
+  @DomName('Attr.textContent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get text => _blink.BlinkAttr.textContent_Getter(this);
+
+  @DomName('Attr.textContent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set text(String value) => _blink.BlinkAttr.textContent_Setter_DOMString(this, value);
+
   @DomName('Attr.value')
   @DocsEditable()
   String get value => _blink.BlinkAttr.value_Getter(this);
@@ -32127,6 +33713,21 @@
   factory _CSSValue._() { throw new UnsupportedError("Not supported"); }
 
 }
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('CanvasPathMethods')
+@Experimental() // untriaged
+abstract class _CanvasPathMethods extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory _CanvasPathMethods._() { throw new UnsupportedError("Not supported"); }
+
+}
 // 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.
@@ -33076,28 +34677,6 @@
 
 
 @DocsEditable()
-@DomName('NotificationCenter')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/notifications/#showing-a-notification
-@deprecated // deprecated
-abstract class _NotificationCenter extends NativeFieldWrapperClass2 {
-  // To suppress missing implicit constructor warnings.
-  factory _NotificationCenter._() { throw new UnsupportedError("Not supported"); }
-
-  /// Checks if this type is supported on the current platform.
-  static bool get supported => true;
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('PagePopupController')
 @deprecated // nonstandard
 abstract class _PagePopupController extends NativeFieldWrapperClass2 {
@@ -33156,11 +34735,17 @@
 
 
 @DocsEditable()
-@DomName('ServiceWorker')
+@DomName('Response')
 @Experimental() // untriaged
-abstract class _ServiceWorker extends NativeFieldWrapperClass2 {
+abstract class _Response extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
-  factory _ServiceWorker._() { throw new UnsupportedError("Not supported"); }
+  factory _Response._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('Response.Response')
+  @DocsEditable()
+  factory _Response(Blob body, [Map responseInitDict]) {
+    return _blink.BlinkResponse.constructorCallback_Blob_Dictionary(body, responseInitDict);
+  }
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33171,66 +34756,11 @@
 
 
 @DocsEditable()
-@DomName('SpeechInputResultList')
-// http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_result_list_interface
-@Experimental()
-class _SpeechInputResultList extends NativeFieldWrapperClass2 with ListMixin<SpeechInputResult>, ImmutableListMixin<SpeechInputResult> implements List<SpeechInputResult> {
+@DomName('ServiceWorker')
+@Experimental() // untriaged
+abstract class _ServiceWorker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
-  factory _SpeechInputResultList._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SpeechInputResultList.length')
-  @DocsEditable()
-  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.BlinkSpeechInputResultList.item_Callback_ul(this, index);
-  }
-
-  SpeechInputResult _nativeIndexedGetter(int index) => _blink.BlinkSpeechInputResultList.item_Callback_ul(this, index);
-
-  void operator[]=(int index, SpeechInputResult value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SpeechInputResult> mixins.
-  // SpeechInputResult is the element type.
-
-
-  void set length(int value) {
-    throw new UnsupportedError("Cannot resize immutable List.");
-  }
-
-  SpeechInputResult get first {
-    if (this.length > 0) {
-      return _nativeIndexedGetter(0);
-    }
-    throw new StateError("No elements");
-  }
-
-  SpeechInputResult get last {
-    int len = this.length;
-    if (len > 0) {
-      return _nativeIndexedGetter(len - 1);
-    }
-    throw new StateError("No elements");
-  }
-
-  SpeechInputResult get single {
-    int len = this.length;
-    if (len == 1) {
-      return _nativeIndexedGetter(0);
-    }
-    if (len == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
-  }
-
-  SpeechInputResult elementAt(int index) => this[index];
-  // -- end List<SpeechInputResult> mixins.
-
-  @DomName('SpeechInputResultList.item')
-  @DocsEditable()
-  SpeechInputResult item(int index) => _blink.BlinkSpeechInputResultList.item_Callback_ul(this, index);
+  factory _ServiceWorker._() { throw new UnsupportedError("Not supported"); }
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33455,77 +34985,6 @@
 
 
 @DocsEditable()
-@DomName('WebKitMediaSource')
-@Experimental() // untriaged
-abstract class _WebKitMediaSource extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitMediaSource._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('WebKitMediaSource.WebKitMediaSource')
-  @DocsEditable()
-  factory _WebKitMediaSource() {
-    return _blink.BlinkWebKitMediaSource.constructorCallback();
-  }
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('WebKitNotification')
-@Experimental() // untriaged
-abstract class _WebKitNotification extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitNotification._() { throw new UnsupportedError("Not supported"); }
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('WebKitSourceBuffer')
-@Experimental() // untriaged
-abstract class _WebKitSourceBuffer extends NativeFieldWrapperClass2 {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitSourceBuffer._() { throw new UnsupportedError("Not supported"); }
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
-@DomName('WebKitSourceBufferList')
-@Experimental() // untriaged
-abstract class _WebKitSourceBufferList extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory _WebKitSourceBufferList._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('WebKitSourceBufferList.item')
-  @DocsEditable()
-  @Experimental() // untriaged
-  _WebKitSourceBuffer _item(int index) => _blink.BlinkWebKitSourceBufferList.item_Callback_ul(this, index);
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('WindowTimers')
 @Experimental() // untriaged
 abstract class _WindowTimers extends NativeFieldWrapperClass2 {
@@ -33580,7 +35039,7 @@
 @DomName('WorkerNavigator')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
 @Experimental()
-abstract class _WorkerNavigator extends NativeFieldWrapperClass2 implements NavigatorOnLine, NavigatorID {
+abstract class _WorkerNavigator extends NavigatorCpu implements NavigatorOnLine, NavigatorID {
   // To suppress missing implicit constructor warnings.
   factory _WorkerNavigator._() { throw new UnsupportedError("Not supported"); }
 
@@ -38862,6 +40321,10 @@
   Events get on => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _addEventListener([String type, EventListener listener, bool useCapture])
+      => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void addEventListener(String type, EventListener listener, [bool useCapture])
       => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
@@ -38869,6 +40332,10 @@
   bool dispatchEvent(Event event) => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _removeEventListener([String type, EventListener listener,
+      bool useCapture]) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void removeEventListener(String type, EventListener listener,
       [bool useCapture]) => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 229ad4e..2267a4f 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -1071,40 +1071,40 @@
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
   Index _createIndex(String name, keyPath, [Map options]) {
-    if ((keyPath is List<String> || keyPath == null) && options == null) {
-      List keyPath_1 = convertDartToNative_StringArray(keyPath);
-      return _createIndex_1(name, keyPath_1);
-    }
-    if (options != null && (keyPath is List<String> || keyPath == null)) {
-      List keyPath_2 = convertDartToNative_StringArray(keyPath);
-      var options_3 = convertDartToNative_Dictionary(options);
-      return _createIndex_2(name, keyPath_2, options_3);
-    }
     if ((keyPath is String || keyPath == null) && options == null) {
-      return _createIndex_3(name, keyPath);
+      return _createIndex_1(name, keyPath);
     }
     if (options != null && (keyPath is String || keyPath == null)) {
+      var options_1 = convertDartToNative_Dictionary(options);
+      return _createIndex_2(name, keyPath, options_1);
+    }
+    if ((keyPath is List<String> || keyPath == null) && options == null) {
+      List keyPath_2 = convertDartToNative_StringArray(keyPath);
+      return _createIndex_3(name, keyPath_2);
+    }
+    if (options != null && (keyPath is List<String> || keyPath == null)) {
+      List keyPath_3 = convertDartToNative_StringArray(keyPath);
       var options_4 = convertDartToNative_Dictionary(options);
-      return _createIndex_4(name, keyPath, options_4);
+      return _createIndex_4(name, keyPath_3, options_4);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('createIndex')
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
-  Index _createIndex_1(name, List keyPath) native;
+  Index _createIndex_1(name, String keyPath) native;
   @JSName('createIndex')
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
-  Index _createIndex_2(name, List keyPath, options) native;
+  Index _createIndex_2(name, String keyPath, options) native;
   @JSName('createIndex')
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
-  Index _createIndex_3(name, String keyPath) native;
+  Index _createIndex_3(name, List keyPath) native;
   @JSName('createIndex')
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
-  Index _createIndex_4(name, String keyPath, options) native;
+  Index _createIndex_4(name, List keyPath, options) native;
 
   @JSName('delete')
   @DomName('IDBObjectStore.delete')
@@ -1133,7 +1133,7 @@
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
-  Request _openCursor(Object key, [String direction]) native;
+  Request _openCursor(Object range, [String direction]) native;
 
   @DomName('IDBObjectStore.openKeyCursor')
   @DocsEditable()
@@ -1443,11 +1443,11 @@
   @DocsEditable()
   @Creates('int|String|Null')
   @Returns('int|String|Null')
-  final Object newVersion;
+  final int newVersion;
 
   @DomName('IDBVersionChangeEvent.oldVersion')
   @DocsEditable()
   @Creates('int|String|Null')
   @Returns('int|String|Null')
-  final Object oldVersion;
+  final int oldVersion;
 }
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index a54b026..527a8ae 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -239,14 +239,14 @@
   void deleteObjectStore(String name) => _blink.BlinkIDBDatabase.deleteObjectStore_Callback_DOMString(this, name);
 
   Transaction transaction(storeName_OR_storeNames, String mode) {
-    if ((mode is String || mode == null) && (storeName_OR_storeNames is DomStringList || storeName_OR_storeNames == null)) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_DOMStringList_DOMString(this, storeName_OR_storeNames, mode);
+    if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
+      return _blink.BlinkIDBDatabase.transaction_Callback_DOMString_DOMString(this, storeName_OR_storeNames, mode);
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
       return _blink.BlinkIDBDatabase.transaction_Callback_SEQ_DOMString_SEQ_DOMString(this, storeName_OR_storeNames, mode);
     }
-    if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_DOMString_DOMString(this, storeName_OR_storeNames, mode);
+    if ((mode is String || mode == null) && (storeName_OR_storeNames is DomStringList || storeName_OR_storeNames == null)) {
+      return _blink.BlinkIDBDatabase.transaction_Callback_DOMStringList_DOMString(this, storeName_OR_storeNames, mode);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -789,12 +789,12 @@
   Request _count(Object key) => _blink.BlinkIDBObjectStore.count_Callback_ScriptValue(this, key);
 
   Index _createIndex(String name, keyPath, [Map options]) {
-    if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
-      return _blink.BlinkIDBObjectStore.createIndex_Callback_DOMString_SEQ_DOMString_SEQ_Dictionary(this, name, keyPath, options);
-    }
     if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
       return _blink.BlinkIDBObjectStore.createIndex_Callback_DOMString_DOMString_Dictionary(this, name, keyPath, options);
     }
+    if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
+      return _blink.BlinkIDBObjectStore.createIndex_Callback_DOMString_SEQ_DOMString_SEQ_Dictionary(this, name, keyPath, options);
+    }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
@@ -816,7 +816,7 @@
 
   @DomName('IDBObjectStore.openCursor')
   @DocsEditable()
-  Request _openCursor(Object key, [String direction]) => _blink.BlinkIDBObjectStore.openCursor_Callback_ScriptValue_DOMString(this, key, direction);
+  Request _openCursor(Object range, [String direction]) => _blink.BlinkIDBObjectStore.openCursor_Callback_ScriptValue_DOMString(this, range, direction);
 
   @DomName('IDBObjectStore.openKeyCursor')
   @DocsEditable()
@@ -1097,10 +1097,10 @@
 
   @DomName('IDBVersionChangeEvent.newVersion')
   @DocsEditable()
-  Object get newVersion => _blink.BlinkIDBVersionChangeEvent.newVersion_Getter(this);
+  int get newVersion => _blink.BlinkIDBVersionChangeEvent.newVersion_Getter(this);
 
   @DomName('IDBVersionChangeEvent.oldVersion')
   @DocsEditable()
-  Object get oldVersion => _blink.BlinkIDBVersionChangeEvent.oldVersion_Getter(this);
+  int get oldVersion => _blink.BlinkIDBVersionChangeEvent.oldVersion_Getter(this);
 
 }
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index 3275884..d16e62e 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -496,6 +496,16 @@
    *
    * The function associated with an instance of a class that has a [:call:]
    * method is that [:call:] method.
+   *
+   * A Dart implementation might choose to create a class for each closure
+   * expression, in which case [:function:] would be the same as
+   * [:type.declarations[#call]:]. But the Dart language model does not require
+   * this. A more typical implementation involves a single closure class for
+   * each type signature, where the call method dispatches to a function held
+   * in the closure rather the call method
+   * directly implementing the closure body. So one cannot rely on closures from
+   * distinct closure expressions having distinct classes ([:type:]), but one
+   * can rely on them having distinct functions ([:function:]).
    */
   MethodMirror get function;
 
@@ -829,6 +839,8 @@
   /**
    * A mirror on the [:call:] method for the reflectee.
    */
+  // This is only here because in the past the VM did not implement a call
+  // method on closures.
   MethodMirror get callMethod;
 }
 
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index c7c799a..81fe94b 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -714,685 +714,6 @@
 
 
 @DocsEditable()
-@DomName('SVGElementInstance')
-@Unstable()
-@Native("SVGElementInstance")
-class ElementInstance extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory ElementInstance._() { throw new UnsupportedError("Not supported"); }
-
-  /**
-   * Static factory designed to expose `abort` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.abortEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
-
-  /**
-   * Static factory designed to expose `beforecopy` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.beforecopyEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
-
-  /**
-   * Static factory designed to expose `beforecut` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.beforecutEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
-
-  /**
-   * Static factory designed to expose `beforepaste` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.beforepasteEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
-
-  /**
-   * Static factory designed to expose `blur` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.blurEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
-
-  /**
-   * Static factory designed to expose `change` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.changeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
-
-  /**
-   * Static factory designed to expose `click` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.clickEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
-
-  /**
-   * Static factory designed to expose `contextmenu` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.contextmenuEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
-
-  /**
-   * Static factory designed to expose `copy` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.copyEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
-
-  /**
-   * Static factory designed to expose `cut` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.cutEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
-
-  /**
-   * Static factory designed to expose `doubleclick` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dblclickEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
-
-  /**
-   * Static factory designed to expose `drag` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
-
-  /**
-   * Static factory designed to expose `dragend` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragendEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
-
-  /**
-   * Static factory designed to expose `dragenter` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragenterEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
-
-  /**
-   * Static factory designed to expose `dragleave` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragleaveEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
-
-  /**
-   * Static factory designed to expose `dragover` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragoverEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
-
-  /**
-   * Static factory designed to expose `dragstart` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
-
-  /**
-   * Static factory designed to expose `drop` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dropEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
-
-  /**
-   * Static factory designed to expose `error` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.errorEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  /**
-   * Static factory designed to expose `focus` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.focusEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
-
-  /**
-   * Static factory designed to expose `input` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.inputEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
-
-  /**
-   * Static factory designed to expose `keydown` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.keydownEvent')
-  @DocsEditable()
-  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
-
-  /**
-   * Static factory designed to expose `keypress` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.keypressEvent')
-  @DocsEditable()
-  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
-
-  /**
-   * Static factory designed to expose `keyup` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.keyupEvent')
-  @DocsEditable()
-  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
-
-  /**
-   * Static factory designed to expose `load` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.loadEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
-
-  /**
-   * Static factory designed to expose `mousedown` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mousedownEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
-
-  /**
-   * Static factory designed to expose `mouseenter` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseenterEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
-
-  /**
-   * Static factory designed to expose `mouseleave` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseleaveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
-
-  /**
-   * Static factory designed to expose `mousemove` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mousemoveEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
-
-  /**
-   * Static factory designed to expose `mouseout` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseoutEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
-
-  /**
-   * Static factory designed to expose `mouseover` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseoverEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
-
-  /**
-   * Static factory designed to expose `mouseup` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseupEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
-
-  /**
-   * Static factory designed to expose `mousewheel` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mousewheelEvent')
-  @DocsEditable()
-  static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
-
-  /**
-   * Static factory designed to expose `paste` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.pasteEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
-
-  /**
-   * Static factory designed to expose `reset` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.resetEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
-
-  /**
-   * Static factory designed to expose `resize` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.resizeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
-
-  /**
-   * Static factory designed to expose `scroll` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.scrollEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
-
-  /**
-   * Static factory designed to expose `search` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.searchEvent')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
-  static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
-
-  /**
-   * Static factory designed to expose `select` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.selectEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
-
-  /**
-   * Static factory designed to expose `selectstart` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.selectstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
-
-  /**
-   * Static factory designed to expose `submit` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.submitEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
-
-  /**
-   * Static factory designed to expose `unload` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.unloadEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
-
-  @DomName('SVGElementInstance.correspondingElement')
-  @DocsEditable()
-  final SvgElement correspondingElement;
-
-  @DomName('SVGElementInstance.correspondingUseElement')
-  @DocsEditable()
-  final UseElement correspondingUseElement;
-
-  @DomName('SVGElementInstance.firstChild')
-  @DocsEditable()
-  final ElementInstance firstChild;
-
-  @DomName('SVGElementInstance.lastChild')
-  @DocsEditable()
-  final ElementInstance lastChild;
-
-  @DomName('SVGElementInstance.nextSibling')
-  @DocsEditable()
-  final ElementInstance nextSibling;
-
-  @DomName('SVGElementInstance.parentNode')
-  @DocsEditable()
-  final ElementInstance parentNode;
-
-  @DomName('SVGElementInstance.previousSibling')
-  @DocsEditable()
-  final ElementInstance previousSibling;
-
-  /// Stream of `abort` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onabort')
-  @DocsEditable()
-  Stream<Event> get onAbort => abortEvent.forTarget(this);
-
-  /// Stream of `beforecopy` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onbeforecopy')
-  @DocsEditable()
-  Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
-
-  /// Stream of `beforecut` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onbeforecut')
-  @DocsEditable()
-  Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
-
-  /// Stream of `beforepaste` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onbeforepaste')
-  @DocsEditable()
-  Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
-
-  /// Stream of `blur` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onblur')
-  @DocsEditable()
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
-
-  /// Stream of `change` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onchange')
-  @DocsEditable()
-  Stream<Event> get onChange => changeEvent.forTarget(this);
-
-  /// Stream of `click` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onclick')
-  @DocsEditable()
-  Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
-
-  /// Stream of `contextmenu` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.oncontextmenu')
-  @DocsEditable()
-  Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
-
-  /// Stream of `copy` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.oncopy')
-  @DocsEditable()
-  Stream<Event> get onCopy => copyEvent.forTarget(this);
-
-  /// Stream of `cut` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.oncut')
-  @DocsEditable()
-  Stream<Event> get onCut => cutEvent.forTarget(this);
-
-  /// Stream of `doubleclick` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondblclick')
-  @DocsEditable()
-  Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
-
-  /// Stream of `drag` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondrag')
-  @DocsEditable()
-  Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
-
-  /// Stream of `dragend` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragend')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
-
-  /// Stream of `dragenter` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragenter')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
-
-  /// Stream of `dragleave` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragleave')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
-
-  /// Stream of `dragover` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragover')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
-
-  /// Stream of `dragstart` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragstart')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
-
-  /// Stream of `drop` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondrop')
-  @DocsEditable()
-  Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
-
-  /// Stream of `error` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onerror')
-  @DocsEditable()
-  Stream<Event> get onError => errorEvent.forTarget(this);
-
-  /// Stream of `focus` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onfocus')
-  @DocsEditable()
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
-
-  /// Stream of `input` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.oninput')
-  @DocsEditable()
-  Stream<Event> get onInput => inputEvent.forTarget(this);
-
-  /// Stream of `keydown` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onkeydown')
-  @DocsEditable()
-  Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
-
-  /// Stream of `keypress` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onkeypress')
-  @DocsEditable()
-  Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
-
-  /// Stream of `keyup` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onkeyup')
-  @DocsEditable()
-  Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
-
-  /// Stream of `load` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onload')
-  @DocsEditable()
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
-
-  /// Stream of `mousedown` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmousedown')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
-
-  /// Stream of `mouseenter` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseenter')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Stream<MouseEvent> get onMouseEnter => mouseEnterEvent.forTarget(this);
-
-  /// Stream of `mouseleave` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseleave')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Stream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forTarget(this);
-
-  /// Stream of `mousemove` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmousemove')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
-
-  /// Stream of `mouseout` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseout')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
-
-  /// Stream of `mouseover` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseover')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
-
-  /// Stream of `mouseup` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseup')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
-
-  /// Stream of `mousewheel` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmousewheel')
-  @DocsEditable()
-  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
-
-  /// Stream of `paste` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onpaste')
-  @DocsEditable()
-  Stream<Event> get onPaste => pasteEvent.forTarget(this);
-
-  /// Stream of `reset` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onreset')
-  @DocsEditable()
-  Stream<Event> get onReset => resetEvent.forTarget(this);
-
-  /// Stream of `resize` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onresize')
-  @DocsEditable()
-  Stream<Event> get onResize => resizeEvent.forTarget(this);
-
-  /// Stream of `scroll` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onscroll')
-  @DocsEditable()
-  Stream<Event> get onScroll => scrollEvent.forTarget(this);
-
-  /// Stream of `search` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onsearch')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
-  Stream<Event> get onSearch => searchEvent.forTarget(this);
-
-  /// Stream of `select` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onselect')
-  @DocsEditable()
-  Stream<Event> get onSelect => selectEvent.forTarget(this);
-
-  /// Stream of `selectstart` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onselectstart')
-  @DocsEditable()
-  Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
-
-  /// Stream of `submit` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onsubmit')
-  @DocsEditable()
-  Stream<Event> get onSubmit => submitEvent.forTarget(this);
-
-  /// Stream of `unload` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onunload')
-  @DocsEditable()
-  Stream<Event> get onUnload => unloadEvent.forTarget(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
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable()
 @DomName('SVGEllipseElement')
 @Unstable()
 @Native("SVGEllipseElement")
@@ -3354,6 +2675,11 @@
   // To suppress missing implicit constructor warnings.
   factory LengthList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGLengthList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => JS("int", "#.length", this);
+
   @DomName('SVGLengthList.numberOfItems')
   @DocsEditable()
   final int numberOfItems;
@@ -3370,8 +2696,6 @@
   // -- start List<Length> mixins.
   // Length is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -3404,6 +2728,11 @@
   Length elementAt(int index) => this[index];
   // -- end List<Length> mixins.
 
+  @DomName('SVGLengthList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, Length value) native;
+
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
   Length appendItem(Length item) native;
@@ -3798,6 +3127,11 @@
   // To suppress missing implicit constructor warnings.
   factory NumberList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGNumberList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => JS("int", "#.length", this);
+
   @DomName('SVGNumberList.numberOfItems')
   @DocsEditable()
   final int numberOfItems;
@@ -3814,8 +3148,6 @@
   // -- start List<Number> mixins.
   // Number is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -3848,6 +3180,11 @@
   Number elementAt(int index) => this[index];
   // -- end List<Number> mixins.
 
+  @DomName('SVGNumberList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, Number value) native;
+
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
   Number appendItem(Number item) native;
@@ -4577,6 +3914,11 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGPathSegList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => JS("int", "#.length", this);
+
   @DomName('SVGPathSegList.numberOfItems')
   @DocsEditable()
   final int numberOfItems;
@@ -4593,8 +3935,6 @@
   // -- start List<PathSeg> mixins.
   // PathSeg is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -4627,6 +3967,11 @@
   PathSeg elementAt(int index) => this[index];
   // -- end List<PathSeg> mixins.
 
+  @DomName('SVGPathSegList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, PathSeg value) native;
+
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
   PathSeg appendItem(PathSeg newItem) native;
@@ -4820,10 +4165,20 @@
   // To suppress missing implicit constructor warnings.
   factory PointList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGPointList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+
   @DomName('SVGPointList.numberOfItems')
   @DocsEditable()
   final int numberOfItems;
 
+  @DomName('SVGPointList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, Point value) native;
+
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
   Point appendItem(Point item) native;
@@ -5254,6 +4609,11 @@
   // To suppress missing implicit constructor warnings.
   factory StringList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGStringList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => JS("int", "#.length", this);
+
   @DomName('SVGStringList.numberOfItems')
   @DocsEditable()
   final int numberOfItems;
@@ -5270,8 +4630,6 @@
   // -- start List<String> mixins.
   // String is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -5304,6 +4662,11 @@
   String elementAt(int index) => this[index];
   // -- end List<String> mixins.
 
+  @DomName('SVGStringList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, String value) native;
+
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
   String appendItem(String item) native;
@@ -5807,6 +5170,13 @@
   // Use implementation from Element.
   // final CssStyleDeclaration style;
 
+  // Shadowing definition.
+  int get tabIndex => JS("int", "#.tabIndex", this);
+
+  void set tabIndex(int value) {
+    JS("void", "#.tabIndex = #", this, value);
+  }
+
   @DomName('SVGElement.viewportElement')
   @DocsEditable()
   final SvgElement viewportElement;
@@ -6694,6 +6064,11 @@
   // To suppress missing implicit constructor warnings.
   factory TransformList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGTransformList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => JS("int", "#.length", this);
+
   @DomName('SVGTransformList.numberOfItems')
   @DocsEditable()
   final int numberOfItems;
@@ -6710,8 +6085,6 @@
   // -- start List<Transform> mixins.
   // Transform is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -6744,6 +6117,11 @@
   Transform elementAt(int index) => this[index];
   // -- end List<Transform> mixins.
 
+  @DomName('SVGTransformList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, Transform value) native;
+
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
   Transform appendItem(Transform item) native;
@@ -6829,7 +6207,7 @@
 @DomName('SVGUseElement')
 @Unstable()
 @Native("SVGUseElement")
-class UseElement extends GraphicsElement implements UriReference, Tests {
+class UseElement extends GraphicsElement implements UriReference {
   // To suppress missing implicit constructor warnings.
   factory UseElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6843,18 +6221,10 @@
    */
   UseElement.created() : super.created();
 
-  @DomName('SVGUseElement.animatedInstanceRoot')
-  @DocsEditable()
-  final ElementInstance animatedInstanceRoot;
-
   @DomName('SVGUseElement.height')
   @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGUseElement.instanceRoot')
-  @DocsEditable()
-  final ElementInstance instanceRoot;
-
   @DomName('SVGUseElement.width')
   @DocsEditable()
   final AnimatedLength width;
@@ -6867,24 +6237,6 @@
   @DocsEditable()
   final AnimatedLength y;
 
-  // From SVGTests
-
-  @DomName('SVGUseElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGUseElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGUseElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGUseElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
   // From SVGURIReference
 
   @DomName('SVGUseElement.href')
@@ -7055,71 +6407,6 @@
 
 
 @DocsEditable()
-@DomName('SVGElementInstanceList')
-@Unstable()
-@Native("SVGElementInstanceList")
-class _ElementInstanceList extends Interceptor with ListMixin<ElementInstance>, ImmutableListMixin<ElementInstance> implements List<ElementInstance> {
-  // To suppress missing implicit constructor warnings.
-  factory _ElementInstanceList._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGElementInstanceList.length')
-  @DocsEditable()
-  int get length => JS("int", "#.length", this);
-
-  ElementInstance operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
-      throw new RangeError.range(index, 0, length);
-    return this.item(index);
-  }
-  void operator[]=(int index, ElementInstance value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<ElementInstance> mixins.
-  // ElementInstance is the element type.
-
-
-  void set length(int value) {
-    throw new UnsupportedError("Cannot resize immutable List.");
-  }
-
-  ElementInstance get first {
-    if (this.length > 0) {
-      return JS('ElementInstance', '#[0]', this);
-    }
-    throw new StateError("No elements");
-  }
-
-  ElementInstance get last {
-    int len = this.length;
-    if (len > 0) {
-      return JS('ElementInstance', '#[#]', this, len - 1);
-    }
-    throw new StateError("No elements");
-  }
-
-  ElementInstance get single {
-    int len = this.length;
-    if (len == 1) {
-      return JS('ElementInstance', '#[0]', this);
-    }
-    if (len == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
-  }
-
-  ElementInstance elementAt(int index) => this[index];
-  // -- end List<ElementInstance> mixins.
-
-  @DomName('SVGElementInstanceList.item')
-  @DocsEditable()
-  ElementInstance item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable()
 @DomName('SVGGradientElement')
 @Unstable()
 @Native("SVGGradientElement")
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index eb7f251..a27ee0d 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -45,8 +45,6 @@
   'SVGDescElement': () => DescElement,
   'SVGDiscardElement': () => DiscardElement,
   'SVGElement': () => SvgElement,
-  'SVGElementInstance': () => ElementInstance,
-  'SVGElementInstanceList': () => _ElementInstanceList,
   'SVGEllipseElement': () => EllipseElement,
   'SVGFEBlendElement': () => FEBlendElement,
   'SVGFEColorMatrixElement': () => FEColorMatrixElement,
@@ -936,687 +934,6 @@
 
 
 @DocsEditable()
-@DomName('SVGElementInstance')
-@Unstable()
-class ElementInstance extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory ElementInstance._() { throw new UnsupportedError("Not supported"); }
-
-  /**
-   * Static factory designed to expose `abort` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.abortEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
-
-  /**
-   * Static factory designed to expose `beforecopy` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.beforecopyEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
-
-  /**
-   * Static factory designed to expose `beforecut` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.beforecutEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
-
-  /**
-   * Static factory designed to expose `beforepaste` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.beforepasteEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
-
-  /**
-   * Static factory designed to expose `blur` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.blurEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
-
-  /**
-   * Static factory designed to expose `change` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.changeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
-
-  /**
-   * Static factory designed to expose `click` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.clickEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
-
-  /**
-   * Static factory designed to expose `contextmenu` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.contextmenuEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
-
-  /**
-   * Static factory designed to expose `copy` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.copyEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
-
-  /**
-   * Static factory designed to expose `cut` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.cutEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
-
-  /**
-   * Static factory designed to expose `doubleclick` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dblclickEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
-
-  /**
-   * Static factory designed to expose `drag` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
-
-  /**
-   * Static factory designed to expose `dragend` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragendEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
-
-  /**
-   * Static factory designed to expose `dragenter` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragenterEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
-
-  /**
-   * Static factory designed to expose `dragleave` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragleaveEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
-
-  /**
-   * Static factory designed to expose `dragover` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragoverEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
-
-  /**
-   * Static factory designed to expose `dragstart` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dragstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
-
-  /**
-   * Static factory designed to expose `drop` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.dropEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
-
-  /**
-   * Static factory designed to expose `error` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.errorEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
-
-  /**
-   * Static factory designed to expose `focus` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.focusEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
-
-  /**
-   * Static factory designed to expose `input` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.inputEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
-
-  /**
-   * Static factory designed to expose `keydown` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.keydownEvent')
-  @DocsEditable()
-  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
-
-  /**
-   * Static factory designed to expose `keypress` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.keypressEvent')
-  @DocsEditable()
-  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
-
-  /**
-   * Static factory designed to expose `keyup` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.keyupEvent')
-  @DocsEditable()
-  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
-
-  /**
-   * Static factory designed to expose `load` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.loadEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
-
-  /**
-   * Static factory designed to expose `mousedown` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mousedownEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
-
-  /**
-   * Static factory designed to expose `mouseenter` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseenterEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
-
-  /**
-   * Static factory designed to expose `mouseleave` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseleaveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
-
-  /**
-   * Static factory designed to expose `mousemove` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mousemoveEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
-
-  /**
-   * Static factory designed to expose `mouseout` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseoutEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
-
-  /**
-   * Static factory designed to expose `mouseover` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseoverEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
-
-  /**
-   * Static factory designed to expose `mouseup` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mouseupEvent')
-  @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
-
-  /**
-   * Static factory designed to expose `mousewheel` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.mousewheelEvent')
-  @DocsEditable()
-  static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
-
-  /**
-   * Static factory designed to expose `paste` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.pasteEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
-
-  /**
-   * Static factory designed to expose `reset` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.resetEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
-
-  /**
-   * Static factory designed to expose `resize` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.resizeEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
-
-  /**
-   * Static factory designed to expose `scroll` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.scrollEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
-
-  /**
-   * Static factory designed to expose `search` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.searchEvent')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
-  static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
-
-  /**
-   * Static factory designed to expose `select` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.selectEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
-
-  /**
-   * Static factory designed to expose `selectstart` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.selectstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
-
-  /**
-   * Static factory designed to expose `submit` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.submitEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
-
-  /**
-   * Static factory designed to expose `unload` events to event
-   * handlers that are not necessarily instances of [ElementInstance].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('SVGElementInstance.unloadEvent')
-  @DocsEditable()
-  static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
-
-  @DomName('SVGElementInstance.correspondingElement')
-  @DocsEditable()
-  SvgElement get correspondingElement => _blink.BlinkSVGElementInstance.correspondingElement_Getter(this);
-
-  @DomName('SVGElementInstance.correspondingUseElement')
-  @DocsEditable()
-  UseElement get correspondingUseElement => _blink.BlinkSVGElementInstance.correspondingUseElement_Getter(this);
-
-  @DomName('SVGElementInstance.firstChild')
-  @DocsEditable()
-  ElementInstance get firstChild => _blink.BlinkSVGElementInstance.firstChild_Getter(this);
-
-  @DomName('SVGElementInstance.lastChild')
-  @DocsEditable()
-  ElementInstance get lastChild => _blink.BlinkSVGElementInstance.lastChild_Getter(this);
-
-  @DomName('SVGElementInstance.nextSibling')
-  @DocsEditable()
-  ElementInstance get nextSibling => _blink.BlinkSVGElementInstance.nextSibling_Getter(this);
-
-  @DomName('SVGElementInstance.parentNode')
-  @DocsEditable()
-  ElementInstance get parentNode => _blink.BlinkSVGElementInstance.parentNode_Getter(this);
-
-  @DomName('SVGElementInstance.previousSibling')
-  @DocsEditable()
-  ElementInstance get previousSibling => _blink.BlinkSVGElementInstance.previousSibling_Getter(this);
-
-  /// Stream of `abort` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onabort')
-  @DocsEditable()
-  Stream<Event> get onAbort => abortEvent.forTarget(this);
-
-  /// Stream of `beforecopy` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onbeforecopy')
-  @DocsEditable()
-  Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
-
-  /// Stream of `beforecut` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onbeforecut')
-  @DocsEditable()
-  Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
-
-  /// Stream of `beforepaste` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onbeforepaste')
-  @DocsEditable()
-  Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
-
-  /// Stream of `blur` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onblur')
-  @DocsEditable()
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
-
-  /// Stream of `change` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onchange')
-  @DocsEditable()
-  Stream<Event> get onChange => changeEvent.forTarget(this);
-
-  /// Stream of `click` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onclick')
-  @DocsEditable()
-  Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
-
-  /// Stream of `contextmenu` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.oncontextmenu')
-  @DocsEditable()
-  Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
-
-  /// Stream of `copy` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.oncopy')
-  @DocsEditable()
-  Stream<Event> get onCopy => copyEvent.forTarget(this);
-
-  /// Stream of `cut` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.oncut')
-  @DocsEditable()
-  Stream<Event> get onCut => cutEvent.forTarget(this);
-
-  /// Stream of `doubleclick` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondblclick')
-  @DocsEditable()
-  Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
-
-  /// Stream of `drag` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondrag')
-  @DocsEditable()
-  Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
-
-  /// Stream of `dragend` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragend')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
-
-  /// Stream of `dragenter` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragenter')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
-
-  /// Stream of `dragleave` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragleave')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
-
-  /// Stream of `dragover` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragover')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
-
-  /// Stream of `dragstart` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondragstart')
-  @DocsEditable()
-  Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
-
-  /// Stream of `drop` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.ondrop')
-  @DocsEditable()
-  Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
-
-  /// Stream of `error` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onerror')
-  @DocsEditable()
-  Stream<Event> get onError => errorEvent.forTarget(this);
-
-  /// Stream of `focus` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onfocus')
-  @DocsEditable()
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
-
-  /// Stream of `input` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.oninput')
-  @DocsEditable()
-  Stream<Event> get onInput => inputEvent.forTarget(this);
-
-  /// Stream of `keydown` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onkeydown')
-  @DocsEditable()
-  Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
-
-  /// Stream of `keypress` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onkeypress')
-  @DocsEditable()
-  Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
-
-  /// Stream of `keyup` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onkeyup')
-  @DocsEditable()
-  Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
-
-  /// Stream of `load` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onload')
-  @DocsEditable()
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
-
-  /// Stream of `mousedown` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmousedown')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
-
-  /// Stream of `mouseenter` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseenter')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Stream<MouseEvent> get onMouseEnter => mouseEnterEvent.forTarget(this);
-
-  /// Stream of `mouseleave` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseleave')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Stream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forTarget(this);
-
-  /// Stream of `mousemove` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmousemove')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
-
-  /// Stream of `mouseout` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseout')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
-
-  /// Stream of `mouseover` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseover')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
-
-  /// Stream of `mouseup` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmouseup')
-  @DocsEditable()
-  Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
-
-  /// Stream of `mousewheel` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onmousewheel')
-  @DocsEditable()
-  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
-
-  /// Stream of `paste` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onpaste')
-  @DocsEditable()
-  Stream<Event> get onPaste => pasteEvent.forTarget(this);
-
-  /// Stream of `reset` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onreset')
-  @DocsEditable()
-  Stream<Event> get onReset => resetEvent.forTarget(this);
-
-  /// Stream of `resize` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onresize')
-  @DocsEditable()
-  Stream<Event> get onResize => resizeEvent.forTarget(this);
-
-  /// Stream of `scroll` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onscroll')
-  @DocsEditable()
-  Stream<Event> get onScroll => scrollEvent.forTarget(this);
-
-  /// Stream of `search` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onsearch')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
-  Stream<Event> get onSearch => searchEvent.forTarget(this);
-
-  /// Stream of `select` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onselect')
-  @DocsEditable()
-  Stream<Event> get onSelect => selectEvent.forTarget(this);
-
-  /// Stream of `selectstart` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onselectstart')
-  @DocsEditable()
-  Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
-
-  /// Stream of `submit` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onsubmit')
-  @DocsEditable()
-  Stream<Event> get onSubmit => submitEvent.forTarget(this);
-
-  /// Stream of `unload` events handled by this [ElementInstance].
-  @DomName('SVGElementInstance.onunload')
-  @DocsEditable()
-  Stream<Event> get onUnload => unloadEvent.forTarget(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
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('SVGEllipseElement')
 @Unstable()
 class EllipseElement extends GeometryElement {
@@ -3631,6 +2948,11 @@
   // To suppress missing implicit constructor warnings.
   factory LengthList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGLengthList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkSVGLengthList.length_Getter(this);
+
   @DomName('SVGLengthList.numberOfItems')
   @DocsEditable()
   int get numberOfItems => _blink.BlinkSVGLengthList.numberOfItems_Getter(this);
@@ -3647,8 +2969,6 @@
   // -- start List<Length> mixins.
   // Length is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -3681,6 +3001,11 @@
   Length elementAt(int index) => this[index];
   // -- end List<Length> mixins.
 
+  @DomName('SVGLengthList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, Length value) => _blink.BlinkSVGLengthList.$__setter___Callback_ul_SVGLength(this, index, value);
+
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
   Length appendItem(Length item) => _blink.BlinkSVGLengthList.appendItem_Callback_SVGLength(this, item);
@@ -4115,6 +3440,11 @@
   // To suppress missing implicit constructor warnings.
   factory NumberList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGNumberList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkSVGNumberList.length_Getter(this);
+
   @DomName('SVGNumberList.numberOfItems')
   @DocsEditable()
   int get numberOfItems => _blink.BlinkSVGNumberList.numberOfItems_Getter(this);
@@ -4131,8 +3461,6 @@
   // -- start List<Number> mixins.
   // Number is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -4165,6 +3493,11 @@
   Number elementAt(int index) => this[index];
   // -- end List<Number> mixins.
 
+  @DomName('SVGNumberList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, Number value) => _blink.BlinkSVGNumberList.$__setter___Callback_ul_SVGNumber(this, index, value);
+
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
   Number appendItem(Number item) => _blink.BlinkSVGNumberList.appendItem_Callback_SVGNumber(this, item);
@@ -5131,6 +4464,11 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGPathSegList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkSVGPathSegList.length_Getter(this);
+
   @DomName('SVGPathSegList.numberOfItems')
   @DocsEditable()
   int get numberOfItems => _blink.BlinkSVGPathSegList.numberOfItems_Getter(this);
@@ -5147,8 +4485,6 @@
   // -- start List<PathSeg> mixins.
   // PathSeg is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -5181,6 +4517,11 @@
   PathSeg elementAt(int index) => this[index];
   // -- end List<PathSeg> mixins.
 
+  @DomName('SVGPathSegList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, PathSeg value) => _blink.BlinkSVGPathSegList.$__setter___Callback_ul_SVGPathSeg(this, index, value);
+
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
   PathSeg appendItem(PathSeg newItem) => _blink.BlinkSVGPathSegList.appendItem_Callback_SVGPathSeg(this, newItem);
@@ -5402,10 +4743,20 @@
   // To suppress missing implicit constructor warnings.
   factory PointList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGPointList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkSVGPointList.length_Getter(this);
+
   @DomName('SVGPointList.numberOfItems')
   @DocsEditable()
   int get numberOfItems => _blink.BlinkSVGPointList.numberOfItems_Getter(this);
 
+  @DomName('SVGPointList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, Point value) => _blink.BlinkSVGPointList.$__setter___Callback_ul_SVGPoint(this, index, value);
+
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
   Point appendItem(Point item) => _blink.BlinkSVGPointList.appendItem_Callback_SVGPoint(this, item);
@@ -5883,6 +5234,11 @@
   // To suppress missing implicit constructor warnings.
   factory StringList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGStringList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkSVGStringList.length_Getter(this);
+
   @DomName('SVGStringList.numberOfItems')
   @DocsEditable()
   int get numberOfItems => _blink.BlinkSVGStringList.numberOfItems_Getter(this);
@@ -5899,8 +5255,6 @@
   // -- start List<String> mixins.
   // String is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -5933,6 +5287,11 @@
   String elementAt(int index) => this[index];
   // -- end List<String> mixins.
 
+  @DomName('SVGStringList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, String value) => _blink.BlinkSVGStringList.$__setter___Callback_ul_DOMString(this, index, value);
+
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
   String appendItem(String item) => _blink.BlinkSVGStringList.appendItem_Callback_DOMString(this, item);
@@ -6454,6 +5813,16 @@
   @Experimental() // untriaged
   CssStyleDeclaration get style => _blink.BlinkSVGElement.style_Getter(this);
 
+  @DomName('SVGElement.tabIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get tabIndex => _blink.BlinkSVGElement.tabIndex_Getter(this);
+
+  @DomName('SVGElement.tabIndex')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set tabIndex(int value) => _blink.BlinkSVGElement.tabIndex_Setter_long(this, value);
+
   @DomName('SVGElement.viewportElement')
   @DocsEditable()
   SvgElement get viewportElement => _blink.BlinkSVGElement.viewportElement_Getter(this);
@@ -7372,6 +6741,11 @@
   // To suppress missing implicit constructor warnings.
   factory TransformList._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('SVGTransformList.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length => _blink.BlinkSVGTransformList.length_Getter(this);
+
   @DomName('SVGTransformList.numberOfItems')
   @DocsEditable()
   int get numberOfItems => _blink.BlinkSVGTransformList.numberOfItems_Getter(this);
@@ -7388,8 +6762,6 @@
   // -- start List<Transform> mixins.
   // Transform is the element type.
 
-  // SVG Collections expose numberOfItems rather than length.
-  int get length => numberOfItems;
 
   void set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
@@ -7422,6 +6794,11 @@
   Transform elementAt(int index) => this[index];
   // -- end List<Transform> mixins.
 
+  @DomName('SVGTransformList.__setter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void __setter__(int index, Transform value) => _blink.BlinkSVGTransformList.$__setter___Callback_ul_SVGTransform(this, index, value);
+
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
   Transform appendItem(Transform item) => _blink.BlinkSVGTransformList.appendItem_Callback_SVGTransform(this, item);
@@ -7515,7 +6892,7 @@
 @DocsEditable()
 @DomName('SVGUseElement')
 @Unstable()
-class UseElement extends GraphicsElement implements UriReference, Tests {
+class UseElement extends GraphicsElement implements UriReference {
   // To suppress missing implicit constructor warnings.
   factory UseElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -7529,18 +6906,10 @@
    */
   UseElement.created() : super.created();
 
-  @DomName('SVGUseElement.animatedInstanceRoot')
-  @DocsEditable()
-  ElementInstance get animatedInstanceRoot => _blink.BlinkSVGUseElement.animatedInstanceRoot_Getter(this);
-
   @DomName('SVGUseElement.height')
   @DocsEditable()
   AnimatedLength get height => _blink.BlinkSVGUseElement.height_Getter(this);
 
-  @DomName('SVGUseElement.instanceRoot')
-  @DocsEditable()
-  ElementInstance get instanceRoot => _blink.BlinkSVGUseElement.instanceRoot_Getter(this);
-
   @DomName('SVGUseElement.width')
   @DocsEditable()
   AnimatedLength get width => _blink.BlinkSVGUseElement.width_Getter(this);
@@ -7553,22 +6922,6 @@
   @DocsEditable()
   AnimatedLength get y => _blink.BlinkSVGUseElement.y_Getter(this);
 
-  @DomName('SVGUseElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions => _blink.BlinkSVGUseElement.requiredExtensions_Getter(this);
-
-  @DomName('SVGUseElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures => _blink.BlinkSVGUseElement.requiredFeatures_Getter(this);
-
-  @DomName('SVGUseElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage => _blink.BlinkSVGUseElement.systemLanguage_Getter(this);
-
-  @DomName('SVGUseElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) => _blink.BlinkSVGUseElement.hasExtension_Callback_DOMString(this, extension);
-
   @DomName('SVGUseElement.href')
   @DocsEditable()
   AnimatedString get href => _blink.BlinkSVGUseElement.href_Getter(this);
@@ -7756,75 +7109,6 @@
 
 
 @DocsEditable()
-@DomName('SVGElementInstanceList')
-@Unstable()
-class _ElementInstanceList extends NativeFieldWrapperClass2 with ListMixin<ElementInstance>, ImmutableListMixin<ElementInstance> implements List<ElementInstance> {
-  // To suppress missing implicit constructor warnings.
-  factory _ElementInstanceList._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('SVGElementInstanceList.length')
-  @DocsEditable()
-  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.BlinkSVGElementInstanceList.item_Callback_ul(this, index);
-  }
-
-  ElementInstance _nativeIndexedGetter(int index) => _blink.BlinkSVGElementInstanceList.item_Callback_ul(this, index);
-
-  void operator[]=(int index, ElementInstance value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<ElementInstance> mixins.
-  // ElementInstance is the element type.
-
-
-  void set length(int value) {
-    throw new UnsupportedError("Cannot resize immutable List.");
-  }
-
-  ElementInstance get first {
-    if (this.length > 0) {
-      return _nativeIndexedGetter(0);
-    }
-    throw new StateError("No elements");
-  }
-
-  ElementInstance get last {
-    int len = this.length;
-    if (len > 0) {
-      return _nativeIndexedGetter(len - 1);
-    }
-    throw new StateError("No elements");
-  }
-
-  ElementInstance get single {
-    int len = this.length;
-    if (len == 1) {
-      return _nativeIndexedGetter(0);
-    }
-    if (len == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
-  }
-
-  ElementInstance elementAt(int index) => this[index];
-  // -- end List<ElementInstance> mixins.
-
-  @DomName('SVGElementInstanceList.item')
-  @DocsEditable()
-  ElementInstance item(int index) => _blink.BlinkSVGElementInstanceList.item_Callback_ul(this, index);
-
-}
-// 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('SVGGradientElement')
 @Unstable()
 class _GradientElement extends SvgElement implements UriReference {
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 3638497..60478e7 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -65,6 +65,11 @@
   @DomName('AnalyserNode.getFloatFrequencyData')
   @DocsEditable()
   void getFloatFrequencyData(Float32List array) native;
+
+  @DomName('AnalyserNode.getFloatTimeDomainData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void getFloatTimeDomainData(Float32List array) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -167,22 +172,6 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
-  @DomName('AudioBufferSourceNode.FINISHED_STATE')
-  @DocsEditable()
-  static const int FINISHED_STATE = 3;
-
-  @DomName('AudioBufferSourceNode.PLAYING_STATE')
-  @DocsEditable()
-  static const int PLAYING_STATE = 2;
-
-  @DomName('AudioBufferSourceNode.SCHEDULED_STATE')
-  @DocsEditable()
-  static const int SCHEDULED_STATE = 1;
-
-  @DomName('AudioBufferSourceNode.UNSCHEDULED_STATE')
-  @DocsEditable()
-  static const int UNSCHEDULED_STATE = 0;
-
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
   AudioBuffer buffer;
@@ -203,18 +192,6 @@
   @DocsEditable()
   final AudioParam playbackRate;
 
-  @DomName('AudioBufferSourceNode.noteGrainOn')
-  @DocsEditable()
-  void noteGrainOn(num when, num grainOffset, num grainDuration) native;
-
-  @DomName('AudioBufferSourceNode.noteOff')
-  @DocsEditable()
-  void noteOff(num when) native;
-
-  @DomName('AudioBufferSourceNode.noteOn')
-  @DocsEditable()
-  void noteOn(num when) native;
-
   /// Stream of `ended` events handled by this [AudioBufferSourceNode].
   @DomName('AudioBufferSourceNode.onended')
   @DocsEditable()
@@ -575,6 +552,11 @@
   @DomName('AudioProcessingEvent.outputBuffer')
   @DocsEditable()
   final AudioBuffer outputBuffer;
+
+  @DomName('AudioProcessingEvent.playbackTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double playbackTime;
 }
 // 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
@@ -604,38 +586,6 @@
   // To suppress missing implicit constructor warnings.
   factory BiquadFilterNode._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('BiquadFilterNode.ALLPASS')
-  @DocsEditable()
-  static const int ALLPASS = 7;
-
-  @DomName('BiquadFilterNode.BANDPASS')
-  @DocsEditable()
-  static const int BANDPASS = 2;
-
-  @DomName('BiquadFilterNode.HIGHPASS')
-  @DocsEditable()
-  static const int HIGHPASS = 1;
-
-  @DomName('BiquadFilterNode.HIGHSHELF')
-  @DocsEditable()
-  static const int HIGHSHELF = 4;
-
-  @DomName('BiquadFilterNode.LOWPASS')
-  @DocsEditable()
-  static const int LOWPASS = 0;
-
-  @DomName('BiquadFilterNode.LOWSHELF')
-  @DocsEditable()
-  static const int LOWSHELF = 3;
-
-  @DomName('BiquadFilterNode.NOTCH')
-  @DocsEditable()
-  static const int NOTCH = 6;
-
-  @DomName('BiquadFilterNode.PEAKING')
-  @DocsEditable()
-  static const int PEAKING = 5;
-
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
   final AudioParam Q;
@@ -903,22 +853,6 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
-  @DomName('OscillatorNode.FINISHED_STATE')
-  @DocsEditable()
-  static const int FINISHED_STATE = 3;
-
-  @DomName('OscillatorNode.PLAYING_STATE')
-  @DocsEditable()
-  static const int PLAYING_STATE = 2;
-
-  @DomName('OscillatorNode.SCHEDULED_STATE')
-  @DocsEditable()
-  static const int SCHEDULED_STATE = 1;
-
-  @DomName('OscillatorNode.UNSCHEDULED_STATE')
-  @DocsEditable()
-  static const int UNSCHEDULED_STATE = 0;
-
   @DomName('OscillatorNode.detune')
   @DocsEditable()
   final AudioParam detune;
@@ -1043,33 +977,14 @@
   // To suppress missing implicit constructor warnings.
   factory ScriptProcessorNode._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `audioprocess` events to event
-   * handlers that are not necessarily instances of [ScriptProcessorNode].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('ScriptProcessorNode.audioprocessEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<AudioProcessingEvent> audioProcessEvent = const EventStreamProvider<AudioProcessingEvent>('audioprocess');
-
   @DomName('ScriptProcessorNode.bufferSize')
   @DocsEditable()
   final int bufferSize;
 
-  /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
-/**
-   * Get a Stream that fires events when AudioProcessingEvents occur.
-   * This particular stream is special in that it only allows one listener to a
-   * given stream. Converting the returned Stream [asBroadcast] will likely ruin
-   * the soft-real-time properties which which these events are fired and can
-   * be processed.
-   */
-  @DomName('ScriptProcessorNode.onaudioprocess')
+  @DomName('ScriptProcessorNode.setEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<AudioProcessingEvent> get onAudioProcess => audioProcessEvent.forTarget(this);
+  void setEventListener(EventListener eventListener) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 9b18b2d..0089f5a 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -78,7 +78,7 @@
 
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  void set maxDecibels(num value) => _blink.BlinkAnalyserNode.maxDecibels_Setter_float(this, value);
+  void set maxDecibels(num value) => _blink.BlinkAnalyserNode.maxDecibels_Setter_double(this, value);
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
@@ -86,7 +86,7 @@
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  void set minDecibels(num value) => _blink.BlinkAnalyserNode.minDecibels_Setter_float(this, value);
+  void set minDecibels(num value) => _blink.BlinkAnalyserNode.minDecibels_Setter_double(this, value);
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
@@ -94,7 +94,7 @@
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  void set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.smoothingTimeConstant_Setter_float(this, value);
+  void set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.smoothingTimeConstant_Setter_double(this, value);
 
   @DomName('AnalyserNode.getByteFrequencyData')
   @DocsEditable()
@@ -108,6 +108,11 @@
   @DocsEditable()
   void getFloatFrequencyData(Float32List array) => _blink.BlinkAnalyserNode.getFloatFrequencyData_Callback_Float32Array(this, array);
 
+  @DomName('AnalyserNode.getFloatTimeDomainData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void getFloatTimeDomainData(Float32List array) => _blink.BlinkAnalyserNode.getFloatTimeDomainData_Callback_Float32Array(this, array);
+
 }
 // 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
@@ -184,22 +189,6 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
-  @DomName('AudioBufferSourceNode.FINISHED_STATE')
-  @DocsEditable()
-  static const int FINISHED_STATE = 3;
-
-  @DomName('AudioBufferSourceNode.PLAYING_STATE')
-  @DocsEditable()
-  static const int PLAYING_STATE = 2;
-
-  @DomName('AudioBufferSourceNode.SCHEDULED_STATE')
-  @DocsEditable()
-  static const int SCHEDULED_STATE = 1;
-
-  @DomName('AudioBufferSourceNode.UNSCHEDULED_STATE')
-  @DocsEditable()
-  static const int UNSCHEDULED_STATE = 0;
-
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
   AudioBuffer get buffer => _blink.BlinkAudioBufferSourceNode.buffer_Getter(this);
@@ -236,18 +225,6 @@
   @DocsEditable()
   AudioParam get playbackRate => _blink.BlinkAudioBufferSourceNode.playbackRate_Getter(this);
 
-  @DomName('AudioBufferSourceNode.noteGrainOn')
-  @DocsEditable()
-  void noteGrainOn(num when, num grainOffset, num grainDuration) => _blink.BlinkAudioBufferSourceNode.noteGrainOn_Callback_double_double_double(this, when, grainOffset, grainDuration);
-
-  @DomName('AudioBufferSourceNode.noteOff')
-  @DocsEditable()
-  void noteOff(num when) => _blink.BlinkAudioBufferSourceNode.noteOff_Callback_double(this, when);
-
-  @DomName('AudioBufferSourceNode.noteOn')
-  @DocsEditable()
-  void noteOn(num when) => _blink.BlinkAudioBufferSourceNode.noteOn_Callback_double(this, when);
-
   void start([num when, num grainOffset, num grainDuration]) {
     if (grainDuration != null) {
       _blink.BlinkAudioBufferSourceNode.start_Callback_double_double_double(this, when, grainOffset, grainDuration);
@@ -676,6 +653,11 @@
   @DocsEditable()
   AudioBuffer get outputBuffer => _blink.BlinkAudioProcessingEvent.outputBuffer_Getter(this);
 
+  @DomName('AudioProcessingEvent.playbackTime')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get playbackTime => _blink.BlinkAudioProcessingEvent.playbackTime_Getter(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
@@ -708,38 +690,6 @@
   // To suppress missing implicit constructor warnings.
   factory BiquadFilterNode._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('BiquadFilterNode.ALLPASS')
-  @DocsEditable()
-  static const int ALLPASS = 7;
-
-  @DomName('BiquadFilterNode.BANDPASS')
-  @DocsEditable()
-  static const int BANDPASS = 2;
-
-  @DomName('BiquadFilterNode.HIGHPASS')
-  @DocsEditable()
-  static const int HIGHPASS = 1;
-
-  @DomName('BiquadFilterNode.HIGHSHELF')
-  @DocsEditable()
-  static const int HIGHSHELF = 4;
-
-  @DomName('BiquadFilterNode.LOWPASS')
-  @DocsEditable()
-  static const int LOWPASS = 0;
-
-  @DomName('BiquadFilterNode.LOWSHELF')
-  @DocsEditable()
-  static const int LOWSHELF = 3;
-
-  @DomName('BiquadFilterNode.NOTCH')
-  @DocsEditable()
-  static const int NOTCH = 6;
-
-  @DomName('BiquadFilterNode.PEAKING')
-  @DocsEditable()
-  static const int PEAKING = 5;
-
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
   AudioParam get Q => _blink.BlinkBiquadFilterNode.Q_Getter(this);
@@ -1042,22 +992,6 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
-  @DomName('OscillatorNode.FINISHED_STATE')
-  @DocsEditable()
-  static const int FINISHED_STATE = 3;
-
-  @DomName('OscillatorNode.PLAYING_STATE')
-  @DocsEditable()
-  static const int PLAYING_STATE = 2;
-
-  @DomName('OscillatorNode.SCHEDULED_STATE')
-  @DocsEditable()
-  static const int SCHEDULED_STATE = 1;
-
-  @DomName('OscillatorNode.UNSCHEDULED_STATE')
-  @DocsEditable()
-  static const int UNSCHEDULED_STATE = 0;
-
   @DomName('OscillatorNode.detune')
   @DocsEditable()
   AudioParam get detune => _blink.BlinkOscillatorNode.detune_Getter(this);
@@ -1234,38 +1168,14 @@
   // To suppress missing implicit constructor warnings.
   factory ScriptProcessorNode._() { throw new UnsupportedError("Not supported"); }
 
-  /**
-   * Static factory designed to expose `audioprocess` events to event
-   * handlers that are not necessarily instances of [ScriptProcessorNode].
-   *
-   * See [EventStreamProvider] for usage information.
-   */
-  @DomName('ScriptProcessorNode.audioprocessEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<AudioProcessingEvent> audioProcessEvent = const EventStreamProvider<AudioProcessingEvent>('audioprocess');
-
   @DomName('ScriptProcessorNode.bufferSize')
   @DocsEditable()
   int get bufferSize => _blink.BlinkScriptProcessorNode.bufferSize_Getter(this);
 
-  @DomName('ScriptProcessorNode._setEventListener')
-  @DocsEditable()
-  @Experimental() // non-standard
-  void _setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.$_setEventListener_Callback_EventListener(this, eventListener);
-
-  /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
-/**
-   * Get a Stream that fires events when AudioProcessingEvents occur.
-   * This particular stream is special in that it only allows one listener to a
-   * given stream. Converting the returned Stream [asBroadcast] will likely ruin
-   * the soft-real-time properties which which these events are fired and can
-   * be processed.
-   */
-  @DomName('ScriptProcessorNode.onaudioprocess')
+  @DomName('ScriptProcessorNode.setEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<AudioProcessingEvent> get onAudioProcess => audioProcessEvent.forTarget(this);
+  void setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.setEventListener_Callback_EventListener(this, eventListener);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 111ef77..73bed34 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -25,302 +25,302 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-const int ACTIVE_ATTRIBUTES = RenderingContext.ACTIVE_ATTRIBUTES;
-const int ACTIVE_TEXTURE = RenderingContext.ACTIVE_TEXTURE;
-const int ACTIVE_UNIFORMS = RenderingContext.ACTIVE_UNIFORMS;
-const int ALIASED_LINE_WIDTH_RANGE = RenderingContext.ALIASED_LINE_WIDTH_RANGE;
-const int ALIASED_POINT_SIZE_RANGE = RenderingContext.ALIASED_POINT_SIZE_RANGE;
-const int ALPHA = RenderingContext.ALPHA;
-const int ALPHA_BITS = RenderingContext.ALPHA_BITS;
-const int ALWAYS = RenderingContext.ALWAYS;
-const int ARRAY_BUFFER = RenderingContext.ARRAY_BUFFER;
-const int ARRAY_BUFFER_BINDING = RenderingContext.ARRAY_BUFFER_BINDING;
-const int ATTACHED_SHADERS = RenderingContext.ATTACHED_SHADERS;
-const int BACK = RenderingContext.BACK;
-const int BLEND = RenderingContext.BLEND;
-const int BLEND_COLOR = RenderingContext.BLEND_COLOR;
-const int BLEND_DST_ALPHA = RenderingContext.BLEND_DST_ALPHA;
-const int BLEND_DST_RGB = RenderingContext.BLEND_DST_RGB;
-const int BLEND_EQUATION = RenderingContext.BLEND_EQUATION;
-const int BLEND_EQUATION_ALPHA = RenderingContext.BLEND_EQUATION_ALPHA;
-const int BLEND_EQUATION_RGB = RenderingContext.BLEND_EQUATION_RGB;
-const int BLEND_SRC_ALPHA = RenderingContext.BLEND_SRC_ALPHA;
-const int BLEND_SRC_RGB = RenderingContext.BLEND_SRC_RGB;
-const int BLUE_BITS = RenderingContext.BLUE_BITS;
-const int BOOL = RenderingContext.BOOL;
-const int BOOL_VEC2 = RenderingContext.BOOL_VEC2;
-const int BOOL_VEC3 = RenderingContext.BOOL_VEC3;
-const int BOOL_VEC4 = RenderingContext.BOOL_VEC4;
-const int BROWSER_DEFAULT_WEBGL = RenderingContext.BROWSER_DEFAULT_WEBGL;
-const int BUFFER_SIZE = RenderingContext.BUFFER_SIZE;
-const int BUFFER_USAGE = RenderingContext.BUFFER_USAGE;
-const int BYTE = RenderingContext.BYTE;
-const int CCW = RenderingContext.CCW;
-const int CLAMP_TO_EDGE = RenderingContext.CLAMP_TO_EDGE;
-const int COLOR_ATTACHMENT0 = RenderingContext.COLOR_ATTACHMENT0;
-const int COLOR_BUFFER_BIT = RenderingContext.COLOR_BUFFER_BIT;
-const int COLOR_CLEAR_VALUE = RenderingContext.COLOR_CLEAR_VALUE;
-const int COLOR_WRITEMASK = RenderingContext.COLOR_WRITEMASK;
-const int COMPILE_STATUS = RenderingContext.COMPILE_STATUS;
-const int COMPRESSED_TEXTURE_FORMATS = RenderingContext.COMPRESSED_TEXTURE_FORMATS;
-const int CONSTANT_ALPHA = RenderingContext.CONSTANT_ALPHA;
-const int CONSTANT_COLOR = RenderingContext.CONSTANT_COLOR;
-const int CONTEXT_LOST_WEBGL = RenderingContext.CONTEXT_LOST_WEBGL;
-const int CULL_FACE = RenderingContext.CULL_FACE;
-const int CULL_FACE_MODE = RenderingContext.CULL_FACE_MODE;
-const int CURRENT_PROGRAM = RenderingContext.CURRENT_PROGRAM;
-const int CURRENT_VERTEX_ATTRIB = RenderingContext.CURRENT_VERTEX_ATTRIB;
-const int CW = RenderingContext.CW;
-const int DECR = RenderingContext.DECR;
-const int DECR_WRAP = RenderingContext.DECR_WRAP;
-const int DELETE_STATUS = RenderingContext.DELETE_STATUS;
-const int DEPTH_ATTACHMENT = RenderingContext.DEPTH_ATTACHMENT;
-const int DEPTH_BITS = RenderingContext.DEPTH_BITS;
-const int DEPTH_BUFFER_BIT = RenderingContext.DEPTH_BUFFER_BIT;
-const int DEPTH_CLEAR_VALUE = RenderingContext.DEPTH_CLEAR_VALUE;
-const int DEPTH_COMPONENT = RenderingContext.DEPTH_COMPONENT;
-const int DEPTH_COMPONENT16 = RenderingContext.DEPTH_COMPONENT16;
-const int DEPTH_FUNC = RenderingContext.DEPTH_FUNC;
-const int DEPTH_RANGE = RenderingContext.DEPTH_RANGE;
-const int DEPTH_STENCIL = RenderingContext.DEPTH_STENCIL;
-const int DEPTH_STENCIL_ATTACHMENT = RenderingContext.DEPTH_STENCIL_ATTACHMENT;
-const int DEPTH_TEST = RenderingContext.DEPTH_TEST;
-const int DEPTH_WRITEMASK = RenderingContext.DEPTH_WRITEMASK;
-const int DITHER = RenderingContext.DITHER;
-const int DONT_CARE = RenderingContext.DONT_CARE;
-const int DST_ALPHA = RenderingContext.DST_ALPHA;
-const int DST_COLOR = RenderingContext.DST_COLOR;
-const int DYNAMIC_DRAW = RenderingContext.DYNAMIC_DRAW;
-const int ELEMENT_ARRAY_BUFFER = RenderingContext.ELEMENT_ARRAY_BUFFER;
-const int ELEMENT_ARRAY_BUFFER_BINDING = RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
-const int EQUAL = RenderingContext.EQUAL;
-const int FASTEST = RenderingContext.FASTEST;
-const int FLOAT = RenderingContext.FLOAT;
-const int FLOAT_MAT2 = RenderingContext.FLOAT_MAT2;
-const int FLOAT_MAT3 = RenderingContext.FLOAT_MAT3;
-const int FLOAT_MAT4 = RenderingContext.FLOAT_MAT4;
-const int FLOAT_VEC2 = RenderingContext.FLOAT_VEC2;
-const int FLOAT_VEC3 = RenderingContext.FLOAT_VEC3;
-const int FLOAT_VEC4 = RenderingContext.FLOAT_VEC4;
-const int FRAGMENT_SHADER = RenderingContext.FRAGMENT_SHADER;
-const int FRAMEBUFFER = RenderingContext.FRAMEBUFFER;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
-const int FRAMEBUFFER_BINDING = RenderingContext.FRAMEBUFFER_BINDING;
-const int FRAMEBUFFER_COMPLETE = RenderingContext.FRAMEBUFFER_COMPLETE;
-const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
-const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
-const int FRAMEBUFFER_UNSUPPORTED = RenderingContext.FRAMEBUFFER_UNSUPPORTED;
-const int FRONT = RenderingContext.FRONT;
-const int FRONT_AND_BACK = RenderingContext.FRONT_AND_BACK;
-const int FRONT_FACE = RenderingContext.FRONT_FACE;
-const int FUNC_ADD = RenderingContext.FUNC_ADD;
-const int FUNC_REVERSE_SUBTRACT = RenderingContext.FUNC_REVERSE_SUBTRACT;
-const int FUNC_SUBTRACT = RenderingContext.FUNC_SUBTRACT;
-const int GENERATE_MIPMAP_HINT = RenderingContext.GENERATE_MIPMAP_HINT;
-const int GEQUAL = RenderingContext.GEQUAL;
-const int GREATER = RenderingContext.GREATER;
-const int GREEN_BITS = RenderingContext.GREEN_BITS;
+const int ACTIVE_ATTRIBUTES = RenderingContextBase.ACTIVE_ATTRIBUTES;
+const int ACTIVE_TEXTURE = RenderingContextBase.ACTIVE_TEXTURE;
+const int ACTIVE_UNIFORMS = RenderingContextBase.ACTIVE_UNIFORMS;
+const int ALIASED_LINE_WIDTH_RANGE = RenderingContextBase.ALIASED_LINE_WIDTH_RANGE;
+const int ALIASED_POINT_SIZE_RANGE = RenderingContextBase.ALIASED_POINT_SIZE_RANGE;
+const int ALPHA = RenderingContextBase.ALPHA;
+const int ALPHA_BITS = RenderingContextBase.ALPHA_BITS;
+const int ALWAYS = RenderingContextBase.ALWAYS;
+const int ARRAY_BUFFER = RenderingContextBase.ARRAY_BUFFER;
+const int ARRAY_BUFFER_BINDING = RenderingContextBase.ARRAY_BUFFER_BINDING;
+const int ATTACHED_SHADERS = RenderingContextBase.ATTACHED_SHADERS;
+const int BACK = RenderingContextBase.BACK;
+const int BLEND = RenderingContextBase.BLEND;
+const int BLEND_COLOR = RenderingContextBase.BLEND_COLOR;
+const int BLEND_DST_ALPHA = RenderingContextBase.BLEND_DST_ALPHA;
+const int BLEND_DST_RGB = RenderingContextBase.BLEND_DST_RGB;
+const int BLEND_EQUATION = RenderingContextBase.BLEND_EQUATION;
+const int BLEND_EQUATION_ALPHA = RenderingContextBase.BLEND_EQUATION_ALPHA;
+const int BLEND_EQUATION_RGB = RenderingContextBase.BLEND_EQUATION_RGB;
+const int BLEND_SRC_ALPHA = RenderingContextBase.BLEND_SRC_ALPHA;
+const int BLEND_SRC_RGB = RenderingContextBase.BLEND_SRC_RGB;
+const int BLUE_BITS = RenderingContextBase.BLUE_BITS;
+const int BOOL = RenderingContextBase.BOOL;
+const int BOOL_VEC2 = RenderingContextBase.BOOL_VEC2;
+const int BOOL_VEC3 = RenderingContextBase.BOOL_VEC3;
+const int BOOL_VEC4 = RenderingContextBase.BOOL_VEC4;
+const int BROWSER_DEFAULT_WEBGL = RenderingContextBase.BROWSER_DEFAULT_WEBGL;
+const int BUFFER_SIZE = RenderingContextBase.BUFFER_SIZE;
+const int BUFFER_USAGE = RenderingContextBase.BUFFER_USAGE;
+const int BYTE = RenderingContextBase.BYTE;
+const int CCW = RenderingContextBase.CCW;
+const int CLAMP_TO_EDGE = RenderingContextBase.CLAMP_TO_EDGE;
+const int COLOR_ATTACHMENT0 = RenderingContextBase.COLOR_ATTACHMENT0;
+const int COLOR_BUFFER_BIT = RenderingContextBase.COLOR_BUFFER_BIT;
+const int COLOR_CLEAR_VALUE = RenderingContextBase.COLOR_CLEAR_VALUE;
+const int COLOR_WRITEMASK = RenderingContextBase.COLOR_WRITEMASK;
+const int COMPILE_STATUS = RenderingContextBase.COMPILE_STATUS;
+const int COMPRESSED_TEXTURE_FORMATS = RenderingContextBase.COMPRESSED_TEXTURE_FORMATS;
+const int CONSTANT_ALPHA = RenderingContextBase.CONSTANT_ALPHA;
+const int CONSTANT_COLOR = RenderingContextBase.CONSTANT_COLOR;
+const int CONTEXT_LOST_WEBGL = RenderingContextBase.CONTEXT_LOST_WEBGL;
+const int CULL_FACE = RenderingContextBase.CULL_FACE;
+const int CULL_FACE_MODE = RenderingContextBase.CULL_FACE_MODE;
+const int CURRENT_PROGRAM = RenderingContextBase.CURRENT_PROGRAM;
+const int CURRENT_VERTEX_ATTRIB = RenderingContextBase.CURRENT_VERTEX_ATTRIB;
+const int CW = RenderingContextBase.CW;
+const int DECR = RenderingContextBase.DECR;
+const int DECR_WRAP = RenderingContextBase.DECR_WRAP;
+const int DELETE_STATUS = RenderingContextBase.DELETE_STATUS;
+const int DEPTH_ATTACHMENT = RenderingContextBase.DEPTH_ATTACHMENT;
+const int DEPTH_BITS = RenderingContextBase.DEPTH_BITS;
+const int DEPTH_BUFFER_BIT = RenderingContextBase.DEPTH_BUFFER_BIT;
+const int DEPTH_CLEAR_VALUE = RenderingContextBase.DEPTH_CLEAR_VALUE;
+const int DEPTH_COMPONENT = RenderingContextBase.DEPTH_COMPONENT;
+const int DEPTH_COMPONENT16 = RenderingContextBase.DEPTH_COMPONENT16;
+const int DEPTH_FUNC = RenderingContextBase.DEPTH_FUNC;
+const int DEPTH_RANGE = RenderingContextBase.DEPTH_RANGE;
+const int DEPTH_STENCIL = RenderingContextBase.DEPTH_STENCIL;
+const int DEPTH_STENCIL_ATTACHMENT = RenderingContextBase.DEPTH_STENCIL_ATTACHMENT;
+const int DEPTH_TEST = RenderingContextBase.DEPTH_TEST;
+const int DEPTH_WRITEMASK = RenderingContextBase.DEPTH_WRITEMASK;
+const int DITHER = RenderingContextBase.DITHER;
+const int DONT_CARE = RenderingContextBase.DONT_CARE;
+const int DST_ALPHA = RenderingContextBase.DST_ALPHA;
+const int DST_COLOR = RenderingContextBase.DST_COLOR;
+const int DYNAMIC_DRAW = RenderingContextBase.DYNAMIC_DRAW;
+const int ELEMENT_ARRAY_BUFFER = RenderingContextBase.ELEMENT_ARRAY_BUFFER;
+const int ELEMENT_ARRAY_BUFFER_BINDING = RenderingContextBase.ELEMENT_ARRAY_BUFFER_BINDING;
+const int EQUAL = RenderingContextBase.EQUAL;
+const int FASTEST = RenderingContextBase.FASTEST;
+const int FLOAT = RenderingContextBase.FLOAT;
+const int FLOAT_MAT2 = RenderingContextBase.FLOAT_MAT2;
+const int FLOAT_MAT3 = RenderingContextBase.FLOAT_MAT3;
+const int FLOAT_MAT4 = RenderingContextBase.FLOAT_MAT4;
+const int FLOAT_VEC2 = RenderingContextBase.FLOAT_VEC2;
+const int FLOAT_VEC3 = RenderingContextBase.FLOAT_VEC3;
+const int FLOAT_VEC4 = RenderingContextBase.FLOAT_VEC4;
+const int FRAGMENT_SHADER = RenderingContextBase.FRAGMENT_SHADER;
+const int FRAMEBUFFER = RenderingContextBase.FRAMEBUFFER;
+const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = RenderingContextBase.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
+const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = RenderingContextBase.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
+const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = RenderingContextBase.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
+const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = RenderingContextBase.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
+const int FRAMEBUFFER_BINDING = RenderingContextBase.FRAMEBUFFER_BINDING;
+const int FRAMEBUFFER_COMPLETE = RenderingContextBase.FRAMEBUFFER_COMPLETE;
+const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = RenderingContextBase.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = RenderingContextBase.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
+const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = RenderingContextBase.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
+const int FRAMEBUFFER_UNSUPPORTED = RenderingContextBase.FRAMEBUFFER_UNSUPPORTED;
+const int FRONT = RenderingContextBase.FRONT;
+const int FRONT_AND_BACK = RenderingContextBase.FRONT_AND_BACK;
+const int FRONT_FACE = RenderingContextBase.FRONT_FACE;
+const int FUNC_ADD = RenderingContextBase.FUNC_ADD;
+const int FUNC_REVERSE_SUBTRACT = RenderingContextBase.FUNC_REVERSE_SUBTRACT;
+const int FUNC_SUBTRACT = RenderingContextBase.FUNC_SUBTRACT;
+const int GENERATE_MIPMAP_HINT = RenderingContextBase.GENERATE_MIPMAP_HINT;
+const int GEQUAL = RenderingContextBase.GEQUAL;
+const int GREATER = RenderingContextBase.GREATER;
+const int GREEN_BITS = RenderingContextBase.GREEN_BITS;
 const int HALF_FLOAT_OES = OesTextureHalfFloat.HALF_FLOAT_OES;
-const int HIGH_FLOAT = RenderingContext.HIGH_FLOAT;
-const int HIGH_INT = RenderingContext.HIGH_INT;
-const int INCR = RenderingContext.INCR;
-const int INCR_WRAP = RenderingContext.INCR_WRAP;
-const int INT = RenderingContext.INT;
-const int INT_VEC2 = RenderingContext.INT_VEC2;
-const int INT_VEC3 = RenderingContext.INT_VEC3;
-const int INT_VEC4 = RenderingContext.INT_VEC4;
-const int INVALID_ENUM = RenderingContext.INVALID_ENUM;
-const int INVALID_FRAMEBUFFER_OPERATION = RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
-const int INVALID_OPERATION = RenderingContext.INVALID_OPERATION;
-const int INVALID_VALUE = RenderingContext.INVALID_VALUE;
-const int INVERT = RenderingContext.INVERT;
-const int KEEP = RenderingContext.KEEP;
-const int LEQUAL = RenderingContext.LEQUAL;
-const int LESS = RenderingContext.LESS;
-const int LINEAR = RenderingContext.LINEAR;
-const int LINEAR_MIPMAP_LINEAR = RenderingContext.LINEAR_MIPMAP_LINEAR;
-const int LINEAR_MIPMAP_NEAREST = RenderingContext.LINEAR_MIPMAP_NEAREST;
-const int LINES = RenderingContext.LINES;
-const int LINE_LOOP = RenderingContext.LINE_LOOP;
-const int LINE_STRIP = RenderingContext.LINE_STRIP;
-const int LINE_WIDTH = RenderingContext.LINE_WIDTH;
-const int LINK_STATUS = RenderingContext.LINK_STATUS;
-const int LOW_FLOAT = RenderingContext.LOW_FLOAT;
-const int LOW_INT = RenderingContext.LOW_INT;
-const int LUMINANCE = RenderingContext.LUMINANCE;
-const int LUMINANCE_ALPHA = RenderingContext.LUMINANCE_ALPHA;
-const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
-const int MAX_CUBE_MAP_TEXTURE_SIZE = RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
-const int MAX_FRAGMENT_UNIFORM_VECTORS = RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
-const int MAX_RENDERBUFFER_SIZE = RenderingContext.MAX_RENDERBUFFER_SIZE;
-const int MAX_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
-const int MAX_TEXTURE_SIZE = RenderingContext.MAX_TEXTURE_SIZE;
-const int MAX_VARYING_VECTORS = RenderingContext.MAX_VARYING_VECTORS;
-const int MAX_VERTEX_ATTRIBS = RenderingContext.MAX_VERTEX_ATTRIBS;
-const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
-const int MAX_VERTEX_UNIFORM_VECTORS = RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
-const int MAX_VIEWPORT_DIMS = RenderingContext.MAX_VIEWPORT_DIMS;
-const int MEDIUM_FLOAT = RenderingContext.MEDIUM_FLOAT;
-const int MEDIUM_INT = RenderingContext.MEDIUM_INT;
-const int MIRRORED_REPEAT = RenderingContext.MIRRORED_REPEAT;
-const int NEAREST = RenderingContext.NEAREST;
-const int NEAREST_MIPMAP_LINEAR = RenderingContext.NEAREST_MIPMAP_LINEAR;
-const int NEAREST_MIPMAP_NEAREST = RenderingContext.NEAREST_MIPMAP_NEAREST;
-const int NEVER = RenderingContext.NEVER;
-const int NICEST = RenderingContext.NICEST;
-const int NONE = RenderingContext.NONE;
-const int NOTEQUAL = RenderingContext.NOTEQUAL;
-const int NO_ERROR = RenderingContext.NO_ERROR;
-const int ONE = RenderingContext.ONE;
-const int ONE_MINUS_CONSTANT_ALPHA = RenderingContext.ONE_MINUS_CONSTANT_ALPHA;
-const int ONE_MINUS_CONSTANT_COLOR = RenderingContext.ONE_MINUS_CONSTANT_COLOR;
-const int ONE_MINUS_DST_ALPHA = RenderingContext.ONE_MINUS_DST_ALPHA;
-const int ONE_MINUS_DST_COLOR = RenderingContext.ONE_MINUS_DST_COLOR;
-const int ONE_MINUS_SRC_ALPHA = RenderingContext.ONE_MINUS_SRC_ALPHA;
-const int ONE_MINUS_SRC_COLOR = RenderingContext.ONE_MINUS_SRC_COLOR;
-const int OUT_OF_MEMORY = RenderingContext.OUT_OF_MEMORY;
-const int PACK_ALIGNMENT = RenderingContext.PACK_ALIGNMENT;
-const int POINTS = RenderingContext.POINTS;
-const int POLYGON_OFFSET_FACTOR = RenderingContext.POLYGON_OFFSET_FACTOR;
-const int POLYGON_OFFSET_FILL = RenderingContext.POLYGON_OFFSET_FILL;
-const int POLYGON_OFFSET_UNITS = RenderingContext.POLYGON_OFFSET_UNITS;
-const int RED_BITS = RenderingContext.RED_BITS;
-const int RENDERBUFFER = RenderingContext.RENDERBUFFER;
-const int RENDERBUFFER_ALPHA_SIZE = RenderingContext.RENDERBUFFER_ALPHA_SIZE;
-const int RENDERBUFFER_BINDING = RenderingContext.RENDERBUFFER_BINDING;
-const int RENDERBUFFER_BLUE_SIZE = RenderingContext.RENDERBUFFER_BLUE_SIZE;
-const int RENDERBUFFER_DEPTH_SIZE = RenderingContext.RENDERBUFFER_DEPTH_SIZE;
-const int RENDERBUFFER_GREEN_SIZE = RenderingContext.RENDERBUFFER_GREEN_SIZE;
-const int RENDERBUFFER_HEIGHT = RenderingContext.RENDERBUFFER_HEIGHT;
-const int RENDERBUFFER_INTERNAL_FORMAT = RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
-const int RENDERBUFFER_RED_SIZE = RenderingContext.RENDERBUFFER_RED_SIZE;
-const int RENDERBUFFER_STENCIL_SIZE = RenderingContext.RENDERBUFFER_STENCIL_SIZE;
-const int RENDERBUFFER_WIDTH = RenderingContext.RENDERBUFFER_WIDTH;
-const int RENDERER = RenderingContext.RENDERER;
-const int REPEAT = RenderingContext.REPEAT;
-const int REPLACE = RenderingContext.REPLACE;
-const int RGB = RenderingContext.RGB;
-const int RGB565 = RenderingContext.RGB565;
-const int RGB5_A1 = RenderingContext.RGB5_A1;
-const int RGBA = RenderingContext.RGBA;
-const int RGBA4 = RenderingContext.RGBA4;
-const int SAMPLER_2D = RenderingContext.SAMPLER_2D;
-const int SAMPLER_CUBE = RenderingContext.SAMPLER_CUBE;
-const int SAMPLES = RenderingContext.SAMPLES;
-const int SAMPLE_ALPHA_TO_COVERAGE = RenderingContext.SAMPLE_ALPHA_TO_COVERAGE;
-const int SAMPLE_BUFFERS = RenderingContext.SAMPLE_BUFFERS;
-const int SAMPLE_COVERAGE = RenderingContext.SAMPLE_COVERAGE;
-const int SAMPLE_COVERAGE_INVERT = RenderingContext.SAMPLE_COVERAGE_INVERT;
-const int SAMPLE_COVERAGE_VALUE = RenderingContext.SAMPLE_COVERAGE_VALUE;
-const int SCISSOR_BOX = RenderingContext.SCISSOR_BOX;
-const int SCISSOR_TEST = RenderingContext.SCISSOR_TEST;
-const int SHADER_TYPE = RenderingContext.SHADER_TYPE;
-const int SHADING_LANGUAGE_VERSION = RenderingContext.SHADING_LANGUAGE_VERSION;
-const int SHORT = RenderingContext.SHORT;
-const int SRC_ALPHA = RenderingContext.SRC_ALPHA;
-const int SRC_ALPHA_SATURATE = RenderingContext.SRC_ALPHA_SATURATE;
-const int SRC_COLOR = RenderingContext.SRC_COLOR;
-const int STATIC_DRAW = RenderingContext.STATIC_DRAW;
-const int STENCIL_ATTACHMENT = RenderingContext.STENCIL_ATTACHMENT;
-const int STENCIL_BACK_FAIL = RenderingContext.STENCIL_BACK_FAIL;
-const int STENCIL_BACK_FUNC = RenderingContext.STENCIL_BACK_FUNC;
-const int STENCIL_BACK_PASS_DEPTH_FAIL = RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
-const int STENCIL_BACK_PASS_DEPTH_PASS = RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
-const int STENCIL_BACK_REF = RenderingContext.STENCIL_BACK_REF;
-const int STENCIL_BACK_VALUE_MASK = RenderingContext.STENCIL_BACK_VALUE_MASK;
-const int STENCIL_BACK_WRITEMASK = RenderingContext.STENCIL_BACK_WRITEMASK;
-const int STENCIL_BITS = RenderingContext.STENCIL_BITS;
-const int STENCIL_BUFFER_BIT = RenderingContext.STENCIL_BUFFER_BIT;
-const int STENCIL_CLEAR_VALUE = RenderingContext.STENCIL_CLEAR_VALUE;
-const int STENCIL_FAIL = RenderingContext.STENCIL_FAIL;
-const int STENCIL_FUNC = RenderingContext.STENCIL_FUNC;
-const int STENCIL_INDEX = RenderingContext.STENCIL_INDEX;
-const int STENCIL_INDEX8 = RenderingContext.STENCIL_INDEX8;
-const int STENCIL_PASS_DEPTH_FAIL = RenderingContext.STENCIL_PASS_DEPTH_FAIL;
-const int STENCIL_PASS_DEPTH_PASS = RenderingContext.STENCIL_PASS_DEPTH_PASS;
-const int STENCIL_REF = RenderingContext.STENCIL_REF;
-const int STENCIL_TEST = RenderingContext.STENCIL_TEST;
-const int STENCIL_VALUE_MASK = RenderingContext.STENCIL_VALUE_MASK;
-const int STENCIL_WRITEMASK = RenderingContext.STENCIL_WRITEMASK;
-const int STREAM_DRAW = RenderingContext.STREAM_DRAW;
-const int SUBPIXEL_BITS = RenderingContext.SUBPIXEL_BITS;
-const int TEXTURE = RenderingContext.TEXTURE;
-const int TEXTURE0 = RenderingContext.TEXTURE0;
-const int TEXTURE1 = RenderingContext.TEXTURE1;
-const int TEXTURE10 = RenderingContext.TEXTURE10;
-const int TEXTURE11 = RenderingContext.TEXTURE11;
-const int TEXTURE12 = RenderingContext.TEXTURE12;
-const int TEXTURE13 = RenderingContext.TEXTURE13;
-const int TEXTURE14 = RenderingContext.TEXTURE14;
-const int TEXTURE15 = RenderingContext.TEXTURE15;
-const int TEXTURE16 = RenderingContext.TEXTURE16;
-const int TEXTURE17 = RenderingContext.TEXTURE17;
-const int TEXTURE18 = RenderingContext.TEXTURE18;
-const int TEXTURE19 = RenderingContext.TEXTURE19;
-const int TEXTURE2 = RenderingContext.TEXTURE2;
-const int TEXTURE20 = RenderingContext.TEXTURE20;
-const int TEXTURE21 = RenderingContext.TEXTURE21;
-const int TEXTURE22 = RenderingContext.TEXTURE22;
-const int TEXTURE23 = RenderingContext.TEXTURE23;
-const int TEXTURE24 = RenderingContext.TEXTURE24;
-const int TEXTURE25 = RenderingContext.TEXTURE25;
-const int TEXTURE26 = RenderingContext.TEXTURE26;
-const int TEXTURE27 = RenderingContext.TEXTURE27;
-const int TEXTURE28 = RenderingContext.TEXTURE28;
-const int TEXTURE29 = RenderingContext.TEXTURE29;
-const int TEXTURE3 = RenderingContext.TEXTURE3;
-const int TEXTURE30 = RenderingContext.TEXTURE30;
-const int TEXTURE31 = RenderingContext.TEXTURE31;
-const int TEXTURE4 = RenderingContext.TEXTURE4;
-const int TEXTURE5 = RenderingContext.TEXTURE5;
-const int TEXTURE6 = RenderingContext.TEXTURE6;
-const int TEXTURE7 = RenderingContext.TEXTURE7;
-const int TEXTURE8 = RenderingContext.TEXTURE8;
-const int TEXTURE9 = RenderingContext.TEXTURE9;
-const int TEXTURE_2D = RenderingContext.TEXTURE_2D;
-const int TEXTURE_BINDING_2D = RenderingContext.TEXTURE_BINDING_2D;
-const int TEXTURE_BINDING_CUBE_MAP = RenderingContext.TEXTURE_BINDING_CUBE_MAP;
-const int TEXTURE_CUBE_MAP = RenderingContext.TEXTURE_CUBE_MAP;
-const int TEXTURE_CUBE_MAP_NEGATIVE_X = RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Y = RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Z = RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
-const int TEXTURE_CUBE_MAP_POSITIVE_X = RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
-const int TEXTURE_CUBE_MAP_POSITIVE_Y = RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
-const int TEXTURE_CUBE_MAP_POSITIVE_Z = RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
-const int TEXTURE_MAG_FILTER = RenderingContext.TEXTURE_MAG_FILTER;
-const int TEXTURE_MIN_FILTER = RenderingContext.TEXTURE_MIN_FILTER;
-const int TEXTURE_WRAP_S = RenderingContext.TEXTURE_WRAP_S;
-const int TEXTURE_WRAP_T = RenderingContext.TEXTURE_WRAP_T;
-const int TRIANGLES = RenderingContext.TRIANGLES;
-const int TRIANGLE_FAN = RenderingContext.TRIANGLE_FAN;
-const int TRIANGLE_STRIP = RenderingContext.TRIANGLE_STRIP;
-const int UNPACK_ALIGNMENT = RenderingContext.UNPACK_ALIGNMENT;
-const int UNPACK_COLORSPACE_CONVERSION_WEBGL = RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
-const int UNPACK_FLIP_Y_WEBGL = RenderingContext.UNPACK_FLIP_Y_WEBGL;
-const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
-const int UNSIGNED_BYTE = RenderingContext.UNSIGNED_BYTE;
-const int UNSIGNED_INT = RenderingContext.UNSIGNED_INT;
-const int UNSIGNED_SHORT = RenderingContext.UNSIGNED_SHORT;
-const int UNSIGNED_SHORT_4_4_4_4 = RenderingContext.UNSIGNED_SHORT_4_4_4_4;
-const int UNSIGNED_SHORT_5_5_5_1 = RenderingContext.UNSIGNED_SHORT_5_5_5_1;
-const int UNSIGNED_SHORT_5_6_5 = RenderingContext.UNSIGNED_SHORT_5_6_5;
-const int VALIDATE_STATUS = RenderingContext.VALIDATE_STATUS;
-const int VENDOR = RenderingContext.VENDOR;
-const int VERSION = RenderingContext.VERSION;
-const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
-const int VERTEX_ATTRIB_ARRAY_ENABLED = RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
-const int VERTEX_ATTRIB_ARRAY_NORMALIZED = RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
-const int VERTEX_ATTRIB_ARRAY_POINTER = RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
-const int VERTEX_ATTRIB_ARRAY_SIZE = RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
-const int VERTEX_ATTRIB_ARRAY_STRIDE = RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
-const int VERTEX_ATTRIB_ARRAY_TYPE = RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
-const int VERTEX_SHADER = RenderingContext.VERTEX_SHADER;
-const int VIEWPORT = RenderingContext.VIEWPORT;
-const int ZERO = RenderingContext.ZERO;
+const int HIGH_FLOAT = RenderingContextBase.HIGH_FLOAT;
+const int HIGH_INT = RenderingContextBase.HIGH_INT;
+const int INCR = RenderingContextBase.INCR;
+const int INCR_WRAP = RenderingContextBase.INCR_WRAP;
+const int INT = RenderingContextBase.INT;
+const int INT_VEC2 = RenderingContextBase.INT_VEC2;
+const int INT_VEC3 = RenderingContextBase.INT_VEC3;
+const int INT_VEC4 = RenderingContextBase.INT_VEC4;
+const int INVALID_ENUM = RenderingContextBase.INVALID_ENUM;
+const int INVALID_FRAMEBUFFER_OPERATION = RenderingContextBase.INVALID_FRAMEBUFFER_OPERATION;
+const int INVALID_OPERATION = RenderingContextBase.INVALID_OPERATION;
+const int INVALID_VALUE = RenderingContextBase.INVALID_VALUE;
+const int INVERT = RenderingContextBase.INVERT;
+const int KEEP = RenderingContextBase.KEEP;
+const int LEQUAL = RenderingContextBase.LEQUAL;
+const int LESS = RenderingContextBase.LESS;
+const int LINEAR = RenderingContextBase.LINEAR;
+const int LINEAR_MIPMAP_LINEAR = RenderingContextBase.LINEAR_MIPMAP_LINEAR;
+const int LINEAR_MIPMAP_NEAREST = RenderingContextBase.LINEAR_MIPMAP_NEAREST;
+const int LINES = RenderingContextBase.LINES;
+const int LINE_LOOP = RenderingContextBase.LINE_LOOP;
+const int LINE_STRIP = RenderingContextBase.LINE_STRIP;
+const int LINE_WIDTH = RenderingContextBase.LINE_WIDTH;
+const int LINK_STATUS = RenderingContextBase.LINK_STATUS;
+const int LOW_FLOAT = RenderingContextBase.LOW_FLOAT;
+const int LOW_INT = RenderingContextBase.LOW_INT;
+const int LUMINANCE = RenderingContextBase.LUMINANCE;
+const int LUMINANCE_ALPHA = RenderingContextBase.LUMINANCE_ALPHA;
+const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = RenderingContextBase.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
+const int MAX_CUBE_MAP_TEXTURE_SIZE = RenderingContextBase.MAX_CUBE_MAP_TEXTURE_SIZE;
+const int MAX_FRAGMENT_UNIFORM_VECTORS = RenderingContextBase.MAX_FRAGMENT_UNIFORM_VECTORS;
+const int MAX_RENDERBUFFER_SIZE = RenderingContextBase.MAX_RENDERBUFFER_SIZE;
+const int MAX_TEXTURE_IMAGE_UNITS = RenderingContextBase.MAX_TEXTURE_IMAGE_UNITS;
+const int MAX_TEXTURE_SIZE = RenderingContextBase.MAX_TEXTURE_SIZE;
+const int MAX_VARYING_VECTORS = RenderingContextBase.MAX_VARYING_VECTORS;
+const int MAX_VERTEX_ATTRIBS = RenderingContextBase.MAX_VERTEX_ATTRIBS;
+const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = RenderingContextBase.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
+const int MAX_VERTEX_UNIFORM_VECTORS = RenderingContextBase.MAX_VERTEX_UNIFORM_VECTORS;
+const int MAX_VIEWPORT_DIMS = RenderingContextBase.MAX_VIEWPORT_DIMS;
+const int MEDIUM_FLOAT = RenderingContextBase.MEDIUM_FLOAT;
+const int MEDIUM_INT = RenderingContextBase.MEDIUM_INT;
+const int MIRRORED_REPEAT = RenderingContextBase.MIRRORED_REPEAT;
+const int NEAREST = RenderingContextBase.NEAREST;
+const int NEAREST_MIPMAP_LINEAR = RenderingContextBase.NEAREST_MIPMAP_LINEAR;
+const int NEAREST_MIPMAP_NEAREST = RenderingContextBase.NEAREST_MIPMAP_NEAREST;
+const int NEVER = RenderingContextBase.NEVER;
+const int NICEST = RenderingContextBase.NICEST;
+const int NONE = RenderingContextBase.NONE;
+const int NOTEQUAL = RenderingContextBase.NOTEQUAL;
+const int NO_ERROR = RenderingContextBase.NO_ERROR;
+const int ONE = RenderingContextBase.ONE;
+const int ONE_MINUS_CONSTANT_ALPHA = RenderingContextBase.ONE_MINUS_CONSTANT_ALPHA;
+const int ONE_MINUS_CONSTANT_COLOR = RenderingContextBase.ONE_MINUS_CONSTANT_COLOR;
+const int ONE_MINUS_DST_ALPHA = RenderingContextBase.ONE_MINUS_DST_ALPHA;
+const int ONE_MINUS_DST_COLOR = RenderingContextBase.ONE_MINUS_DST_COLOR;
+const int ONE_MINUS_SRC_ALPHA = RenderingContextBase.ONE_MINUS_SRC_ALPHA;
+const int ONE_MINUS_SRC_COLOR = RenderingContextBase.ONE_MINUS_SRC_COLOR;
+const int OUT_OF_MEMORY = RenderingContextBase.OUT_OF_MEMORY;
+const int PACK_ALIGNMENT = RenderingContextBase.PACK_ALIGNMENT;
+const int POINTS = RenderingContextBase.POINTS;
+const int POLYGON_OFFSET_FACTOR = RenderingContextBase.POLYGON_OFFSET_FACTOR;
+const int POLYGON_OFFSET_FILL = RenderingContextBase.POLYGON_OFFSET_FILL;
+const int POLYGON_OFFSET_UNITS = RenderingContextBase.POLYGON_OFFSET_UNITS;
+const int RED_BITS = RenderingContextBase.RED_BITS;
+const int RENDERBUFFER = RenderingContextBase.RENDERBUFFER;
+const int RENDERBUFFER_ALPHA_SIZE = RenderingContextBase.RENDERBUFFER_ALPHA_SIZE;
+const int RENDERBUFFER_BINDING = RenderingContextBase.RENDERBUFFER_BINDING;
+const int RENDERBUFFER_BLUE_SIZE = RenderingContextBase.RENDERBUFFER_BLUE_SIZE;
+const int RENDERBUFFER_DEPTH_SIZE = RenderingContextBase.RENDERBUFFER_DEPTH_SIZE;
+const int RENDERBUFFER_GREEN_SIZE = RenderingContextBase.RENDERBUFFER_GREEN_SIZE;
+const int RENDERBUFFER_HEIGHT = RenderingContextBase.RENDERBUFFER_HEIGHT;
+const int RENDERBUFFER_INTERNAL_FORMAT = RenderingContextBase.RENDERBUFFER_INTERNAL_FORMAT;
+const int RENDERBUFFER_RED_SIZE = RenderingContextBase.RENDERBUFFER_RED_SIZE;
+const int RENDERBUFFER_STENCIL_SIZE = RenderingContextBase.RENDERBUFFER_STENCIL_SIZE;
+const int RENDERBUFFER_WIDTH = RenderingContextBase.RENDERBUFFER_WIDTH;
+const int RENDERER = RenderingContextBase.RENDERER;
+const int REPEAT = RenderingContextBase.REPEAT;
+const int REPLACE = RenderingContextBase.REPLACE;
+const int RGB = RenderingContextBase.RGB;
+const int RGB565 = RenderingContextBase.RGB565;
+const int RGB5_A1 = RenderingContextBase.RGB5_A1;
+const int RGBA = RenderingContextBase.RGBA;
+const int RGBA4 = RenderingContextBase.RGBA4;
+const int SAMPLER_2D = RenderingContextBase.SAMPLER_2D;
+const int SAMPLER_CUBE = RenderingContextBase.SAMPLER_CUBE;
+const int SAMPLES = RenderingContextBase.SAMPLES;
+const int SAMPLE_ALPHA_TO_COVERAGE = RenderingContextBase.SAMPLE_ALPHA_TO_COVERAGE;
+const int SAMPLE_BUFFERS = RenderingContextBase.SAMPLE_BUFFERS;
+const int SAMPLE_COVERAGE = RenderingContextBase.SAMPLE_COVERAGE;
+const int SAMPLE_COVERAGE_INVERT = RenderingContextBase.SAMPLE_COVERAGE_INVERT;
+const int SAMPLE_COVERAGE_VALUE = RenderingContextBase.SAMPLE_COVERAGE_VALUE;
+const int SCISSOR_BOX = RenderingContextBase.SCISSOR_BOX;
+const int SCISSOR_TEST = RenderingContextBase.SCISSOR_TEST;
+const int SHADER_TYPE = RenderingContextBase.SHADER_TYPE;
+const int SHADING_LANGUAGE_VERSION = RenderingContextBase.SHADING_LANGUAGE_VERSION;
+const int SHORT = RenderingContextBase.SHORT;
+const int SRC_ALPHA = RenderingContextBase.SRC_ALPHA;
+const int SRC_ALPHA_SATURATE = RenderingContextBase.SRC_ALPHA_SATURATE;
+const int SRC_COLOR = RenderingContextBase.SRC_COLOR;
+const int STATIC_DRAW = RenderingContextBase.STATIC_DRAW;
+const int STENCIL_ATTACHMENT = RenderingContextBase.STENCIL_ATTACHMENT;
+const int STENCIL_BACK_FAIL = RenderingContextBase.STENCIL_BACK_FAIL;
+const int STENCIL_BACK_FUNC = RenderingContextBase.STENCIL_BACK_FUNC;
+const int STENCIL_BACK_PASS_DEPTH_FAIL = RenderingContextBase.STENCIL_BACK_PASS_DEPTH_FAIL;
+const int STENCIL_BACK_PASS_DEPTH_PASS = RenderingContextBase.STENCIL_BACK_PASS_DEPTH_PASS;
+const int STENCIL_BACK_REF = RenderingContextBase.STENCIL_BACK_REF;
+const int STENCIL_BACK_VALUE_MASK = RenderingContextBase.STENCIL_BACK_VALUE_MASK;
+const int STENCIL_BACK_WRITEMASK = RenderingContextBase.STENCIL_BACK_WRITEMASK;
+const int STENCIL_BITS = RenderingContextBase.STENCIL_BITS;
+const int STENCIL_BUFFER_BIT = RenderingContextBase.STENCIL_BUFFER_BIT;
+const int STENCIL_CLEAR_VALUE = RenderingContextBase.STENCIL_CLEAR_VALUE;
+const int STENCIL_FAIL = RenderingContextBase.STENCIL_FAIL;
+const int STENCIL_FUNC = RenderingContextBase.STENCIL_FUNC;
+const int STENCIL_INDEX = RenderingContextBase.STENCIL_INDEX;
+const int STENCIL_INDEX8 = RenderingContextBase.STENCIL_INDEX8;
+const int STENCIL_PASS_DEPTH_FAIL = RenderingContextBase.STENCIL_PASS_DEPTH_FAIL;
+const int STENCIL_PASS_DEPTH_PASS = RenderingContextBase.STENCIL_PASS_DEPTH_PASS;
+const int STENCIL_REF = RenderingContextBase.STENCIL_REF;
+const int STENCIL_TEST = RenderingContextBase.STENCIL_TEST;
+const int STENCIL_VALUE_MASK = RenderingContextBase.STENCIL_VALUE_MASK;
+const int STENCIL_WRITEMASK = RenderingContextBase.STENCIL_WRITEMASK;
+const int STREAM_DRAW = RenderingContextBase.STREAM_DRAW;
+const int SUBPIXEL_BITS = RenderingContextBase.SUBPIXEL_BITS;
+const int TEXTURE = RenderingContextBase.TEXTURE;
+const int TEXTURE0 = RenderingContextBase.TEXTURE0;
+const int TEXTURE1 = RenderingContextBase.TEXTURE1;
+const int TEXTURE10 = RenderingContextBase.TEXTURE10;
+const int TEXTURE11 = RenderingContextBase.TEXTURE11;
+const int TEXTURE12 = RenderingContextBase.TEXTURE12;
+const int TEXTURE13 = RenderingContextBase.TEXTURE13;
+const int TEXTURE14 = RenderingContextBase.TEXTURE14;
+const int TEXTURE15 = RenderingContextBase.TEXTURE15;
+const int TEXTURE16 = RenderingContextBase.TEXTURE16;
+const int TEXTURE17 = RenderingContextBase.TEXTURE17;
+const int TEXTURE18 = RenderingContextBase.TEXTURE18;
+const int TEXTURE19 = RenderingContextBase.TEXTURE19;
+const int TEXTURE2 = RenderingContextBase.TEXTURE2;
+const int TEXTURE20 = RenderingContextBase.TEXTURE20;
+const int TEXTURE21 = RenderingContextBase.TEXTURE21;
+const int TEXTURE22 = RenderingContextBase.TEXTURE22;
+const int TEXTURE23 = RenderingContextBase.TEXTURE23;
+const int TEXTURE24 = RenderingContextBase.TEXTURE24;
+const int TEXTURE25 = RenderingContextBase.TEXTURE25;
+const int TEXTURE26 = RenderingContextBase.TEXTURE26;
+const int TEXTURE27 = RenderingContextBase.TEXTURE27;
+const int TEXTURE28 = RenderingContextBase.TEXTURE28;
+const int TEXTURE29 = RenderingContextBase.TEXTURE29;
+const int TEXTURE3 = RenderingContextBase.TEXTURE3;
+const int TEXTURE30 = RenderingContextBase.TEXTURE30;
+const int TEXTURE31 = RenderingContextBase.TEXTURE31;
+const int TEXTURE4 = RenderingContextBase.TEXTURE4;
+const int TEXTURE5 = RenderingContextBase.TEXTURE5;
+const int TEXTURE6 = RenderingContextBase.TEXTURE6;
+const int TEXTURE7 = RenderingContextBase.TEXTURE7;
+const int TEXTURE8 = RenderingContextBase.TEXTURE8;
+const int TEXTURE9 = RenderingContextBase.TEXTURE9;
+const int TEXTURE_2D = RenderingContextBase.TEXTURE_2D;
+const int TEXTURE_BINDING_2D = RenderingContextBase.TEXTURE_BINDING_2D;
+const int TEXTURE_BINDING_CUBE_MAP = RenderingContextBase.TEXTURE_BINDING_CUBE_MAP;
+const int TEXTURE_CUBE_MAP = RenderingContextBase.TEXTURE_CUBE_MAP;
+const int TEXTURE_CUBE_MAP_NEGATIVE_X = RenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_X;
+const int TEXTURE_CUBE_MAP_NEGATIVE_Y = RenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_Y;
+const int TEXTURE_CUBE_MAP_NEGATIVE_Z = RenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_Z;
+const int TEXTURE_CUBE_MAP_POSITIVE_X = RenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_X;
+const int TEXTURE_CUBE_MAP_POSITIVE_Y = RenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_Y;
+const int TEXTURE_CUBE_MAP_POSITIVE_Z = RenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_Z;
+const int TEXTURE_MAG_FILTER = RenderingContextBase.TEXTURE_MAG_FILTER;
+const int TEXTURE_MIN_FILTER = RenderingContextBase.TEXTURE_MIN_FILTER;
+const int TEXTURE_WRAP_S = RenderingContextBase.TEXTURE_WRAP_S;
+const int TEXTURE_WRAP_T = RenderingContextBase.TEXTURE_WRAP_T;
+const int TRIANGLES = RenderingContextBase.TRIANGLES;
+const int TRIANGLE_FAN = RenderingContextBase.TRIANGLE_FAN;
+const int TRIANGLE_STRIP = RenderingContextBase.TRIANGLE_STRIP;
+const int UNPACK_ALIGNMENT = RenderingContextBase.UNPACK_ALIGNMENT;
+const int UNPACK_COLORSPACE_CONVERSION_WEBGL = RenderingContextBase.UNPACK_COLORSPACE_CONVERSION_WEBGL;
+const int UNPACK_FLIP_Y_WEBGL = RenderingContextBase.UNPACK_FLIP_Y_WEBGL;
+const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = RenderingContextBase.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
+const int UNSIGNED_BYTE = RenderingContextBase.UNSIGNED_BYTE;
+const int UNSIGNED_INT = RenderingContextBase.UNSIGNED_INT;
+const int UNSIGNED_SHORT = RenderingContextBase.UNSIGNED_SHORT;
+const int UNSIGNED_SHORT_4_4_4_4 = RenderingContextBase.UNSIGNED_SHORT_4_4_4_4;
+const int UNSIGNED_SHORT_5_5_5_1 = RenderingContextBase.UNSIGNED_SHORT_5_5_5_1;
+const int UNSIGNED_SHORT_5_6_5 = RenderingContextBase.UNSIGNED_SHORT_5_6_5;
+const int VALIDATE_STATUS = RenderingContextBase.VALIDATE_STATUS;
+const int VENDOR = RenderingContextBase.VENDOR;
+const int VERSION = RenderingContextBase.VERSION;
+const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = RenderingContextBase.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
+const int VERTEX_ATTRIB_ARRAY_ENABLED = RenderingContextBase.VERTEX_ATTRIB_ARRAY_ENABLED;
+const int VERTEX_ATTRIB_ARRAY_NORMALIZED = RenderingContextBase.VERTEX_ATTRIB_ARRAY_NORMALIZED;
+const int VERTEX_ATTRIB_ARRAY_POINTER = RenderingContextBase.VERTEX_ATTRIB_ARRAY_POINTER;
+const int VERTEX_ATTRIB_ARRAY_SIZE = RenderingContextBase.VERTEX_ATTRIB_ARRAY_SIZE;
+const int VERTEX_ATTRIB_ARRAY_STRIDE = RenderingContextBase.VERTEX_ATTRIB_ARRAY_STRIDE;
+const int VERTEX_ATTRIB_ARRAY_TYPE = RenderingContextBase.VERTEX_ATTRIB_ARRAY_TYPE;
+const int VERTEX_SHADER = RenderingContextBase.VERTEX_SHADER;
+const int VIEWPORT = RenderingContextBase.VIEWPORT;
+const int ZERO = RenderingContextBase.ZERO;
 // 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.
@@ -427,6 +427,24 @@
 
 
 @DocsEditable()
+@DomName('WebGLCompressedTextureETC1')
+@Experimental() // untriaged
+@Native("WebGLCompressedTextureETC1")
+class CompressedTextureETC1 extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory CompressedTextureETC1._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WebGLCompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_RGB_ETC1_WEBGL = 0x8D64;
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('WebGLCompressedTexturePVRTC')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/
 @Experimental() // experimental
@@ -769,11 +787,29 @@
   @DomName('WebGLDrawBuffers.MAX_DRAW_BUFFERS_WEBGL')
   @DocsEditable()
   static const int MAX_DRAW_BUFFERS_WEBGL = 0x8824;
+}
+// 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.
 
-  @JSName('drawBuffersWEBGL')
-  @DomName('WebGLDrawBuffers.drawBuffersWEBGL')
+
+@DocsEditable()
+@DomName('EXTBlendMinMax')
+@Experimental() // untriaged
+@Native("EXTBlendMinMax")
+class ExtBlendMinMax extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ExtBlendMinMax._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('EXTBlendMinMax.MAX_EXT')
   @DocsEditable()
-  void drawBuffersWebgl(List<int> buffers) native;
+  @Experimental() // untriaged
+  static const int MAX_EXT = 0x8008;
+
+  @DomName('EXTBlendMinMax.MIN_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MIN_EXT = 0x8007;
 }
 // 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
@@ -795,6 +831,19 @@
 
 
 @DocsEditable()
+@DomName('EXTShaderTextureLOD')
+@Experimental() // untriaged
+@Native("EXTShaderTextureLOD")
+class ExtShaderTextureLod extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory ExtShaderTextureLod._() { throw new UnsupportedError("Not supported"); }
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('EXTTextureFilterAnisotropic')
 // http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/
 @Experimental()
@@ -1013,1192 +1062,19 @@
 @Experimental()
 @Unstable()
 @Native("WebGLRenderingContext")
-class RenderingContext extends CanvasRenderingContext {
+class RenderingContext extends Interceptor implements CanvasRenderingContext {
   // To suppress missing implicit constructor warnings.
   factory RenderingContext._() { throw new UnsupportedError("Not supported"); }
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.WebGLRenderingContext)');
 
-  @DomName('WebGLRenderingContext.ACTIVE_ATTRIBUTES')
-  @DocsEditable()
-  static const int ACTIVE_ATTRIBUTES = 0x8B89;
+  // From WebGLRenderingContextBase
 
-  @DomName('WebGLRenderingContext.ACTIVE_TEXTURE')
+  @DomName('WebGLRenderingContext.canvas')
   @DocsEditable()
-  static const int ACTIVE_TEXTURE = 0x84E0;
-
-  @DomName('WebGLRenderingContext.ACTIVE_UNIFORMS')
-  @DocsEditable()
-  static const int ACTIVE_UNIFORMS = 0x8B86;
-
-  @DomName('WebGLRenderingContext.ALIASED_LINE_WIDTH_RANGE')
-  @DocsEditable()
-  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
-
-  @DomName('WebGLRenderingContext.ALIASED_POINT_SIZE_RANGE')
-  @DocsEditable()
-  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
-
-  @DomName('WebGLRenderingContext.ALPHA')
-  @DocsEditable()
-  static const int ALPHA = 0x1906;
-
-  @DomName('WebGLRenderingContext.ALPHA_BITS')
-  @DocsEditable()
-  static const int ALPHA_BITS = 0x0D55;
-
-  @DomName('WebGLRenderingContext.ALWAYS')
-  @DocsEditable()
-  static const int ALWAYS = 0x0207;
-
-  @DomName('WebGLRenderingContext.ARRAY_BUFFER')
-  @DocsEditable()
-  static const int ARRAY_BUFFER = 0x8892;
-
-  @DomName('WebGLRenderingContext.ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  static const int ARRAY_BUFFER_BINDING = 0x8894;
-
-  @DomName('WebGLRenderingContext.ATTACHED_SHADERS')
-  @DocsEditable()
-  static const int ATTACHED_SHADERS = 0x8B85;
-
-  @DomName('WebGLRenderingContext.BACK')
-  @DocsEditable()
-  static const int BACK = 0x0405;
-
-  @DomName('WebGLRenderingContext.BLEND')
-  @DocsEditable()
-  static const int BLEND = 0x0BE2;
-
-  @DomName('WebGLRenderingContext.BLEND_COLOR')
-  @DocsEditable()
-  static const int BLEND_COLOR = 0x8005;
-
-  @DomName('WebGLRenderingContext.BLEND_DST_ALPHA')
-  @DocsEditable()
-  static const int BLEND_DST_ALPHA = 0x80CA;
-
-  @DomName('WebGLRenderingContext.BLEND_DST_RGB')
-  @DocsEditable()
-  static const int BLEND_DST_RGB = 0x80C8;
-
-  @DomName('WebGLRenderingContext.BLEND_EQUATION')
-  @DocsEditable()
-  static const int BLEND_EQUATION = 0x8009;
-
-  @DomName('WebGLRenderingContext.BLEND_EQUATION_ALPHA')
-  @DocsEditable()
-  static const int BLEND_EQUATION_ALPHA = 0x883D;
-
-  @DomName('WebGLRenderingContext.BLEND_EQUATION_RGB')
-  @DocsEditable()
-  static const int BLEND_EQUATION_RGB = 0x8009;
-
-  @DomName('WebGLRenderingContext.BLEND_SRC_ALPHA')
-  @DocsEditable()
-  static const int BLEND_SRC_ALPHA = 0x80CB;
-
-  @DomName('WebGLRenderingContext.BLEND_SRC_RGB')
-  @DocsEditable()
-  static const int BLEND_SRC_RGB = 0x80C9;
-
-  @DomName('WebGLRenderingContext.BLUE_BITS')
-  @DocsEditable()
-  static const int BLUE_BITS = 0x0D54;
-
-  @DomName('WebGLRenderingContext.BOOL')
-  @DocsEditable()
-  static const int BOOL = 0x8B56;
-
-  @DomName('WebGLRenderingContext.BOOL_VEC2')
-  @DocsEditable()
-  static const int BOOL_VEC2 = 0x8B57;
-
-  @DomName('WebGLRenderingContext.BOOL_VEC3')
-  @DocsEditable()
-  static const int BOOL_VEC3 = 0x8B58;
-
-  @DomName('WebGLRenderingContext.BOOL_VEC4')
-  @DocsEditable()
-  static const int BOOL_VEC4 = 0x8B59;
-
-  @DomName('WebGLRenderingContext.BROWSER_DEFAULT_WEBGL')
-  @DocsEditable()
-  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
-
-  @DomName('WebGLRenderingContext.BUFFER_SIZE')
-  @DocsEditable()
-  static const int BUFFER_SIZE = 0x8764;
-
-  @DomName('WebGLRenderingContext.BUFFER_USAGE')
-  @DocsEditable()
-  static const int BUFFER_USAGE = 0x8765;
-
-  @DomName('WebGLRenderingContext.BYTE')
-  @DocsEditable()
-  static const int BYTE = 0x1400;
-
-  @DomName('WebGLRenderingContext.CCW')
-  @DocsEditable()
-  static const int CCW = 0x0901;
-
-  @DomName('WebGLRenderingContext.CLAMP_TO_EDGE')
-  @DocsEditable()
-  static const int CLAMP_TO_EDGE = 0x812F;
-
-  @DomName('WebGLRenderingContext.COLOR_ATTACHMENT0')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT0 = 0x8CE0;
-
-  @DomName('WebGLRenderingContext.COLOR_BUFFER_BIT')
-  @DocsEditable()
-  static const int COLOR_BUFFER_BIT = 0x00004000;
-
-  @DomName('WebGLRenderingContext.COLOR_CLEAR_VALUE')
-  @DocsEditable()
-  static const int COLOR_CLEAR_VALUE = 0x0C22;
-
-  @DomName('WebGLRenderingContext.COLOR_WRITEMASK')
-  @DocsEditable()
-  static const int COLOR_WRITEMASK = 0x0C23;
-
-  @DomName('WebGLRenderingContext.COMPILE_STATUS')
-  @DocsEditable()
-  static const int COMPILE_STATUS = 0x8B81;
-
-  @DomName('WebGLRenderingContext.COMPRESSED_TEXTURE_FORMATS')
-  @DocsEditable()
-  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
-
-  @DomName('WebGLRenderingContext.CONSTANT_ALPHA')
-  @DocsEditable()
-  static const int CONSTANT_ALPHA = 0x8003;
-
-  @DomName('WebGLRenderingContext.CONSTANT_COLOR')
-  @DocsEditable()
-  static const int CONSTANT_COLOR = 0x8001;
-
-  @DomName('WebGLRenderingContext.CONTEXT_LOST_WEBGL')
-  @DocsEditable()
-  static const int CONTEXT_LOST_WEBGL = 0x9242;
-
-  @DomName('WebGLRenderingContext.CULL_FACE')
-  @DocsEditable()
-  static const int CULL_FACE = 0x0B44;
-
-  @DomName('WebGLRenderingContext.CULL_FACE_MODE')
-  @DocsEditable()
-  static const int CULL_FACE_MODE = 0x0B45;
-
-  @DomName('WebGLRenderingContext.CURRENT_PROGRAM')
-  @DocsEditable()
-  static const int CURRENT_PROGRAM = 0x8B8D;
-
-  @DomName('WebGLRenderingContext.CURRENT_VERTEX_ATTRIB')
-  @DocsEditable()
-  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
-
-  @DomName('WebGLRenderingContext.CW')
-  @DocsEditable()
-  static const int CW = 0x0900;
-
-  @DomName('WebGLRenderingContext.DECR')
-  @DocsEditable()
-  static const int DECR = 0x1E03;
-
-  @DomName('WebGLRenderingContext.DECR_WRAP')
-  @DocsEditable()
-  static const int DECR_WRAP = 0x8508;
-
-  @DomName('WebGLRenderingContext.DELETE_STATUS')
-  @DocsEditable()
-  static const int DELETE_STATUS = 0x8B80;
-
-  @DomName('WebGLRenderingContext.DEPTH_ATTACHMENT')
-  @DocsEditable()
-  static const int DEPTH_ATTACHMENT = 0x8D00;
-
-  @DomName('WebGLRenderingContext.DEPTH_BITS')
-  @DocsEditable()
-  static const int DEPTH_BITS = 0x0D56;
-
-  @DomName('WebGLRenderingContext.DEPTH_BUFFER_BIT')
-  @DocsEditable()
-  static const int DEPTH_BUFFER_BIT = 0x00000100;
-
-  @DomName('WebGLRenderingContext.DEPTH_CLEAR_VALUE')
-  @DocsEditable()
-  static const int DEPTH_CLEAR_VALUE = 0x0B73;
-
-  @DomName('WebGLRenderingContext.DEPTH_COMPONENT')
-  @DocsEditable()
-  static const int DEPTH_COMPONENT = 0x1902;
-
-  @DomName('WebGLRenderingContext.DEPTH_COMPONENT16')
-  @DocsEditable()
-  static const int DEPTH_COMPONENT16 = 0x81A5;
-
-  @DomName('WebGLRenderingContext.DEPTH_FUNC')
-  @DocsEditable()
-  static const int DEPTH_FUNC = 0x0B74;
-
-  @DomName('WebGLRenderingContext.DEPTH_RANGE')
-  @DocsEditable()
-  static const int DEPTH_RANGE = 0x0B70;
-
-  @DomName('WebGLRenderingContext.DEPTH_STENCIL')
-  @DocsEditable()
-  static const int DEPTH_STENCIL = 0x84F9;
-
-  @DomName('WebGLRenderingContext.DEPTH_STENCIL_ATTACHMENT')
-  @DocsEditable()
-  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
-
-  @DomName('WebGLRenderingContext.DEPTH_TEST')
-  @DocsEditable()
-  static const int DEPTH_TEST = 0x0B71;
-
-  @DomName('WebGLRenderingContext.DEPTH_WRITEMASK')
-  @DocsEditable()
-  static const int DEPTH_WRITEMASK = 0x0B72;
-
-  @DomName('WebGLRenderingContext.DITHER')
-  @DocsEditable()
-  static const int DITHER = 0x0BD0;
-
-  @DomName('WebGLRenderingContext.DONT_CARE')
-  @DocsEditable()
-  static const int DONT_CARE = 0x1100;
-
-  @DomName('WebGLRenderingContext.DST_ALPHA')
-  @DocsEditable()
-  static const int DST_ALPHA = 0x0304;
-
-  @DomName('WebGLRenderingContext.DST_COLOR')
-  @DocsEditable()
-  static const int DST_COLOR = 0x0306;
-
-  @DomName('WebGLRenderingContext.DYNAMIC_DRAW')
-  @DocsEditable()
-  static const int DYNAMIC_DRAW = 0x88E8;
-
-  @DomName('WebGLRenderingContext.ELEMENT_ARRAY_BUFFER')
-  @DocsEditable()
-  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
-
-  @DomName('WebGLRenderingContext.ELEMENT_ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
-
-  @DomName('WebGLRenderingContext.EQUAL')
-  @DocsEditable()
-  static const int EQUAL = 0x0202;
-
-  @DomName('WebGLRenderingContext.FASTEST')
-  @DocsEditable()
-  static const int FASTEST = 0x1101;
-
-  @DomName('WebGLRenderingContext.FLOAT')
-  @DocsEditable()
-  static const int FLOAT = 0x1406;
-
-  @DomName('WebGLRenderingContext.FLOAT_MAT2')
-  @DocsEditable()
-  static const int FLOAT_MAT2 = 0x8B5A;
-
-  @DomName('WebGLRenderingContext.FLOAT_MAT3')
-  @DocsEditable()
-  static const int FLOAT_MAT3 = 0x8B5B;
-
-  @DomName('WebGLRenderingContext.FLOAT_MAT4')
-  @DocsEditable()
-  static const int FLOAT_MAT4 = 0x8B5C;
-
-  @DomName('WebGLRenderingContext.FLOAT_VEC2')
-  @DocsEditable()
-  static const int FLOAT_VEC2 = 0x8B50;
-
-  @DomName('WebGLRenderingContext.FLOAT_VEC3')
-  @DocsEditable()
-  static const int FLOAT_VEC3 = 0x8B51;
-
-  @DomName('WebGLRenderingContext.FLOAT_VEC4')
-  @DocsEditable()
-  static const int FLOAT_VEC4 = 0x8B52;
-
-  @DomName('WebGLRenderingContext.FRAGMENT_SHADER')
-  @DocsEditable()
-  static const int FRAGMENT_SHADER = 0x8B30;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER')
-  @DocsEditable()
-  static const int FRAMEBUFFER = 0x8D40;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_BINDING')
-  @DocsEditable()
-  static const int FRAMEBUFFER_BINDING = 0x8CA6;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_COMPLETE')
-  @DocsEditable()
-  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT')
-  @DocsEditable()
-  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS')
-  @DocsEditable()
-  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT')
-  @DocsEditable()
-  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_UNSUPPORTED')
-  @DocsEditable()
-  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
-
-  @DomName('WebGLRenderingContext.FRONT')
-  @DocsEditable()
-  static const int FRONT = 0x0404;
-
-  @DomName('WebGLRenderingContext.FRONT_AND_BACK')
-  @DocsEditable()
-  static const int FRONT_AND_BACK = 0x0408;
-
-  @DomName('WebGLRenderingContext.FRONT_FACE')
-  @DocsEditable()
-  static const int FRONT_FACE = 0x0B46;
-
-  @DomName('WebGLRenderingContext.FUNC_ADD')
-  @DocsEditable()
-  static const int FUNC_ADD = 0x8006;
-
-  @DomName('WebGLRenderingContext.FUNC_REVERSE_SUBTRACT')
-  @DocsEditable()
-  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
-
-  @DomName('WebGLRenderingContext.FUNC_SUBTRACT')
-  @DocsEditable()
-  static const int FUNC_SUBTRACT = 0x800A;
-
-  @DomName('WebGLRenderingContext.GENERATE_MIPMAP_HINT')
-  @DocsEditable()
-  static const int GENERATE_MIPMAP_HINT = 0x8192;
-
-  @DomName('WebGLRenderingContext.GEQUAL')
-  @DocsEditable()
-  static const int GEQUAL = 0x0206;
-
-  @DomName('WebGLRenderingContext.GREATER')
-  @DocsEditable()
-  static const int GREATER = 0x0204;
-
-  @DomName('WebGLRenderingContext.GREEN_BITS')
-  @DocsEditable()
-  static const int GREEN_BITS = 0x0D53;
-
-  @DomName('WebGLRenderingContext.HIGH_FLOAT')
-  @DocsEditable()
-  static const int HIGH_FLOAT = 0x8DF2;
-
-  @DomName('WebGLRenderingContext.HIGH_INT')
-  @DocsEditable()
-  static const int HIGH_INT = 0x8DF5;
-
-  @DomName('WebGLRenderingContext.INCR')
-  @DocsEditable()
-  static const int INCR = 0x1E02;
-
-  @DomName('WebGLRenderingContext.INCR_WRAP')
-  @DocsEditable()
-  static const int INCR_WRAP = 0x8507;
-
-  @DomName('WebGLRenderingContext.INT')
-  @DocsEditable()
-  static const int INT = 0x1404;
-
-  @DomName('WebGLRenderingContext.INT_VEC2')
-  @DocsEditable()
-  static const int INT_VEC2 = 0x8B53;
-
-  @DomName('WebGLRenderingContext.INT_VEC3')
-  @DocsEditable()
-  static const int INT_VEC3 = 0x8B54;
-
-  @DomName('WebGLRenderingContext.INT_VEC4')
-  @DocsEditable()
-  static const int INT_VEC4 = 0x8B55;
-
-  @DomName('WebGLRenderingContext.INVALID_ENUM')
-  @DocsEditable()
-  static const int INVALID_ENUM = 0x0500;
-
-  @DomName('WebGLRenderingContext.INVALID_FRAMEBUFFER_OPERATION')
-  @DocsEditable()
-  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
-
-  @DomName('WebGLRenderingContext.INVALID_OPERATION')
-  @DocsEditable()
-  static const int INVALID_OPERATION = 0x0502;
-
-  @DomName('WebGLRenderingContext.INVALID_VALUE')
-  @DocsEditable()
-  static const int INVALID_VALUE = 0x0501;
-
-  @DomName('WebGLRenderingContext.INVERT')
-  @DocsEditable()
-  static const int INVERT = 0x150A;
-
-  @DomName('WebGLRenderingContext.KEEP')
-  @DocsEditable()
-  static const int KEEP = 0x1E00;
-
-  @DomName('WebGLRenderingContext.LEQUAL')
-  @DocsEditable()
-  static const int LEQUAL = 0x0203;
-
-  @DomName('WebGLRenderingContext.LESS')
-  @DocsEditable()
-  static const int LESS = 0x0201;
-
-  @DomName('WebGLRenderingContext.LINEAR')
-  @DocsEditable()
-  static const int LINEAR = 0x2601;
-
-  @DomName('WebGLRenderingContext.LINEAR_MIPMAP_LINEAR')
-  @DocsEditable()
-  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
-
-  @DomName('WebGLRenderingContext.LINEAR_MIPMAP_NEAREST')
-  @DocsEditable()
-  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
-
-  @DomName('WebGLRenderingContext.LINES')
-  @DocsEditable()
-  static const int LINES = 0x0001;
-
-  @DomName('WebGLRenderingContext.LINE_LOOP')
-  @DocsEditable()
-  static const int LINE_LOOP = 0x0002;
-
-  @DomName('WebGLRenderingContext.LINE_STRIP')
-  @DocsEditable()
-  static const int LINE_STRIP = 0x0003;
-
-  @DomName('WebGLRenderingContext.LINE_WIDTH')
-  @DocsEditable()
-  static const int LINE_WIDTH = 0x0B21;
-
-  @DomName('WebGLRenderingContext.LINK_STATUS')
-  @DocsEditable()
-  static const int LINK_STATUS = 0x8B82;
-
-  @DomName('WebGLRenderingContext.LOW_FLOAT')
-  @DocsEditable()
-  static const int LOW_FLOAT = 0x8DF0;
-
-  @DomName('WebGLRenderingContext.LOW_INT')
-  @DocsEditable()
-  static const int LOW_INT = 0x8DF3;
-
-  @DomName('WebGLRenderingContext.LUMINANCE')
-  @DocsEditable()
-  static const int LUMINANCE = 0x1909;
-
-  @DomName('WebGLRenderingContext.LUMINANCE_ALPHA')
-  @DocsEditable()
-  static const int LUMINANCE_ALPHA = 0x190A;
-
-  @DomName('WebGLRenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
-
-  @DomName('WebGLRenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE')
-  @DocsEditable()
-  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
-
-  @DomName('WebGLRenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS')
-  @DocsEditable()
-  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
-
-  @DomName('WebGLRenderingContext.MAX_RENDERBUFFER_SIZE')
-  @DocsEditable()
-  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
-
-  @DomName('WebGLRenderingContext.MAX_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
-
-  @DomName('WebGLRenderingContext.MAX_TEXTURE_SIZE')
-  @DocsEditable()
-  static const int MAX_TEXTURE_SIZE = 0x0D33;
-
-  @DomName('WebGLRenderingContext.MAX_VARYING_VECTORS')
-  @DocsEditable()
-  static const int MAX_VARYING_VECTORS = 0x8DFC;
-
-  @DomName('WebGLRenderingContext.MAX_VERTEX_ATTRIBS')
-  @DocsEditable()
-  static const int MAX_VERTEX_ATTRIBS = 0x8869;
-
-  @DomName('WebGLRenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
-
-  @DomName('WebGLRenderingContext.MAX_VERTEX_UNIFORM_VECTORS')
-  @DocsEditable()
-  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
-
-  @DomName('WebGLRenderingContext.MAX_VIEWPORT_DIMS')
-  @DocsEditable()
-  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
-
-  @DomName('WebGLRenderingContext.MEDIUM_FLOAT')
-  @DocsEditable()
-  static const int MEDIUM_FLOAT = 0x8DF1;
-
-  @DomName('WebGLRenderingContext.MEDIUM_INT')
-  @DocsEditable()
-  static const int MEDIUM_INT = 0x8DF4;
-
-  @DomName('WebGLRenderingContext.MIRRORED_REPEAT')
-  @DocsEditable()
-  static const int MIRRORED_REPEAT = 0x8370;
-
-  @DomName('WebGLRenderingContext.NEAREST')
-  @DocsEditable()
-  static const int NEAREST = 0x2600;
-
-  @DomName('WebGLRenderingContext.NEAREST_MIPMAP_LINEAR')
-  @DocsEditable()
-  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
-
-  @DomName('WebGLRenderingContext.NEAREST_MIPMAP_NEAREST')
-  @DocsEditable()
-  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
-
-  @DomName('WebGLRenderingContext.NEVER')
-  @DocsEditable()
-  static const int NEVER = 0x0200;
-
-  @DomName('WebGLRenderingContext.NICEST')
-  @DocsEditable()
-  static const int NICEST = 0x1102;
-
-  @DomName('WebGLRenderingContext.NONE')
-  @DocsEditable()
-  static const int NONE = 0;
-
-  @DomName('WebGLRenderingContext.NOTEQUAL')
-  @DocsEditable()
-  static const int NOTEQUAL = 0x0205;
-
-  @DomName('WebGLRenderingContext.NO_ERROR')
-  @DocsEditable()
-  static const int NO_ERROR = 0;
-
-  @DomName('WebGLRenderingContext.ONE')
-  @DocsEditable()
-  static const int ONE = 1;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_CONSTANT_ALPHA')
-  @DocsEditable()
-  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_CONSTANT_COLOR')
-  @DocsEditable()
-  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_DST_ALPHA')
-  @DocsEditable()
-  static const int ONE_MINUS_DST_ALPHA = 0x0305;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_DST_COLOR')
-  @DocsEditable()
-  static const int ONE_MINUS_DST_COLOR = 0x0307;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_SRC_ALPHA')
-  @DocsEditable()
-  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_SRC_COLOR')
-  @DocsEditable()
-  static const int ONE_MINUS_SRC_COLOR = 0x0301;
-
-  @DomName('WebGLRenderingContext.OUT_OF_MEMORY')
-  @DocsEditable()
-  static const int OUT_OF_MEMORY = 0x0505;
-
-  @DomName('WebGLRenderingContext.PACK_ALIGNMENT')
-  @DocsEditable()
-  static const int PACK_ALIGNMENT = 0x0D05;
-
-  @DomName('WebGLRenderingContext.POINTS')
-  @DocsEditable()
-  static const int POINTS = 0x0000;
-
-  @DomName('WebGLRenderingContext.POLYGON_OFFSET_FACTOR')
-  @DocsEditable()
-  static const int POLYGON_OFFSET_FACTOR = 0x8038;
-
-  @DomName('WebGLRenderingContext.POLYGON_OFFSET_FILL')
-  @DocsEditable()
-  static const int POLYGON_OFFSET_FILL = 0x8037;
-
-  @DomName('WebGLRenderingContext.POLYGON_OFFSET_UNITS')
-  @DocsEditable()
-  static const int POLYGON_OFFSET_UNITS = 0x2A00;
-
-  @DomName('WebGLRenderingContext.RED_BITS')
-  @DocsEditable()
-  static const int RED_BITS = 0x0D52;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER')
-  @DocsEditable()
-  static const int RENDERBUFFER = 0x8D41;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_ALPHA_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_BINDING')
-  @DocsEditable()
-  static const int RENDERBUFFER_BINDING = 0x8CA7;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_BLUE_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_DEPTH_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_GREEN_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_HEIGHT')
-  @DocsEditable()
-  static const int RENDERBUFFER_HEIGHT = 0x8D43;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_INTERNAL_FORMAT')
-  @DocsEditable()
-  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_RED_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_STENCIL_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_WIDTH')
-  @DocsEditable()
-  static const int RENDERBUFFER_WIDTH = 0x8D42;
-
-  @DomName('WebGLRenderingContext.RENDERER')
-  @DocsEditable()
-  static const int RENDERER = 0x1F01;
-
-  @DomName('WebGLRenderingContext.REPEAT')
-  @DocsEditable()
-  static const int REPEAT = 0x2901;
-
-  @DomName('WebGLRenderingContext.REPLACE')
-  @DocsEditable()
-  static const int REPLACE = 0x1E01;
-
-  @DomName('WebGLRenderingContext.RGB')
-  @DocsEditable()
-  static const int RGB = 0x1907;
-
-  @DomName('WebGLRenderingContext.RGB565')
-  @DocsEditable()
-  static const int RGB565 = 0x8D62;
-
-  @DomName('WebGLRenderingContext.RGB5_A1')
-  @DocsEditable()
-  static const int RGB5_A1 = 0x8057;
-
-  @DomName('WebGLRenderingContext.RGBA')
-  @DocsEditable()
-  static const int RGBA = 0x1908;
-
-  @DomName('WebGLRenderingContext.RGBA4')
-  @DocsEditable()
-  static const int RGBA4 = 0x8056;
-
-  @DomName('WebGLRenderingContext.SAMPLER_2D')
-  @DocsEditable()
-  static const int SAMPLER_2D = 0x8B5E;
-
-  @DomName('WebGLRenderingContext.SAMPLER_CUBE')
-  @DocsEditable()
-  static const int SAMPLER_CUBE = 0x8B60;
-
-  @DomName('WebGLRenderingContext.SAMPLES')
-  @DocsEditable()
-  static const int SAMPLES = 0x80A9;
-
-  @DomName('WebGLRenderingContext.SAMPLE_ALPHA_TO_COVERAGE')
-  @DocsEditable()
-  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
-
-  @DomName('WebGLRenderingContext.SAMPLE_BUFFERS')
-  @DocsEditable()
-  static const int SAMPLE_BUFFERS = 0x80A8;
-
-  @DomName('WebGLRenderingContext.SAMPLE_COVERAGE')
-  @DocsEditable()
-  static const int SAMPLE_COVERAGE = 0x80A0;
-
-  @DomName('WebGLRenderingContext.SAMPLE_COVERAGE_INVERT')
-  @DocsEditable()
-  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
-
-  @DomName('WebGLRenderingContext.SAMPLE_COVERAGE_VALUE')
-  @DocsEditable()
-  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
-
-  @DomName('WebGLRenderingContext.SCISSOR_BOX')
-  @DocsEditable()
-  static const int SCISSOR_BOX = 0x0C10;
-
-  @DomName('WebGLRenderingContext.SCISSOR_TEST')
-  @DocsEditable()
-  static const int SCISSOR_TEST = 0x0C11;
-
-  @DomName('WebGLRenderingContext.SHADER_TYPE')
-  @DocsEditable()
-  static const int SHADER_TYPE = 0x8B4F;
-
-  @DomName('WebGLRenderingContext.SHADING_LANGUAGE_VERSION')
-  @DocsEditable()
-  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
-
-  @DomName('WebGLRenderingContext.SHORT')
-  @DocsEditable()
-  static const int SHORT = 0x1402;
-
-  @DomName('WebGLRenderingContext.SRC_ALPHA')
-  @DocsEditable()
-  static const int SRC_ALPHA = 0x0302;
-
-  @DomName('WebGLRenderingContext.SRC_ALPHA_SATURATE')
-  @DocsEditable()
-  static const int SRC_ALPHA_SATURATE = 0x0308;
-
-  @DomName('WebGLRenderingContext.SRC_COLOR')
-  @DocsEditable()
-  static const int SRC_COLOR = 0x0300;
-
-  @DomName('WebGLRenderingContext.STATIC_DRAW')
-  @DocsEditable()
-  static const int STATIC_DRAW = 0x88E4;
-
-  @DomName('WebGLRenderingContext.STENCIL_ATTACHMENT')
-  @DocsEditable()
-  static const int STENCIL_ATTACHMENT = 0x8D20;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_FAIL')
-  @DocsEditable()
-  static const int STENCIL_BACK_FAIL = 0x8801;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_FUNC')
-  @DocsEditable()
-  static const int STENCIL_BACK_FUNC = 0x8800;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL')
-  @DocsEditable()
-  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_PASS_DEPTH_PASS')
-  @DocsEditable()
-  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_REF')
-  @DocsEditable()
-  static const int STENCIL_BACK_REF = 0x8CA3;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_VALUE_MASK')
-  @DocsEditable()
-  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_WRITEMASK')
-  @DocsEditable()
-  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
-
-  @DomName('WebGLRenderingContext.STENCIL_BITS')
-  @DocsEditable()
-  static const int STENCIL_BITS = 0x0D57;
-
-  @DomName('WebGLRenderingContext.STENCIL_BUFFER_BIT')
-  @DocsEditable()
-  static const int STENCIL_BUFFER_BIT = 0x00000400;
-
-  @DomName('WebGLRenderingContext.STENCIL_CLEAR_VALUE')
-  @DocsEditable()
-  static const int STENCIL_CLEAR_VALUE = 0x0B91;
-
-  @DomName('WebGLRenderingContext.STENCIL_FAIL')
-  @DocsEditable()
-  static const int STENCIL_FAIL = 0x0B94;
-
-  @DomName('WebGLRenderingContext.STENCIL_FUNC')
-  @DocsEditable()
-  static const int STENCIL_FUNC = 0x0B92;
-
-  @DomName('WebGLRenderingContext.STENCIL_INDEX')
-  @DocsEditable()
-  static const int STENCIL_INDEX = 0x1901;
-
-  @DomName('WebGLRenderingContext.STENCIL_INDEX8')
-  @DocsEditable()
-  static const int STENCIL_INDEX8 = 0x8D48;
-
-  @DomName('WebGLRenderingContext.STENCIL_PASS_DEPTH_FAIL')
-  @DocsEditable()
-  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
-
-  @DomName('WebGLRenderingContext.STENCIL_PASS_DEPTH_PASS')
-  @DocsEditable()
-  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
-
-  @DomName('WebGLRenderingContext.STENCIL_REF')
-  @DocsEditable()
-  static const int STENCIL_REF = 0x0B97;
-
-  @DomName('WebGLRenderingContext.STENCIL_TEST')
-  @DocsEditable()
-  static const int STENCIL_TEST = 0x0B90;
-
-  @DomName('WebGLRenderingContext.STENCIL_VALUE_MASK')
-  @DocsEditable()
-  static const int STENCIL_VALUE_MASK = 0x0B93;
-
-  @DomName('WebGLRenderingContext.STENCIL_WRITEMASK')
-  @DocsEditable()
-  static const int STENCIL_WRITEMASK = 0x0B98;
-
-  @DomName('WebGLRenderingContext.STREAM_DRAW')
-  @DocsEditable()
-  static const int STREAM_DRAW = 0x88E0;
-
-  @DomName('WebGLRenderingContext.SUBPIXEL_BITS')
-  @DocsEditable()
-  static const int SUBPIXEL_BITS = 0x0D50;
-
-  @DomName('WebGLRenderingContext.TEXTURE')
-  @DocsEditable()
-  static const int TEXTURE = 0x1702;
-
-  @DomName('WebGLRenderingContext.TEXTURE0')
-  @DocsEditable()
-  static const int TEXTURE0 = 0x84C0;
-
-  @DomName('WebGLRenderingContext.TEXTURE1')
-  @DocsEditable()
-  static const int TEXTURE1 = 0x84C1;
-
-  @DomName('WebGLRenderingContext.TEXTURE10')
-  @DocsEditable()
-  static const int TEXTURE10 = 0x84CA;
-
-  @DomName('WebGLRenderingContext.TEXTURE11')
-  @DocsEditable()
-  static const int TEXTURE11 = 0x84CB;
-
-  @DomName('WebGLRenderingContext.TEXTURE12')
-  @DocsEditable()
-  static const int TEXTURE12 = 0x84CC;
-
-  @DomName('WebGLRenderingContext.TEXTURE13')
-  @DocsEditable()
-  static const int TEXTURE13 = 0x84CD;
-
-  @DomName('WebGLRenderingContext.TEXTURE14')
-  @DocsEditable()
-  static const int TEXTURE14 = 0x84CE;
-
-  @DomName('WebGLRenderingContext.TEXTURE15')
-  @DocsEditable()
-  static const int TEXTURE15 = 0x84CF;
-
-  @DomName('WebGLRenderingContext.TEXTURE16')
-  @DocsEditable()
-  static const int TEXTURE16 = 0x84D0;
-
-  @DomName('WebGLRenderingContext.TEXTURE17')
-  @DocsEditable()
-  static const int TEXTURE17 = 0x84D1;
-
-  @DomName('WebGLRenderingContext.TEXTURE18')
-  @DocsEditable()
-  static const int TEXTURE18 = 0x84D2;
-
-  @DomName('WebGLRenderingContext.TEXTURE19')
-  @DocsEditable()
-  static const int TEXTURE19 = 0x84D3;
-
-  @DomName('WebGLRenderingContext.TEXTURE2')
-  @DocsEditable()
-  static const int TEXTURE2 = 0x84C2;
-
-  @DomName('WebGLRenderingContext.TEXTURE20')
-  @DocsEditable()
-  static const int TEXTURE20 = 0x84D4;
-
-  @DomName('WebGLRenderingContext.TEXTURE21')
-  @DocsEditable()
-  static const int TEXTURE21 = 0x84D5;
-
-  @DomName('WebGLRenderingContext.TEXTURE22')
-  @DocsEditable()
-  static const int TEXTURE22 = 0x84D6;
-
-  @DomName('WebGLRenderingContext.TEXTURE23')
-  @DocsEditable()
-  static const int TEXTURE23 = 0x84D7;
-
-  @DomName('WebGLRenderingContext.TEXTURE24')
-  @DocsEditable()
-  static const int TEXTURE24 = 0x84D8;
-
-  @DomName('WebGLRenderingContext.TEXTURE25')
-  @DocsEditable()
-  static const int TEXTURE25 = 0x84D9;
-
-  @DomName('WebGLRenderingContext.TEXTURE26')
-  @DocsEditable()
-  static const int TEXTURE26 = 0x84DA;
-
-  @DomName('WebGLRenderingContext.TEXTURE27')
-  @DocsEditable()
-  static const int TEXTURE27 = 0x84DB;
-
-  @DomName('WebGLRenderingContext.TEXTURE28')
-  @DocsEditable()
-  static const int TEXTURE28 = 0x84DC;
-
-  @DomName('WebGLRenderingContext.TEXTURE29')
-  @DocsEditable()
-  static const int TEXTURE29 = 0x84DD;
-
-  @DomName('WebGLRenderingContext.TEXTURE3')
-  @DocsEditable()
-  static const int TEXTURE3 = 0x84C3;
-
-  @DomName('WebGLRenderingContext.TEXTURE30')
-  @DocsEditable()
-  static const int TEXTURE30 = 0x84DE;
-
-  @DomName('WebGLRenderingContext.TEXTURE31')
-  @DocsEditable()
-  static const int TEXTURE31 = 0x84DF;
-
-  @DomName('WebGLRenderingContext.TEXTURE4')
-  @DocsEditable()
-  static const int TEXTURE4 = 0x84C4;
-
-  @DomName('WebGLRenderingContext.TEXTURE5')
-  @DocsEditable()
-  static const int TEXTURE5 = 0x84C5;
-
-  @DomName('WebGLRenderingContext.TEXTURE6')
-  @DocsEditable()
-  static const int TEXTURE6 = 0x84C6;
-
-  @DomName('WebGLRenderingContext.TEXTURE7')
-  @DocsEditable()
-  static const int TEXTURE7 = 0x84C7;
-
-  @DomName('WebGLRenderingContext.TEXTURE8')
-  @DocsEditable()
-  static const int TEXTURE8 = 0x84C8;
-
-  @DomName('WebGLRenderingContext.TEXTURE9')
-  @DocsEditable()
-  static const int TEXTURE9 = 0x84C9;
-
-  @DomName('WebGLRenderingContext.TEXTURE_2D')
-  @DocsEditable()
-  static const int TEXTURE_2D = 0x0DE1;
-
-  @DomName('WebGLRenderingContext.TEXTURE_BINDING_2D')
-  @DocsEditable()
-  static const int TEXTURE_BINDING_2D = 0x8069;
-
-  @DomName('WebGLRenderingContext.TEXTURE_BINDING_CUBE_MAP')
-  @DocsEditable()
-  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP = 0x8513;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
-
-  @DomName('WebGLRenderingContext.TEXTURE_MAG_FILTER')
-  @DocsEditable()
-  static const int TEXTURE_MAG_FILTER = 0x2800;
-
-  @DomName('WebGLRenderingContext.TEXTURE_MIN_FILTER')
-  @DocsEditable()
-  static const int TEXTURE_MIN_FILTER = 0x2801;
-
-  @DomName('WebGLRenderingContext.TEXTURE_WRAP_S')
-  @DocsEditable()
-  static const int TEXTURE_WRAP_S = 0x2802;
-
-  @DomName('WebGLRenderingContext.TEXTURE_WRAP_T')
-  @DocsEditable()
-  static const int TEXTURE_WRAP_T = 0x2803;
-
-  @DomName('WebGLRenderingContext.TRIANGLES')
-  @DocsEditable()
-  static const int TRIANGLES = 0x0004;
-
-  @DomName('WebGLRenderingContext.TRIANGLE_FAN')
-  @DocsEditable()
-  static const int TRIANGLE_FAN = 0x0006;
-
-  @DomName('WebGLRenderingContext.TRIANGLE_STRIP')
-  @DocsEditable()
-  static const int TRIANGLE_STRIP = 0x0005;
-
-  @DomName('WebGLRenderingContext.UNPACK_ALIGNMENT')
-  @DocsEditable()
-  static const int UNPACK_ALIGNMENT = 0x0CF5;
-
-  @DomName('WebGLRenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL')
-  @DocsEditable()
-  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
-
-  @DomName('WebGLRenderingContext.UNPACK_FLIP_Y_WEBGL')
-  @DocsEditable()
-  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
-
-  @DomName('WebGLRenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL')
-  @DocsEditable()
-  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_BYTE')
-  @DocsEditable()
-  static const int UNSIGNED_BYTE = 0x1401;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_INT')
-  @DocsEditable()
-  static const int UNSIGNED_INT = 0x1405;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT = 0x1403;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT_4_4_4_4')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT_5_5_5_1')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT_5_6_5')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
-
-  @DomName('WebGLRenderingContext.VALIDATE_STATUS')
-  @DocsEditable()
-  static const int VALIDATE_STATUS = 0x8B83;
-
-  @DomName('WebGLRenderingContext.VENDOR')
-  @DocsEditable()
-  static const int VENDOR = 0x1F00;
-
-  @DomName('WebGLRenderingContext.VERSION')
-  @DocsEditable()
-  static const int VERSION = 0x1F02;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_POINTER')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_SIZE')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_TYPE')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
-
-  @DomName('WebGLRenderingContext.VERTEX_SHADER')
-  @DocsEditable()
-  static const int VERTEX_SHADER = 0x8B31;
-
-  @DomName('WebGLRenderingContext.VIEWPORT')
-  @DocsEditable()
-  static const int VIEWPORT = 0x0BA2;
-
-  @DomName('WebGLRenderingContext.ZERO')
-  @DocsEditable()
-  static const int ZERO = 0;
+  @Experimental() // untriaged
+  final CanvasElement canvas;
 
   @DomName('WebGLRenderingContext.drawingBufferHeight')
   @DocsEditable()
@@ -2711,7 +1587,7 @@
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
   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]) {
-    if (pixels != null && type != null && format != null && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null)) {
+    if (pixels != null && type != null && format != null && (border_OR_canvas_OR_image_OR_pixels_OR_video is int)) {
       _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
@@ -2720,15 +1596,15 @@
       _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
       return;
     }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement) && format == null && type == null && pixels == null) {
       _texImage2D_3(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) && format == null && type == null && pixels == null) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement) && format == null && type == null && pixels == null) {
       _texImage2D_4(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) && format == null && type == null && pixels == null) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement) && format == null && type == null && pixels == null) {
       _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
@@ -2881,7 +1757,7 @@
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
   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]) {
-    if (pixels != null && type != null && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null)) {
+    if (pixels != null && type != null && (canvas_OR_format_OR_image_OR_pixels_OR_video is int)) {
       _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
@@ -2890,15 +1766,15 @@
       _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
       return;
     }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement) && type == null && pixels == null) {
       _texSubImage2D_3(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) && type == null && pixels == null) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement) && type == null && pixels == null) {
       _texSubImage2D_4(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) && type == null && pixels == null) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement) && type == null && pixels == null) {
       _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
@@ -3205,6 +2081,1805 @@
 
 
 @DocsEditable()
+@DomName('WebGLRenderingContextBase')
+@Experimental() // untriaged
+abstract class RenderingContextBase extends Interceptor {
+  // To suppress missing implicit constructor warnings.
+  factory RenderingContextBase._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WebGLRenderingContextBase.ACTIVE_ATTRIBUTES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_ATTRIBUTES = 0x8B89;
+
+  @DomName('WebGLRenderingContextBase.ACTIVE_TEXTURE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_TEXTURE = 0x84E0;
+
+  @DomName('WebGLRenderingContextBase.ACTIVE_UNIFORMS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_UNIFORMS = 0x8B86;
+
+  @DomName('WebGLRenderingContextBase.ALIASED_LINE_WIDTH_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
+
+  @DomName('WebGLRenderingContextBase.ALIASED_POINT_SIZE_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
+
+  @DomName('WebGLRenderingContextBase.ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALPHA = 0x1906;
+
+  @DomName('WebGLRenderingContextBase.ALPHA_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALPHA_BITS = 0x0D55;
+
+  @DomName('WebGLRenderingContextBase.ALWAYS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALWAYS = 0x0207;
+
+  @DomName('WebGLRenderingContextBase.ARRAY_BUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ARRAY_BUFFER = 0x8892;
+
+  @DomName('WebGLRenderingContextBase.ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ARRAY_BUFFER_BINDING = 0x8894;
+
+  @DomName('WebGLRenderingContextBase.ATTACHED_SHADERS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ATTACHED_SHADERS = 0x8B85;
+
+  @DomName('WebGLRenderingContextBase.BACK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BACK = 0x0405;
+
+  @DomName('WebGLRenderingContextBase.BLEND')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND = 0x0BE2;
+
+  @DomName('WebGLRenderingContextBase.BLEND_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_COLOR = 0x8005;
+
+  @DomName('WebGLRenderingContextBase.BLEND_DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_DST_ALPHA = 0x80CA;
+
+  @DomName('WebGLRenderingContextBase.BLEND_DST_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_DST_RGB = 0x80C8;
+
+  @DomName('WebGLRenderingContextBase.BLEND_EQUATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION = 0x8009;
+
+  @DomName('WebGLRenderingContextBase.BLEND_EQUATION_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION_ALPHA = 0x883D;
+
+  @DomName('WebGLRenderingContextBase.BLEND_EQUATION_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION_RGB = 0x8009;
+
+  @DomName('WebGLRenderingContextBase.BLEND_SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_SRC_ALPHA = 0x80CB;
+
+  @DomName('WebGLRenderingContextBase.BLEND_SRC_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_SRC_RGB = 0x80C9;
+
+  @DomName('WebGLRenderingContextBase.BLUE_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLUE_BITS = 0x0D54;
+
+  @DomName('WebGLRenderingContextBase.BOOL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL = 0x8B56;
+
+  @DomName('WebGLRenderingContextBase.BOOL_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC2 = 0x8B57;
+
+  @DomName('WebGLRenderingContextBase.BOOL_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC3 = 0x8B58;
+
+  @DomName('WebGLRenderingContextBase.BOOL_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC4 = 0x8B59;
+
+  @DomName('WebGLRenderingContextBase.BROWSER_DEFAULT_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
+
+  @DomName('WebGLRenderingContextBase.BUFFER_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BUFFER_SIZE = 0x8764;
+
+  @DomName('WebGLRenderingContextBase.BUFFER_USAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BUFFER_USAGE = 0x8765;
+
+  @DomName('WebGLRenderingContextBase.BYTE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BYTE = 0x1400;
+
+  @DomName('WebGLRenderingContextBase.CCW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CCW = 0x0901;
+
+  @DomName('WebGLRenderingContextBase.CLAMP_TO_EDGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CLAMP_TO_EDGE = 0x812F;
+
+  @DomName('WebGLRenderingContextBase.COLOR_ATTACHMENT0')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_ATTACHMENT0 = 0x8CE0;
+
+  @DomName('WebGLRenderingContextBase.COLOR_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_BUFFER_BIT = 0x00004000;
+
+  @DomName('WebGLRenderingContextBase.COLOR_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_CLEAR_VALUE = 0x0C22;
+
+  @DomName('WebGLRenderingContextBase.COLOR_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_WRITEMASK = 0x0C23;
+
+  @DomName('WebGLRenderingContextBase.COMPILE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPILE_STATUS = 0x8B81;
+
+  @DomName('WebGLRenderingContextBase.COMPRESSED_TEXTURE_FORMATS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
+
+  @DomName('WebGLRenderingContextBase.CONSTANT_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONSTANT_ALPHA = 0x8003;
+
+  @DomName('WebGLRenderingContextBase.CONSTANT_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONSTANT_COLOR = 0x8001;
+
+  @DomName('WebGLRenderingContextBase.CONTEXT_LOST_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONTEXT_LOST_WEBGL = 0x9242;
+
+  @DomName('WebGLRenderingContextBase.CULL_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CULL_FACE = 0x0B44;
+
+  @DomName('WebGLRenderingContextBase.CULL_FACE_MODE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CULL_FACE_MODE = 0x0B45;
+
+  @DomName('WebGLRenderingContextBase.CURRENT_PROGRAM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CURRENT_PROGRAM = 0x8B8D;
+
+  @DomName('WebGLRenderingContextBase.CURRENT_VERTEX_ATTRIB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
+
+  @DomName('WebGLRenderingContextBase.CW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CW = 0x0900;
+
+  @DomName('WebGLRenderingContextBase.DECR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DECR = 0x1E03;
+
+  @DomName('WebGLRenderingContextBase.DECR_WRAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DECR_WRAP = 0x8508;
+
+  @DomName('WebGLRenderingContextBase.DELETE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DELETE_STATUS = 0x8B80;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_ATTACHMENT = 0x8D00;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_BITS = 0x0D56;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_BUFFER_BIT = 0x00000100;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_CLEAR_VALUE = 0x0B73;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_COMPONENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_COMPONENT = 0x1902;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_COMPONENT16')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_COMPONENT16 = 0x81A5;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_FUNC = 0x0B74;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_RANGE = 0x0B70;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_STENCIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_STENCIL = 0x84F9;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_STENCIL_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_TEST = 0x0B71;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_WRITEMASK = 0x0B72;
+
+  @DomName('WebGLRenderingContextBase.DITHER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DITHER = 0x0BD0;
+
+  @DomName('WebGLRenderingContextBase.DONT_CARE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DONT_CARE = 0x1100;
+
+  @DomName('WebGLRenderingContextBase.DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DST_ALPHA = 0x0304;
+
+  @DomName('WebGLRenderingContextBase.DST_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DST_COLOR = 0x0306;
+
+  @DomName('WebGLRenderingContextBase.DYNAMIC_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DYNAMIC_DRAW = 0x88E8;
+
+  @DomName('WebGLRenderingContextBase.ELEMENT_ARRAY_BUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
+
+  @DomName('WebGLRenderingContextBase.ELEMENT_ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
+
+  @DomName('WebGLRenderingContextBase.EQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int EQUAL = 0x0202;
+
+  @DomName('WebGLRenderingContextBase.FASTEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FASTEST = 0x1101;
+
+  @DomName('WebGLRenderingContextBase.FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT = 0x1406;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_MAT2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT2 = 0x8B5A;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_MAT3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT3 = 0x8B5B;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_MAT4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT4 = 0x8B5C;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC2 = 0x8B50;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC3 = 0x8B51;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC4 = 0x8B52;
+
+  @DomName('WebGLRenderingContextBase.FRAGMENT_SHADER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAGMENT_SHADER = 0x8B30;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER = 0x8D40;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_BINDING = 0x8CA6;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_COMPLETE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_INCOMPLETE_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_INCOMPLETE_DIMENSIONS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_UNSUPPORTED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
+
+  @DomName('WebGLRenderingContextBase.FRONT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT = 0x0404;
+
+  @DomName('WebGLRenderingContextBase.FRONT_AND_BACK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT_AND_BACK = 0x0408;
+
+  @DomName('WebGLRenderingContextBase.FRONT_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT_FACE = 0x0B46;
+
+  @DomName('WebGLRenderingContextBase.FUNC_ADD')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_ADD = 0x8006;
+
+  @DomName('WebGLRenderingContextBase.FUNC_REVERSE_SUBTRACT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
+
+  @DomName('WebGLRenderingContextBase.FUNC_SUBTRACT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_SUBTRACT = 0x800A;
+
+  @DomName('WebGLRenderingContextBase.GENERATE_MIPMAP_HINT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GENERATE_MIPMAP_HINT = 0x8192;
+
+  @DomName('WebGLRenderingContextBase.GEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GEQUAL = 0x0206;
+
+  @DomName('WebGLRenderingContextBase.GREATER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GREATER = 0x0204;
+
+  @DomName('WebGLRenderingContextBase.GREEN_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GREEN_BITS = 0x0D53;
+
+  @DomName('WebGLRenderingContextBase.HIGH_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int HIGH_FLOAT = 0x8DF2;
+
+  @DomName('WebGLRenderingContextBase.HIGH_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int HIGH_INT = 0x8DF5;
+
+  @DomName('WebGLRenderingContextBase.IMPLEMENTATION_COLOR_READ_FORMAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
+
+  @DomName('WebGLRenderingContextBase.IMPLEMENTATION_COLOR_READ_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;
+
+  @DomName('WebGLRenderingContextBase.INCR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INCR = 0x1E02;
+
+  @DomName('WebGLRenderingContextBase.INCR_WRAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INCR_WRAP = 0x8507;
+
+  @DomName('WebGLRenderingContextBase.INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT = 0x1404;
+
+  @DomName('WebGLRenderingContextBase.INT_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC2 = 0x8B53;
+
+  @DomName('WebGLRenderingContextBase.INT_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC3 = 0x8B54;
+
+  @DomName('WebGLRenderingContextBase.INT_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC4 = 0x8B55;
+
+  @DomName('WebGLRenderingContextBase.INVALID_ENUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_ENUM = 0x0500;
+
+  @DomName('WebGLRenderingContextBase.INVALID_FRAMEBUFFER_OPERATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
+
+  @DomName('WebGLRenderingContextBase.INVALID_OPERATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_OPERATION = 0x0502;
+
+  @DomName('WebGLRenderingContextBase.INVALID_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_VALUE = 0x0501;
+
+  @DomName('WebGLRenderingContextBase.INVERT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVERT = 0x150A;
+
+  @DomName('WebGLRenderingContextBase.KEEP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int KEEP = 0x1E00;
+
+  @DomName('WebGLRenderingContextBase.LEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LEQUAL = 0x0203;
+
+  @DomName('WebGLRenderingContextBase.LESS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LESS = 0x0201;
+
+  @DomName('WebGLRenderingContextBase.LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR = 0x2601;
+
+  @DomName('WebGLRenderingContextBase.LINEAR_MIPMAP_LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
+
+  @DomName('WebGLRenderingContextBase.LINEAR_MIPMAP_NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
+
+  @DomName('WebGLRenderingContextBase.LINES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINES = 0x0001;
+
+  @DomName('WebGLRenderingContextBase.LINE_LOOP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_LOOP = 0x0002;
+
+  @DomName('WebGLRenderingContextBase.LINE_STRIP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_STRIP = 0x0003;
+
+  @DomName('WebGLRenderingContextBase.LINE_WIDTH')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_WIDTH = 0x0B21;
+
+  @DomName('WebGLRenderingContextBase.LINK_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINK_STATUS = 0x8B82;
+
+  @DomName('WebGLRenderingContextBase.LOW_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LOW_FLOAT = 0x8DF0;
+
+  @DomName('WebGLRenderingContextBase.LOW_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LOW_INT = 0x8DF3;
+
+  @DomName('WebGLRenderingContextBase.LUMINANCE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LUMINANCE = 0x1909;
+
+  @DomName('WebGLRenderingContextBase.LUMINANCE_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LUMINANCE_ALPHA = 0x190A;
+
+  @DomName('WebGLRenderingContextBase.MAX_COMBINED_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
+
+  @DomName('WebGLRenderingContextBase.MAX_CUBE_MAP_TEXTURE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
+
+  @DomName('WebGLRenderingContextBase.MAX_FRAGMENT_UNIFORM_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
+
+  @DomName('WebGLRenderingContextBase.MAX_RENDERBUFFER_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
+
+  @DomName('WebGLRenderingContextBase.MAX_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
+
+  @DomName('WebGLRenderingContextBase.MAX_TEXTURE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_TEXTURE_SIZE = 0x0D33;
+
+  @DomName('WebGLRenderingContextBase.MAX_VARYING_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VARYING_VECTORS = 0x8DFC;
+
+  @DomName('WebGLRenderingContextBase.MAX_VERTEX_ATTRIBS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_ATTRIBS = 0x8869;
+
+  @DomName('WebGLRenderingContextBase.MAX_VERTEX_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
+
+  @DomName('WebGLRenderingContextBase.MAX_VERTEX_UNIFORM_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
+
+  @DomName('WebGLRenderingContextBase.MAX_VIEWPORT_DIMS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
+
+  @DomName('WebGLRenderingContextBase.MEDIUM_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MEDIUM_FLOAT = 0x8DF1;
+
+  @DomName('WebGLRenderingContextBase.MEDIUM_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MEDIUM_INT = 0x8DF4;
+
+  @DomName('WebGLRenderingContextBase.MIRRORED_REPEAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MIRRORED_REPEAT = 0x8370;
+
+  @DomName('WebGLRenderingContextBase.NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST = 0x2600;
+
+  @DomName('WebGLRenderingContextBase.NEAREST_MIPMAP_LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
+
+  @DomName('WebGLRenderingContextBase.NEAREST_MIPMAP_NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
+
+  @DomName('WebGLRenderingContextBase.NEVER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEVER = 0x0200;
+
+  @DomName('WebGLRenderingContextBase.NICEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NICEST = 0x1102;
+
+  @DomName('WebGLRenderingContextBase.NONE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NONE = 0;
+
+  @DomName('WebGLRenderingContextBase.NOTEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NOTEQUAL = 0x0205;
+
+  @DomName('WebGLRenderingContextBase.NO_ERROR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NO_ERROR = 0;
+
+  @DomName('WebGLRenderingContextBase.ONE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE = 1;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_CONSTANT_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_CONSTANT_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_DST_ALPHA = 0x0305;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_DST_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_DST_COLOR = 0x0307;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_SRC_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_SRC_COLOR = 0x0301;
+
+  @DomName('WebGLRenderingContextBase.OUT_OF_MEMORY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int OUT_OF_MEMORY = 0x0505;
+
+  @DomName('WebGLRenderingContextBase.PACK_ALIGNMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int PACK_ALIGNMENT = 0x0D05;
+
+  @DomName('WebGLRenderingContextBase.POINTS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POINTS = 0x0000;
+
+  @DomName('WebGLRenderingContextBase.POLYGON_OFFSET_FACTOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_FACTOR = 0x8038;
+
+  @DomName('WebGLRenderingContextBase.POLYGON_OFFSET_FILL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_FILL = 0x8037;
+
+  @DomName('WebGLRenderingContextBase.POLYGON_OFFSET_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_UNITS = 0x2A00;
+
+  @DomName('WebGLRenderingContextBase.RED_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RED_BITS = 0x0D52;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER = 0x8D41;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_ALPHA_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_BINDING = 0x8CA7;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_BLUE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_DEPTH_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_GREEN_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_HEIGHT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_HEIGHT = 0x8D43;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_INTERNAL_FORMAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_RED_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_STENCIL_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_WIDTH')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_WIDTH = 0x8D42;
+
+  @DomName('WebGLRenderingContextBase.RENDERER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERER = 0x1F01;
+
+  @DomName('WebGLRenderingContextBase.REPEAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int REPEAT = 0x2901;
+
+  @DomName('WebGLRenderingContextBase.REPLACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int REPLACE = 0x1E01;
+
+  @DomName('WebGLRenderingContextBase.RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB = 0x1907;
+
+  @DomName('WebGLRenderingContextBase.RGB565')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB565 = 0x8D62;
+
+  @DomName('WebGLRenderingContextBase.RGB5_A1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB5_A1 = 0x8057;
+
+  @DomName('WebGLRenderingContextBase.RGBA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGBA = 0x1908;
+
+  @DomName('WebGLRenderingContextBase.RGBA4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGBA4 = 0x8056;
+
+  @DomName('WebGLRenderingContextBase.SAMPLER_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLER_2D = 0x8B5E;
+
+  @DomName('WebGLRenderingContextBase.SAMPLER_CUBE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLER_CUBE = 0x8B60;
+
+  @DomName('WebGLRenderingContextBase.SAMPLES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLES = 0x80A9;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_ALPHA_TO_COVERAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_BUFFERS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_BUFFERS = 0x80A8;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_COVERAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE = 0x80A0;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_COVERAGE_INVERT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_COVERAGE_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
+
+  @DomName('WebGLRenderingContextBase.SCISSOR_BOX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SCISSOR_BOX = 0x0C10;
+
+  @DomName('WebGLRenderingContextBase.SCISSOR_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SCISSOR_TEST = 0x0C11;
+
+  @DomName('WebGLRenderingContextBase.SHADER_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHADER_TYPE = 0x8B4F;
+
+  @DomName('WebGLRenderingContextBase.SHADING_LANGUAGE_VERSION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
+
+  @DomName('WebGLRenderingContextBase.SHORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHORT = 0x1402;
+
+  @DomName('WebGLRenderingContextBase.SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_ALPHA = 0x0302;
+
+  @DomName('WebGLRenderingContextBase.SRC_ALPHA_SATURATE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_ALPHA_SATURATE = 0x0308;
+
+  @DomName('WebGLRenderingContextBase.SRC_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_COLOR = 0x0300;
+
+  @DomName('WebGLRenderingContextBase.STATIC_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STATIC_DRAW = 0x88E4;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_ATTACHMENT = 0x8D20;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_FAIL = 0x8801;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_FUNC = 0x8800;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_PASS_DEPTH_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_PASS_DEPTH_PASS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_REF')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_REF = 0x8CA3;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_VALUE_MASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BITS = 0x0D57;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BUFFER_BIT = 0x00000400;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_CLEAR_VALUE = 0x0B91;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_FAIL = 0x0B94;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_FUNC = 0x0B92;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_INDEX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_INDEX = 0x1901;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_INDEX8')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_INDEX8 = 0x8D48;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_PASS_DEPTH_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_PASS_DEPTH_PASS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_REF')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_REF = 0x0B97;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_TEST = 0x0B90;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_VALUE_MASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_VALUE_MASK = 0x0B93;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_WRITEMASK = 0x0B98;
+
+  @DomName('WebGLRenderingContextBase.STREAM_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STREAM_DRAW = 0x88E0;
+
+  @DomName('WebGLRenderingContextBase.SUBPIXEL_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SUBPIXEL_BITS = 0x0D50;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE = 0x1702;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE0')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE0 = 0x84C0;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE1 = 0x84C1;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE10')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE10 = 0x84CA;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE11')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE11 = 0x84CB;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE12')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE12 = 0x84CC;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE13')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE13 = 0x84CD;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE14')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE14 = 0x84CE;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE15')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE15 = 0x84CF;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE16')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE16 = 0x84D0;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE17')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE17 = 0x84D1;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE18')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE18 = 0x84D2;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE19')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE19 = 0x84D3;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE2 = 0x84C2;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE20')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE20 = 0x84D4;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE21')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE21 = 0x84D5;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE22')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE22 = 0x84D6;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE23')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE23 = 0x84D7;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE24')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE24 = 0x84D8;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE25')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE25 = 0x84D9;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE26')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE26 = 0x84DA;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE27')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE27 = 0x84DB;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE28')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE28 = 0x84DC;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE29')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE29 = 0x84DD;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE3 = 0x84C3;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE30')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE30 = 0x84DE;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE31')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE31 = 0x84DF;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE4 = 0x84C4;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE5')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE5 = 0x84C5;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE6')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE6 = 0x84C6;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE7')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE7 = 0x84C7;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE8')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE8 = 0x84C8;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE9')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE9 = 0x84C9;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_2D = 0x0DE1;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_BINDING_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_BINDING_2D = 0x8069;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_BINDING_CUBE_MAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP = 0x8513;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_X')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_Y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_Z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_X')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_Y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_Z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_MAG_FILTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_MAG_FILTER = 0x2800;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_MIN_FILTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_MIN_FILTER = 0x2801;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_WRAP_S')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_WRAP_S = 0x2802;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_WRAP_T')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_WRAP_T = 0x2803;
+
+  @DomName('WebGLRenderingContextBase.TRIANGLES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLES = 0x0004;
+
+  @DomName('WebGLRenderingContextBase.TRIANGLE_FAN')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLE_FAN = 0x0006;
+
+  @DomName('WebGLRenderingContextBase.TRIANGLE_STRIP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLE_STRIP = 0x0005;
+
+  @DomName('WebGLRenderingContextBase.UNPACK_ALIGNMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_ALIGNMENT = 0x0CF5;
+
+  @DomName('WebGLRenderingContextBase.UNPACK_COLORSPACE_CONVERSION_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
+
+  @DomName('WebGLRenderingContextBase.UNPACK_FLIP_Y_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
+
+  @DomName('WebGLRenderingContextBase.UNPACK_PREMULTIPLY_ALPHA_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_BYTE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_BYTE = 0x1401;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_INT = 0x1405;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_SHORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT = 0x1403;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_SHORT_4_4_4_4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_SHORT_5_5_5_1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_SHORT_5_6_5')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
+
+  @DomName('WebGLRenderingContextBase.VALIDATE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VALIDATE_STATUS = 0x8B83;
+
+  @DomName('WebGLRenderingContextBase.VENDOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VENDOR = 0x1F00;
+
+  @DomName('WebGLRenderingContextBase.VERSION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERSION = 0x1F02;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_ENABLED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_NORMALIZED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_POINTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_STRIDE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_SHADER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_SHADER = 0x8B31;
+
+  @DomName('WebGLRenderingContextBase.VIEWPORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VIEWPORT = 0x0BA2;
+
+  @DomName('WebGLRenderingContextBase.ZERO')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ZERO = 0;
+
+  final CanvasElement canvas;
+
+  final int drawingBufferHeight;
+
+  final int drawingBufferWidth;
+
+  void activeTexture(int texture);
+
+  void attachShader(Program program, Shader shader);
+
+  void bindAttribLocation(Program program, int index, String name);
+
+  void bindBuffer(int target, Buffer buffer);
+
+  void bindFramebuffer(int target, Framebuffer framebuffer);
+
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer);
+
+  void bindTexture(int target, Texture texture);
+
+  void blendColor(num red, num green, num blue, num alpha);
+
+  void blendEquation(int mode);
+
+  void blendEquationSeparate(int modeRGB, int modeAlpha);
+
+  void blendFunc(int sfactor, int dfactor);
+
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha);
+
+  void bufferByteData(int target, ByteBuffer data, int usage);
+
+  void bufferData(int target, data_OR_size, int usage);
+
+  void bufferDataTyped(int target, TypedData data, int usage);
+
+  void bufferSubByteData(int target, int offset, ByteBuffer data);
+
+  void bufferSubData(int target, int offset, data);
+
+  void bufferSubDataTyped(int target, int offset, TypedData data);
+
+  int checkFramebufferStatus(int target);
+
+  void clear(int mask);
+
+  void clearColor(num red, num green, num blue, num alpha);
+
+  void clearDepth(num depth);
+
+  void clearStencil(int s);
+
+  void colorMask(bool red, bool green, bool blue, bool alpha);
+
+  void compileShader(Shader shader);
+
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data);
+
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data);
+
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border);
+
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height);
+
+  Buffer createBuffer();
+
+  Framebuffer createFramebuffer();
+
+  Program createProgram();
+
+  Renderbuffer createRenderbuffer();
+
+  Shader createShader(int type);
+
+  Texture createTexture();
+
+  void cullFace(int mode);
+
+  void deleteBuffer(Buffer buffer);
+
+  void deleteFramebuffer(Framebuffer framebuffer);
+
+  void deleteProgram(Program program);
+
+  void deleteRenderbuffer(Renderbuffer renderbuffer);
+
+  void deleteShader(Shader shader);
+
+  void deleteTexture(Texture texture);
+
+  void depthFunc(int func);
+
+  void depthMask(bool flag);
+
+  void depthRange(num zNear, num zFar);
+
+  void detachShader(Program program, Shader shader);
+
+  void disable(int cap);
+
+  void disableVertexAttribArray(int index);
+
+  void drawArrays(int mode, int first, int count);
+
+  void drawElements(int mode, int count, int type, int offset);
+
+  void enable(int cap);
+
+  void enableVertexAttribArray(int index);
+
+  void finish();
+
+  void flush();
+
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer);
+
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level);
+
+  void frontFace(int mode);
+
+  void generateMipmap(int target);
+
+  ActiveInfo getActiveAttrib(Program program, int index);
+
+  ActiveInfo getActiveUniform(Program program, int index);
+
+  void getAttachedShaders(Program program);
+
+  int getAttribLocation(Program program, String name);
+
+  Object getBufferParameter(int target, int pname);
+
+  ContextAttributes getContextAttributes();
+
+  int getError();
+
+  Object getExtension(String name);
+
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname);
+
+  Object getParameter(int pname);
+
+  String getProgramInfoLog(Program program);
+
+  Object getProgramParameter(Program program, int pname);
+
+  Object getRenderbufferParameter(int target, int pname);
+
+  String getShaderInfoLog(Shader shader);
+
+  Object getShaderParameter(Shader shader, int pname);
+
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype);
+
+  String getShaderSource(Shader shader);
+
+  List<String> getSupportedExtensions();
+
+  Object getTexParameter(int target, int pname);
+
+  Object getUniform(Program program, UniformLocation location);
+
+  UniformLocation getUniformLocation(Program program, String name);
+
+  Object getVertexAttrib(int index, int pname);
+
+  int getVertexAttribOffset(int index, int pname);
+
+  void hint(int target, int mode);
+
+  bool isBuffer(Buffer buffer);
+
+  bool isContextLost();
+
+  bool isEnabled(int cap);
+
+  bool isFramebuffer(Framebuffer framebuffer);
+
+  bool isProgram(Program program);
+
+  bool isRenderbuffer(Renderbuffer renderbuffer);
+
+  bool isShader(Shader shader);
+
+  bool isTexture(Texture texture);
+
+  void lineWidth(num width);
+
+  void linkProgram(Program program);
+
+  void pixelStorei(int pname, int param);
+
+  void polygonOffset(num factor, num units);
+
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels);
+
+  void renderbufferStorage(int target, int internalformat, int width, int height);
+
+  void sampleCoverage(num value, bool invert);
+
+  void scissor(int x, int y, int width, int height);
+
+  void shaderSource(Shader shader, String string);
+
+  void stencilFunc(int func, int ref, int mask);
+
+  void stencilFuncSeparate(int face, int func, int ref, int mask);
+
+  void stencilMask(int mask);
+
+  void stencilMaskSeparate(int face, int mask);
+
+  void stencilOp(int fail, int zfail, int zpass);
+
+  void stencilOpSeparate(int face, int fail, int zfail, int 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]);
+
+  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas);
+
+  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image);
+
+  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels);
+
+  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video);
+
+  void texParameterf(int target, int pname, num param);
+
+  void texParameteri(int target, int pname, int 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]);
+
+  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas);
+
+  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image);
+
+  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels);
+
+  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video);
+
+  void uniform1f(UniformLocation location, num x);
+
+  void uniform1fv(UniformLocation location, Float32List v);
+
+  void uniform1i(UniformLocation location, int x);
+
+  void uniform1iv(UniformLocation location, Int32List v);
+
+  void uniform2f(UniformLocation location, num x, num y);
+
+  void uniform2fv(UniformLocation location, Float32List v);
+
+  void uniform2i(UniformLocation location, int x, int y);
+
+  void uniform2iv(UniformLocation location, Int32List v);
+
+  void uniform3f(UniformLocation location, num x, num y, num z);
+
+  void uniform3fv(UniformLocation location, Float32List v);
+
+  void uniform3i(UniformLocation location, int x, int y, int z);
+
+  void uniform3iv(UniformLocation location, Int32List v);
+
+  void uniform4f(UniformLocation location, num x, num y, num z, num w);
+
+  void uniform4fv(UniformLocation location, Float32List v);
+
+  void uniform4i(UniformLocation location, int x, int y, int z, int w);
+
+  void uniform4iv(UniformLocation location, Int32List v);
+
+  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array);
+
+  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array);
+
+  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array);
+
+  void useProgram(Program program);
+
+  void validateProgram(Program program);
+
+  void vertexAttrib1f(int indx, num x);
+
+  void vertexAttrib1fv(int indx, Float32List values);
+
+  void vertexAttrib2f(int indx, num x, num y);
+
+  void vertexAttrib2fv(int indx, Float32List values);
+
+  void vertexAttrib3f(int indx, num x, num y, num z);
+
+  void vertexAttrib3fv(int indx, Float32List values);
+
+  void vertexAttrib4f(int indx, num x, num y, num z, num w);
+
+  void vertexAttrib4fv(int indx, Float32List values);
+
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset);
+
+  void viewport(int x, int y, int width, int height);
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('WebGLShader')
 @Native("WebGLShader")
 class Shader extends Interceptor {
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index a7254d7..d01a53e 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -18,7 +18,9 @@
 // FIXME: Can we make this private?
 final web_glBlinkMap = {
   'ANGLEInstancedArrays': () => AngleInstancedArrays,
+  'EXTBlendMinMax': () => ExtBlendMinMax,
   'EXTFragDepth': () => ExtFragDepth,
+  'EXTShaderTextureLOD': () => ExtShaderTextureLod,
   'EXTTextureFilterAnisotropic': () => ExtTextureFilterAnisotropic,
   'OESElementIndexUint': () => OesElementIndexUint,
   'OESStandardDerivatives': () => OesStandardDerivatives,
@@ -30,6 +32,7 @@
   'WebGLActiveInfo': () => ActiveInfo,
   'WebGLBuffer': () => Buffer,
   'WebGLCompressedTextureATC': () => CompressedTextureAtc,
+  'WebGLCompressedTextureETC1': () => CompressedTextureETC1,
   'WebGLCompressedTexturePVRTC': () => CompressedTexturePvrtc,
   'WebGLCompressedTextureS3TC': () => CompressedTextureS3TC,
   'WebGLContextAttributes': () => ContextAttributes,
@@ -43,6 +46,7 @@
   'WebGLProgram': () => Program,
   'WebGLRenderbuffer': () => Renderbuffer,
   'WebGLRenderingContext': () => RenderingContext,
+  'WebGLRenderingContextBase': () => RenderingContextBase,
   'WebGLShader': () => Shader,
   'WebGLShaderPrecisionFormat': () => ShaderPrecisionFormat,
   'WebGLTexture': () => Texture,
@@ -55,302 +59,302 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-const int ACTIVE_ATTRIBUTES = RenderingContext.ACTIVE_ATTRIBUTES;
-const int ACTIVE_TEXTURE = RenderingContext.ACTIVE_TEXTURE;
-const int ACTIVE_UNIFORMS = RenderingContext.ACTIVE_UNIFORMS;
-const int ALIASED_LINE_WIDTH_RANGE = RenderingContext.ALIASED_LINE_WIDTH_RANGE;
-const int ALIASED_POINT_SIZE_RANGE = RenderingContext.ALIASED_POINT_SIZE_RANGE;
-const int ALPHA = RenderingContext.ALPHA;
-const int ALPHA_BITS = RenderingContext.ALPHA_BITS;
-const int ALWAYS = RenderingContext.ALWAYS;
-const int ARRAY_BUFFER = RenderingContext.ARRAY_BUFFER;
-const int ARRAY_BUFFER_BINDING = RenderingContext.ARRAY_BUFFER_BINDING;
-const int ATTACHED_SHADERS = RenderingContext.ATTACHED_SHADERS;
-const int BACK = RenderingContext.BACK;
-const int BLEND = RenderingContext.BLEND;
-const int BLEND_COLOR = RenderingContext.BLEND_COLOR;
-const int BLEND_DST_ALPHA = RenderingContext.BLEND_DST_ALPHA;
-const int BLEND_DST_RGB = RenderingContext.BLEND_DST_RGB;
-const int BLEND_EQUATION = RenderingContext.BLEND_EQUATION;
-const int BLEND_EQUATION_ALPHA = RenderingContext.BLEND_EQUATION_ALPHA;
-const int BLEND_EQUATION_RGB = RenderingContext.BLEND_EQUATION_RGB;
-const int BLEND_SRC_ALPHA = RenderingContext.BLEND_SRC_ALPHA;
-const int BLEND_SRC_RGB = RenderingContext.BLEND_SRC_RGB;
-const int BLUE_BITS = RenderingContext.BLUE_BITS;
-const int BOOL = RenderingContext.BOOL;
-const int BOOL_VEC2 = RenderingContext.BOOL_VEC2;
-const int BOOL_VEC3 = RenderingContext.BOOL_VEC3;
-const int BOOL_VEC4 = RenderingContext.BOOL_VEC4;
-const int BROWSER_DEFAULT_WEBGL = RenderingContext.BROWSER_DEFAULT_WEBGL;
-const int BUFFER_SIZE = RenderingContext.BUFFER_SIZE;
-const int BUFFER_USAGE = RenderingContext.BUFFER_USAGE;
-const int BYTE = RenderingContext.BYTE;
-const int CCW = RenderingContext.CCW;
-const int CLAMP_TO_EDGE = RenderingContext.CLAMP_TO_EDGE;
-const int COLOR_ATTACHMENT0 = RenderingContext.COLOR_ATTACHMENT0;
-const int COLOR_BUFFER_BIT = RenderingContext.COLOR_BUFFER_BIT;
-const int COLOR_CLEAR_VALUE = RenderingContext.COLOR_CLEAR_VALUE;
-const int COLOR_WRITEMASK = RenderingContext.COLOR_WRITEMASK;
-const int COMPILE_STATUS = RenderingContext.COMPILE_STATUS;
-const int COMPRESSED_TEXTURE_FORMATS = RenderingContext.COMPRESSED_TEXTURE_FORMATS;
-const int CONSTANT_ALPHA = RenderingContext.CONSTANT_ALPHA;
-const int CONSTANT_COLOR = RenderingContext.CONSTANT_COLOR;
-const int CONTEXT_LOST_WEBGL = RenderingContext.CONTEXT_LOST_WEBGL;
-const int CULL_FACE = RenderingContext.CULL_FACE;
-const int CULL_FACE_MODE = RenderingContext.CULL_FACE_MODE;
-const int CURRENT_PROGRAM = RenderingContext.CURRENT_PROGRAM;
-const int CURRENT_VERTEX_ATTRIB = RenderingContext.CURRENT_VERTEX_ATTRIB;
-const int CW = RenderingContext.CW;
-const int DECR = RenderingContext.DECR;
-const int DECR_WRAP = RenderingContext.DECR_WRAP;
-const int DELETE_STATUS = RenderingContext.DELETE_STATUS;
-const int DEPTH_ATTACHMENT = RenderingContext.DEPTH_ATTACHMENT;
-const int DEPTH_BITS = RenderingContext.DEPTH_BITS;
-const int DEPTH_BUFFER_BIT = RenderingContext.DEPTH_BUFFER_BIT;
-const int DEPTH_CLEAR_VALUE = RenderingContext.DEPTH_CLEAR_VALUE;
-const int DEPTH_COMPONENT = RenderingContext.DEPTH_COMPONENT;
-const int DEPTH_COMPONENT16 = RenderingContext.DEPTH_COMPONENT16;
-const int DEPTH_FUNC = RenderingContext.DEPTH_FUNC;
-const int DEPTH_RANGE = RenderingContext.DEPTH_RANGE;
-const int DEPTH_STENCIL = RenderingContext.DEPTH_STENCIL;
-const int DEPTH_STENCIL_ATTACHMENT = RenderingContext.DEPTH_STENCIL_ATTACHMENT;
-const int DEPTH_TEST = RenderingContext.DEPTH_TEST;
-const int DEPTH_WRITEMASK = RenderingContext.DEPTH_WRITEMASK;
-const int DITHER = RenderingContext.DITHER;
-const int DONT_CARE = RenderingContext.DONT_CARE;
-const int DST_ALPHA = RenderingContext.DST_ALPHA;
-const int DST_COLOR = RenderingContext.DST_COLOR;
-const int DYNAMIC_DRAW = RenderingContext.DYNAMIC_DRAW;
-const int ELEMENT_ARRAY_BUFFER = RenderingContext.ELEMENT_ARRAY_BUFFER;
-const int ELEMENT_ARRAY_BUFFER_BINDING = RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
-const int EQUAL = RenderingContext.EQUAL;
-const int FASTEST = RenderingContext.FASTEST;
-const int FLOAT = RenderingContext.FLOAT;
-const int FLOAT_MAT2 = RenderingContext.FLOAT_MAT2;
-const int FLOAT_MAT3 = RenderingContext.FLOAT_MAT3;
-const int FLOAT_MAT4 = RenderingContext.FLOAT_MAT4;
-const int FLOAT_VEC2 = RenderingContext.FLOAT_VEC2;
-const int FLOAT_VEC3 = RenderingContext.FLOAT_VEC3;
-const int FLOAT_VEC4 = RenderingContext.FLOAT_VEC4;
-const int FRAGMENT_SHADER = RenderingContext.FRAGMENT_SHADER;
-const int FRAMEBUFFER = RenderingContext.FRAMEBUFFER;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
-const int FRAMEBUFFER_BINDING = RenderingContext.FRAMEBUFFER_BINDING;
-const int FRAMEBUFFER_COMPLETE = RenderingContext.FRAMEBUFFER_COMPLETE;
-const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
-const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
-const int FRAMEBUFFER_UNSUPPORTED = RenderingContext.FRAMEBUFFER_UNSUPPORTED;
-const int FRONT = RenderingContext.FRONT;
-const int FRONT_AND_BACK = RenderingContext.FRONT_AND_BACK;
-const int FRONT_FACE = RenderingContext.FRONT_FACE;
-const int FUNC_ADD = RenderingContext.FUNC_ADD;
-const int FUNC_REVERSE_SUBTRACT = RenderingContext.FUNC_REVERSE_SUBTRACT;
-const int FUNC_SUBTRACT = RenderingContext.FUNC_SUBTRACT;
-const int GENERATE_MIPMAP_HINT = RenderingContext.GENERATE_MIPMAP_HINT;
-const int GEQUAL = RenderingContext.GEQUAL;
-const int GREATER = RenderingContext.GREATER;
-const int GREEN_BITS = RenderingContext.GREEN_BITS;
+const int ACTIVE_ATTRIBUTES = RenderingContextBase.ACTIVE_ATTRIBUTES;
+const int ACTIVE_TEXTURE = RenderingContextBase.ACTIVE_TEXTURE;
+const int ACTIVE_UNIFORMS = RenderingContextBase.ACTIVE_UNIFORMS;
+const int ALIASED_LINE_WIDTH_RANGE = RenderingContextBase.ALIASED_LINE_WIDTH_RANGE;
+const int ALIASED_POINT_SIZE_RANGE = RenderingContextBase.ALIASED_POINT_SIZE_RANGE;
+const int ALPHA = RenderingContextBase.ALPHA;
+const int ALPHA_BITS = RenderingContextBase.ALPHA_BITS;
+const int ALWAYS = RenderingContextBase.ALWAYS;
+const int ARRAY_BUFFER = RenderingContextBase.ARRAY_BUFFER;
+const int ARRAY_BUFFER_BINDING = RenderingContextBase.ARRAY_BUFFER_BINDING;
+const int ATTACHED_SHADERS = RenderingContextBase.ATTACHED_SHADERS;
+const int BACK = RenderingContextBase.BACK;
+const int BLEND = RenderingContextBase.BLEND;
+const int BLEND_COLOR = RenderingContextBase.BLEND_COLOR;
+const int BLEND_DST_ALPHA = RenderingContextBase.BLEND_DST_ALPHA;
+const int BLEND_DST_RGB = RenderingContextBase.BLEND_DST_RGB;
+const int BLEND_EQUATION = RenderingContextBase.BLEND_EQUATION;
+const int BLEND_EQUATION_ALPHA = RenderingContextBase.BLEND_EQUATION_ALPHA;
+const int BLEND_EQUATION_RGB = RenderingContextBase.BLEND_EQUATION_RGB;
+const int BLEND_SRC_ALPHA = RenderingContextBase.BLEND_SRC_ALPHA;
+const int BLEND_SRC_RGB = RenderingContextBase.BLEND_SRC_RGB;
+const int BLUE_BITS = RenderingContextBase.BLUE_BITS;
+const int BOOL = RenderingContextBase.BOOL;
+const int BOOL_VEC2 = RenderingContextBase.BOOL_VEC2;
+const int BOOL_VEC3 = RenderingContextBase.BOOL_VEC3;
+const int BOOL_VEC4 = RenderingContextBase.BOOL_VEC4;
+const int BROWSER_DEFAULT_WEBGL = RenderingContextBase.BROWSER_DEFAULT_WEBGL;
+const int BUFFER_SIZE = RenderingContextBase.BUFFER_SIZE;
+const int BUFFER_USAGE = RenderingContextBase.BUFFER_USAGE;
+const int BYTE = RenderingContextBase.BYTE;
+const int CCW = RenderingContextBase.CCW;
+const int CLAMP_TO_EDGE = RenderingContextBase.CLAMP_TO_EDGE;
+const int COLOR_ATTACHMENT0 = RenderingContextBase.COLOR_ATTACHMENT0;
+const int COLOR_BUFFER_BIT = RenderingContextBase.COLOR_BUFFER_BIT;
+const int COLOR_CLEAR_VALUE = RenderingContextBase.COLOR_CLEAR_VALUE;
+const int COLOR_WRITEMASK = RenderingContextBase.COLOR_WRITEMASK;
+const int COMPILE_STATUS = RenderingContextBase.COMPILE_STATUS;
+const int COMPRESSED_TEXTURE_FORMATS = RenderingContextBase.COMPRESSED_TEXTURE_FORMATS;
+const int CONSTANT_ALPHA = RenderingContextBase.CONSTANT_ALPHA;
+const int CONSTANT_COLOR = RenderingContextBase.CONSTANT_COLOR;
+const int CONTEXT_LOST_WEBGL = RenderingContextBase.CONTEXT_LOST_WEBGL;
+const int CULL_FACE = RenderingContextBase.CULL_FACE;
+const int CULL_FACE_MODE = RenderingContextBase.CULL_FACE_MODE;
+const int CURRENT_PROGRAM = RenderingContextBase.CURRENT_PROGRAM;
+const int CURRENT_VERTEX_ATTRIB = RenderingContextBase.CURRENT_VERTEX_ATTRIB;
+const int CW = RenderingContextBase.CW;
+const int DECR = RenderingContextBase.DECR;
+const int DECR_WRAP = RenderingContextBase.DECR_WRAP;
+const int DELETE_STATUS = RenderingContextBase.DELETE_STATUS;
+const int DEPTH_ATTACHMENT = RenderingContextBase.DEPTH_ATTACHMENT;
+const int DEPTH_BITS = RenderingContextBase.DEPTH_BITS;
+const int DEPTH_BUFFER_BIT = RenderingContextBase.DEPTH_BUFFER_BIT;
+const int DEPTH_CLEAR_VALUE = RenderingContextBase.DEPTH_CLEAR_VALUE;
+const int DEPTH_COMPONENT = RenderingContextBase.DEPTH_COMPONENT;
+const int DEPTH_COMPONENT16 = RenderingContextBase.DEPTH_COMPONENT16;
+const int DEPTH_FUNC = RenderingContextBase.DEPTH_FUNC;
+const int DEPTH_RANGE = RenderingContextBase.DEPTH_RANGE;
+const int DEPTH_STENCIL = RenderingContextBase.DEPTH_STENCIL;
+const int DEPTH_STENCIL_ATTACHMENT = RenderingContextBase.DEPTH_STENCIL_ATTACHMENT;
+const int DEPTH_TEST = RenderingContextBase.DEPTH_TEST;
+const int DEPTH_WRITEMASK = RenderingContextBase.DEPTH_WRITEMASK;
+const int DITHER = RenderingContextBase.DITHER;
+const int DONT_CARE = RenderingContextBase.DONT_CARE;
+const int DST_ALPHA = RenderingContextBase.DST_ALPHA;
+const int DST_COLOR = RenderingContextBase.DST_COLOR;
+const int DYNAMIC_DRAW = RenderingContextBase.DYNAMIC_DRAW;
+const int ELEMENT_ARRAY_BUFFER = RenderingContextBase.ELEMENT_ARRAY_BUFFER;
+const int ELEMENT_ARRAY_BUFFER_BINDING = RenderingContextBase.ELEMENT_ARRAY_BUFFER_BINDING;
+const int EQUAL = RenderingContextBase.EQUAL;
+const int FASTEST = RenderingContextBase.FASTEST;
+const int FLOAT = RenderingContextBase.FLOAT;
+const int FLOAT_MAT2 = RenderingContextBase.FLOAT_MAT2;
+const int FLOAT_MAT3 = RenderingContextBase.FLOAT_MAT3;
+const int FLOAT_MAT4 = RenderingContextBase.FLOAT_MAT4;
+const int FLOAT_VEC2 = RenderingContextBase.FLOAT_VEC2;
+const int FLOAT_VEC3 = RenderingContextBase.FLOAT_VEC3;
+const int FLOAT_VEC4 = RenderingContextBase.FLOAT_VEC4;
+const int FRAGMENT_SHADER = RenderingContextBase.FRAGMENT_SHADER;
+const int FRAMEBUFFER = RenderingContextBase.FRAMEBUFFER;
+const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = RenderingContextBase.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
+const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = RenderingContextBase.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
+const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = RenderingContextBase.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
+const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = RenderingContextBase.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
+const int FRAMEBUFFER_BINDING = RenderingContextBase.FRAMEBUFFER_BINDING;
+const int FRAMEBUFFER_COMPLETE = RenderingContextBase.FRAMEBUFFER_COMPLETE;
+const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = RenderingContextBase.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = RenderingContextBase.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
+const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = RenderingContextBase.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
+const int FRAMEBUFFER_UNSUPPORTED = RenderingContextBase.FRAMEBUFFER_UNSUPPORTED;
+const int FRONT = RenderingContextBase.FRONT;
+const int FRONT_AND_BACK = RenderingContextBase.FRONT_AND_BACK;
+const int FRONT_FACE = RenderingContextBase.FRONT_FACE;
+const int FUNC_ADD = RenderingContextBase.FUNC_ADD;
+const int FUNC_REVERSE_SUBTRACT = RenderingContextBase.FUNC_REVERSE_SUBTRACT;
+const int FUNC_SUBTRACT = RenderingContextBase.FUNC_SUBTRACT;
+const int GENERATE_MIPMAP_HINT = RenderingContextBase.GENERATE_MIPMAP_HINT;
+const int GEQUAL = RenderingContextBase.GEQUAL;
+const int GREATER = RenderingContextBase.GREATER;
+const int GREEN_BITS = RenderingContextBase.GREEN_BITS;
 const int HALF_FLOAT_OES = OesTextureHalfFloat.HALF_FLOAT_OES;
-const int HIGH_FLOAT = RenderingContext.HIGH_FLOAT;
-const int HIGH_INT = RenderingContext.HIGH_INT;
-const int INCR = RenderingContext.INCR;
-const int INCR_WRAP = RenderingContext.INCR_WRAP;
-const int INT = RenderingContext.INT;
-const int INT_VEC2 = RenderingContext.INT_VEC2;
-const int INT_VEC3 = RenderingContext.INT_VEC3;
-const int INT_VEC4 = RenderingContext.INT_VEC4;
-const int INVALID_ENUM = RenderingContext.INVALID_ENUM;
-const int INVALID_FRAMEBUFFER_OPERATION = RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
-const int INVALID_OPERATION = RenderingContext.INVALID_OPERATION;
-const int INVALID_VALUE = RenderingContext.INVALID_VALUE;
-const int INVERT = RenderingContext.INVERT;
-const int KEEP = RenderingContext.KEEP;
-const int LEQUAL = RenderingContext.LEQUAL;
-const int LESS = RenderingContext.LESS;
-const int LINEAR = RenderingContext.LINEAR;
-const int LINEAR_MIPMAP_LINEAR = RenderingContext.LINEAR_MIPMAP_LINEAR;
-const int LINEAR_MIPMAP_NEAREST = RenderingContext.LINEAR_MIPMAP_NEAREST;
-const int LINES = RenderingContext.LINES;
-const int LINE_LOOP = RenderingContext.LINE_LOOP;
-const int LINE_STRIP = RenderingContext.LINE_STRIP;
-const int LINE_WIDTH = RenderingContext.LINE_WIDTH;
-const int LINK_STATUS = RenderingContext.LINK_STATUS;
-const int LOW_FLOAT = RenderingContext.LOW_FLOAT;
-const int LOW_INT = RenderingContext.LOW_INT;
-const int LUMINANCE = RenderingContext.LUMINANCE;
-const int LUMINANCE_ALPHA = RenderingContext.LUMINANCE_ALPHA;
-const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
-const int MAX_CUBE_MAP_TEXTURE_SIZE = RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
-const int MAX_FRAGMENT_UNIFORM_VECTORS = RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
-const int MAX_RENDERBUFFER_SIZE = RenderingContext.MAX_RENDERBUFFER_SIZE;
-const int MAX_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
-const int MAX_TEXTURE_SIZE = RenderingContext.MAX_TEXTURE_SIZE;
-const int MAX_VARYING_VECTORS = RenderingContext.MAX_VARYING_VECTORS;
-const int MAX_VERTEX_ATTRIBS = RenderingContext.MAX_VERTEX_ATTRIBS;
-const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
-const int MAX_VERTEX_UNIFORM_VECTORS = RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
-const int MAX_VIEWPORT_DIMS = RenderingContext.MAX_VIEWPORT_DIMS;
-const int MEDIUM_FLOAT = RenderingContext.MEDIUM_FLOAT;
-const int MEDIUM_INT = RenderingContext.MEDIUM_INT;
-const int MIRRORED_REPEAT = RenderingContext.MIRRORED_REPEAT;
-const int NEAREST = RenderingContext.NEAREST;
-const int NEAREST_MIPMAP_LINEAR = RenderingContext.NEAREST_MIPMAP_LINEAR;
-const int NEAREST_MIPMAP_NEAREST = RenderingContext.NEAREST_MIPMAP_NEAREST;
-const int NEVER = RenderingContext.NEVER;
-const int NICEST = RenderingContext.NICEST;
-const int NONE = RenderingContext.NONE;
-const int NOTEQUAL = RenderingContext.NOTEQUAL;
-const int NO_ERROR = RenderingContext.NO_ERROR;
-const int ONE = RenderingContext.ONE;
-const int ONE_MINUS_CONSTANT_ALPHA = RenderingContext.ONE_MINUS_CONSTANT_ALPHA;
-const int ONE_MINUS_CONSTANT_COLOR = RenderingContext.ONE_MINUS_CONSTANT_COLOR;
-const int ONE_MINUS_DST_ALPHA = RenderingContext.ONE_MINUS_DST_ALPHA;
-const int ONE_MINUS_DST_COLOR = RenderingContext.ONE_MINUS_DST_COLOR;
-const int ONE_MINUS_SRC_ALPHA = RenderingContext.ONE_MINUS_SRC_ALPHA;
-const int ONE_MINUS_SRC_COLOR = RenderingContext.ONE_MINUS_SRC_COLOR;
-const int OUT_OF_MEMORY = RenderingContext.OUT_OF_MEMORY;
-const int PACK_ALIGNMENT = RenderingContext.PACK_ALIGNMENT;
-const int POINTS = RenderingContext.POINTS;
-const int POLYGON_OFFSET_FACTOR = RenderingContext.POLYGON_OFFSET_FACTOR;
-const int POLYGON_OFFSET_FILL = RenderingContext.POLYGON_OFFSET_FILL;
-const int POLYGON_OFFSET_UNITS = RenderingContext.POLYGON_OFFSET_UNITS;
-const int RED_BITS = RenderingContext.RED_BITS;
-const int RENDERBUFFER = RenderingContext.RENDERBUFFER;
-const int RENDERBUFFER_ALPHA_SIZE = RenderingContext.RENDERBUFFER_ALPHA_SIZE;
-const int RENDERBUFFER_BINDING = RenderingContext.RENDERBUFFER_BINDING;
-const int RENDERBUFFER_BLUE_SIZE = RenderingContext.RENDERBUFFER_BLUE_SIZE;
-const int RENDERBUFFER_DEPTH_SIZE = RenderingContext.RENDERBUFFER_DEPTH_SIZE;
-const int RENDERBUFFER_GREEN_SIZE = RenderingContext.RENDERBUFFER_GREEN_SIZE;
-const int RENDERBUFFER_HEIGHT = RenderingContext.RENDERBUFFER_HEIGHT;
-const int RENDERBUFFER_INTERNAL_FORMAT = RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
-const int RENDERBUFFER_RED_SIZE = RenderingContext.RENDERBUFFER_RED_SIZE;
-const int RENDERBUFFER_STENCIL_SIZE = RenderingContext.RENDERBUFFER_STENCIL_SIZE;
-const int RENDERBUFFER_WIDTH = RenderingContext.RENDERBUFFER_WIDTH;
-const int RENDERER = RenderingContext.RENDERER;
-const int REPEAT = RenderingContext.REPEAT;
-const int REPLACE = RenderingContext.REPLACE;
-const int RGB = RenderingContext.RGB;
-const int RGB565 = RenderingContext.RGB565;
-const int RGB5_A1 = RenderingContext.RGB5_A1;
-const int RGBA = RenderingContext.RGBA;
-const int RGBA4 = RenderingContext.RGBA4;
-const int SAMPLER_2D = RenderingContext.SAMPLER_2D;
-const int SAMPLER_CUBE = RenderingContext.SAMPLER_CUBE;
-const int SAMPLES = RenderingContext.SAMPLES;
-const int SAMPLE_ALPHA_TO_COVERAGE = RenderingContext.SAMPLE_ALPHA_TO_COVERAGE;
-const int SAMPLE_BUFFERS = RenderingContext.SAMPLE_BUFFERS;
-const int SAMPLE_COVERAGE = RenderingContext.SAMPLE_COVERAGE;
-const int SAMPLE_COVERAGE_INVERT = RenderingContext.SAMPLE_COVERAGE_INVERT;
-const int SAMPLE_COVERAGE_VALUE = RenderingContext.SAMPLE_COVERAGE_VALUE;
-const int SCISSOR_BOX = RenderingContext.SCISSOR_BOX;
-const int SCISSOR_TEST = RenderingContext.SCISSOR_TEST;
-const int SHADER_TYPE = RenderingContext.SHADER_TYPE;
-const int SHADING_LANGUAGE_VERSION = RenderingContext.SHADING_LANGUAGE_VERSION;
-const int SHORT = RenderingContext.SHORT;
-const int SRC_ALPHA = RenderingContext.SRC_ALPHA;
-const int SRC_ALPHA_SATURATE = RenderingContext.SRC_ALPHA_SATURATE;
-const int SRC_COLOR = RenderingContext.SRC_COLOR;
-const int STATIC_DRAW = RenderingContext.STATIC_DRAW;
-const int STENCIL_ATTACHMENT = RenderingContext.STENCIL_ATTACHMENT;
-const int STENCIL_BACK_FAIL = RenderingContext.STENCIL_BACK_FAIL;
-const int STENCIL_BACK_FUNC = RenderingContext.STENCIL_BACK_FUNC;
-const int STENCIL_BACK_PASS_DEPTH_FAIL = RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
-const int STENCIL_BACK_PASS_DEPTH_PASS = RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
-const int STENCIL_BACK_REF = RenderingContext.STENCIL_BACK_REF;
-const int STENCIL_BACK_VALUE_MASK = RenderingContext.STENCIL_BACK_VALUE_MASK;
-const int STENCIL_BACK_WRITEMASK = RenderingContext.STENCIL_BACK_WRITEMASK;
-const int STENCIL_BITS = RenderingContext.STENCIL_BITS;
-const int STENCIL_BUFFER_BIT = RenderingContext.STENCIL_BUFFER_BIT;
-const int STENCIL_CLEAR_VALUE = RenderingContext.STENCIL_CLEAR_VALUE;
-const int STENCIL_FAIL = RenderingContext.STENCIL_FAIL;
-const int STENCIL_FUNC = RenderingContext.STENCIL_FUNC;
-const int STENCIL_INDEX = RenderingContext.STENCIL_INDEX;
-const int STENCIL_INDEX8 = RenderingContext.STENCIL_INDEX8;
-const int STENCIL_PASS_DEPTH_FAIL = RenderingContext.STENCIL_PASS_DEPTH_FAIL;
-const int STENCIL_PASS_DEPTH_PASS = RenderingContext.STENCIL_PASS_DEPTH_PASS;
-const int STENCIL_REF = RenderingContext.STENCIL_REF;
-const int STENCIL_TEST = RenderingContext.STENCIL_TEST;
-const int STENCIL_VALUE_MASK = RenderingContext.STENCIL_VALUE_MASK;
-const int STENCIL_WRITEMASK = RenderingContext.STENCIL_WRITEMASK;
-const int STREAM_DRAW = RenderingContext.STREAM_DRAW;
-const int SUBPIXEL_BITS = RenderingContext.SUBPIXEL_BITS;
-const int TEXTURE = RenderingContext.TEXTURE;
-const int TEXTURE0 = RenderingContext.TEXTURE0;
-const int TEXTURE1 = RenderingContext.TEXTURE1;
-const int TEXTURE10 = RenderingContext.TEXTURE10;
-const int TEXTURE11 = RenderingContext.TEXTURE11;
-const int TEXTURE12 = RenderingContext.TEXTURE12;
-const int TEXTURE13 = RenderingContext.TEXTURE13;
-const int TEXTURE14 = RenderingContext.TEXTURE14;
-const int TEXTURE15 = RenderingContext.TEXTURE15;
-const int TEXTURE16 = RenderingContext.TEXTURE16;
-const int TEXTURE17 = RenderingContext.TEXTURE17;
-const int TEXTURE18 = RenderingContext.TEXTURE18;
-const int TEXTURE19 = RenderingContext.TEXTURE19;
-const int TEXTURE2 = RenderingContext.TEXTURE2;
-const int TEXTURE20 = RenderingContext.TEXTURE20;
-const int TEXTURE21 = RenderingContext.TEXTURE21;
-const int TEXTURE22 = RenderingContext.TEXTURE22;
-const int TEXTURE23 = RenderingContext.TEXTURE23;
-const int TEXTURE24 = RenderingContext.TEXTURE24;
-const int TEXTURE25 = RenderingContext.TEXTURE25;
-const int TEXTURE26 = RenderingContext.TEXTURE26;
-const int TEXTURE27 = RenderingContext.TEXTURE27;
-const int TEXTURE28 = RenderingContext.TEXTURE28;
-const int TEXTURE29 = RenderingContext.TEXTURE29;
-const int TEXTURE3 = RenderingContext.TEXTURE3;
-const int TEXTURE30 = RenderingContext.TEXTURE30;
-const int TEXTURE31 = RenderingContext.TEXTURE31;
-const int TEXTURE4 = RenderingContext.TEXTURE4;
-const int TEXTURE5 = RenderingContext.TEXTURE5;
-const int TEXTURE6 = RenderingContext.TEXTURE6;
-const int TEXTURE7 = RenderingContext.TEXTURE7;
-const int TEXTURE8 = RenderingContext.TEXTURE8;
-const int TEXTURE9 = RenderingContext.TEXTURE9;
-const int TEXTURE_2D = RenderingContext.TEXTURE_2D;
-const int TEXTURE_BINDING_2D = RenderingContext.TEXTURE_BINDING_2D;
-const int TEXTURE_BINDING_CUBE_MAP = RenderingContext.TEXTURE_BINDING_CUBE_MAP;
-const int TEXTURE_CUBE_MAP = RenderingContext.TEXTURE_CUBE_MAP;
-const int TEXTURE_CUBE_MAP_NEGATIVE_X = RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Y = RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Z = RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
-const int TEXTURE_CUBE_MAP_POSITIVE_X = RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
-const int TEXTURE_CUBE_MAP_POSITIVE_Y = RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
-const int TEXTURE_CUBE_MAP_POSITIVE_Z = RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
-const int TEXTURE_MAG_FILTER = RenderingContext.TEXTURE_MAG_FILTER;
-const int TEXTURE_MIN_FILTER = RenderingContext.TEXTURE_MIN_FILTER;
-const int TEXTURE_WRAP_S = RenderingContext.TEXTURE_WRAP_S;
-const int TEXTURE_WRAP_T = RenderingContext.TEXTURE_WRAP_T;
-const int TRIANGLES = RenderingContext.TRIANGLES;
-const int TRIANGLE_FAN = RenderingContext.TRIANGLE_FAN;
-const int TRIANGLE_STRIP = RenderingContext.TRIANGLE_STRIP;
-const int UNPACK_ALIGNMENT = RenderingContext.UNPACK_ALIGNMENT;
-const int UNPACK_COLORSPACE_CONVERSION_WEBGL = RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
-const int UNPACK_FLIP_Y_WEBGL = RenderingContext.UNPACK_FLIP_Y_WEBGL;
-const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
-const int UNSIGNED_BYTE = RenderingContext.UNSIGNED_BYTE;
-const int UNSIGNED_INT = RenderingContext.UNSIGNED_INT;
-const int UNSIGNED_SHORT = RenderingContext.UNSIGNED_SHORT;
-const int UNSIGNED_SHORT_4_4_4_4 = RenderingContext.UNSIGNED_SHORT_4_4_4_4;
-const int UNSIGNED_SHORT_5_5_5_1 = RenderingContext.UNSIGNED_SHORT_5_5_5_1;
-const int UNSIGNED_SHORT_5_6_5 = RenderingContext.UNSIGNED_SHORT_5_6_5;
-const int VALIDATE_STATUS = RenderingContext.VALIDATE_STATUS;
-const int VENDOR = RenderingContext.VENDOR;
-const int VERSION = RenderingContext.VERSION;
-const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
-const int VERTEX_ATTRIB_ARRAY_ENABLED = RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
-const int VERTEX_ATTRIB_ARRAY_NORMALIZED = RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
-const int VERTEX_ATTRIB_ARRAY_POINTER = RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
-const int VERTEX_ATTRIB_ARRAY_SIZE = RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
-const int VERTEX_ATTRIB_ARRAY_STRIDE = RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
-const int VERTEX_ATTRIB_ARRAY_TYPE = RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
-const int VERTEX_SHADER = RenderingContext.VERTEX_SHADER;
-const int VIEWPORT = RenderingContext.VIEWPORT;
-const int ZERO = RenderingContext.ZERO;
+const int HIGH_FLOAT = RenderingContextBase.HIGH_FLOAT;
+const int HIGH_INT = RenderingContextBase.HIGH_INT;
+const int INCR = RenderingContextBase.INCR;
+const int INCR_WRAP = RenderingContextBase.INCR_WRAP;
+const int INT = RenderingContextBase.INT;
+const int INT_VEC2 = RenderingContextBase.INT_VEC2;
+const int INT_VEC3 = RenderingContextBase.INT_VEC3;
+const int INT_VEC4 = RenderingContextBase.INT_VEC4;
+const int INVALID_ENUM = RenderingContextBase.INVALID_ENUM;
+const int INVALID_FRAMEBUFFER_OPERATION = RenderingContextBase.INVALID_FRAMEBUFFER_OPERATION;
+const int INVALID_OPERATION = RenderingContextBase.INVALID_OPERATION;
+const int INVALID_VALUE = RenderingContextBase.INVALID_VALUE;
+const int INVERT = RenderingContextBase.INVERT;
+const int KEEP = RenderingContextBase.KEEP;
+const int LEQUAL = RenderingContextBase.LEQUAL;
+const int LESS = RenderingContextBase.LESS;
+const int LINEAR = RenderingContextBase.LINEAR;
+const int LINEAR_MIPMAP_LINEAR = RenderingContextBase.LINEAR_MIPMAP_LINEAR;
+const int LINEAR_MIPMAP_NEAREST = RenderingContextBase.LINEAR_MIPMAP_NEAREST;
+const int LINES = RenderingContextBase.LINES;
+const int LINE_LOOP = RenderingContextBase.LINE_LOOP;
+const int LINE_STRIP = RenderingContextBase.LINE_STRIP;
+const int LINE_WIDTH = RenderingContextBase.LINE_WIDTH;
+const int LINK_STATUS = RenderingContextBase.LINK_STATUS;
+const int LOW_FLOAT = RenderingContextBase.LOW_FLOAT;
+const int LOW_INT = RenderingContextBase.LOW_INT;
+const int LUMINANCE = RenderingContextBase.LUMINANCE;
+const int LUMINANCE_ALPHA = RenderingContextBase.LUMINANCE_ALPHA;
+const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = RenderingContextBase.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
+const int MAX_CUBE_MAP_TEXTURE_SIZE = RenderingContextBase.MAX_CUBE_MAP_TEXTURE_SIZE;
+const int MAX_FRAGMENT_UNIFORM_VECTORS = RenderingContextBase.MAX_FRAGMENT_UNIFORM_VECTORS;
+const int MAX_RENDERBUFFER_SIZE = RenderingContextBase.MAX_RENDERBUFFER_SIZE;
+const int MAX_TEXTURE_IMAGE_UNITS = RenderingContextBase.MAX_TEXTURE_IMAGE_UNITS;
+const int MAX_TEXTURE_SIZE = RenderingContextBase.MAX_TEXTURE_SIZE;
+const int MAX_VARYING_VECTORS = RenderingContextBase.MAX_VARYING_VECTORS;
+const int MAX_VERTEX_ATTRIBS = RenderingContextBase.MAX_VERTEX_ATTRIBS;
+const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = RenderingContextBase.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
+const int MAX_VERTEX_UNIFORM_VECTORS = RenderingContextBase.MAX_VERTEX_UNIFORM_VECTORS;
+const int MAX_VIEWPORT_DIMS = RenderingContextBase.MAX_VIEWPORT_DIMS;
+const int MEDIUM_FLOAT = RenderingContextBase.MEDIUM_FLOAT;
+const int MEDIUM_INT = RenderingContextBase.MEDIUM_INT;
+const int MIRRORED_REPEAT = RenderingContextBase.MIRRORED_REPEAT;
+const int NEAREST = RenderingContextBase.NEAREST;
+const int NEAREST_MIPMAP_LINEAR = RenderingContextBase.NEAREST_MIPMAP_LINEAR;
+const int NEAREST_MIPMAP_NEAREST = RenderingContextBase.NEAREST_MIPMAP_NEAREST;
+const int NEVER = RenderingContextBase.NEVER;
+const int NICEST = RenderingContextBase.NICEST;
+const int NONE = RenderingContextBase.NONE;
+const int NOTEQUAL = RenderingContextBase.NOTEQUAL;
+const int NO_ERROR = RenderingContextBase.NO_ERROR;
+const int ONE = RenderingContextBase.ONE;
+const int ONE_MINUS_CONSTANT_ALPHA = RenderingContextBase.ONE_MINUS_CONSTANT_ALPHA;
+const int ONE_MINUS_CONSTANT_COLOR = RenderingContextBase.ONE_MINUS_CONSTANT_COLOR;
+const int ONE_MINUS_DST_ALPHA = RenderingContextBase.ONE_MINUS_DST_ALPHA;
+const int ONE_MINUS_DST_COLOR = RenderingContextBase.ONE_MINUS_DST_COLOR;
+const int ONE_MINUS_SRC_ALPHA = RenderingContextBase.ONE_MINUS_SRC_ALPHA;
+const int ONE_MINUS_SRC_COLOR = RenderingContextBase.ONE_MINUS_SRC_COLOR;
+const int OUT_OF_MEMORY = RenderingContextBase.OUT_OF_MEMORY;
+const int PACK_ALIGNMENT = RenderingContextBase.PACK_ALIGNMENT;
+const int POINTS = RenderingContextBase.POINTS;
+const int POLYGON_OFFSET_FACTOR = RenderingContextBase.POLYGON_OFFSET_FACTOR;
+const int POLYGON_OFFSET_FILL = RenderingContextBase.POLYGON_OFFSET_FILL;
+const int POLYGON_OFFSET_UNITS = RenderingContextBase.POLYGON_OFFSET_UNITS;
+const int RED_BITS = RenderingContextBase.RED_BITS;
+const int RENDERBUFFER = RenderingContextBase.RENDERBUFFER;
+const int RENDERBUFFER_ALPHA_SIZE = RenderingContextBase.RENDERBUFFER_ALPHA_SIZE;
+const int RENDERBUFFER_BINDING = RenderingContextBase.RENDERBUFFER_BINDING;
+const int RENDERBUFFER_BLUE_SIZE = RenderingContextBase.RENDERBUFFER_BLUE_SIZE;
+const int RENDERBUFFER_DEPTH_SIZE = RenderingContextBase.RENDERBUFFER_DEPTH_SIZE;
+const int RENDERBUFFER_GREEN_SIZE = RenderingContextBase.RENDERBUFFER_GREEN_SIZE;
+const int RENDERBUFFER_HEIGHT = RenderingContextBase.RENDERBUFFER_HEIGHT;
+const int RENDERBUFFER_INTERNAL_FORMAT = RenderingContextBase.RENDERBUFFER_INTERNAL_FORMAT;
+const int RENDERBUFFER_RED_SIZE = RenderingContextBase.RENDERBUFFER_RED_SIZE;
+const int RENDERBUFFER_STENCIL_SIZE = RenderingContextBase.RENDERBUFFER_STENCIL_SIZE;
+const int RENDERBUFFER_WIDTH = RenderingContextBase.RENDERBUFFER_WIDTH;
+const int RENDERER = RenderingContextBase.RENDERER;
+const int REPEAT = RenderingContextBase.REPEAT;
+const int REPLACE = RenderingContextBase.REPLACE;
+const int RGB = RenderingContextBase.RGB;
+const int RGB565 = RenderingContextBase.RGB565;
+const int RGB5_A1 = RenderingContextBase.RGB5_A1;
+const int RGBA = RenderingContextBase.RGBA;
+const int RGBA4 = RenderingContextBase.RGBA4;
+const int SAMPLER_2D = RenderingContextBase.SAMPLER_2D;
+const int SAMPLER_CUBE = RenderingContextBase.SAMPLER_CUBE;
+const int SAMPLES = RenderingContextBase.SAMPLES;
+const int SAMPLE_ALPHA_TO_COVERAGE = RenderingContextBase.SAMPLE_ALPHA_TO_COVERAGE;
+const int SAMPLE_BUFFERS = RenderingContextBase.SAMPLE_BUFFERS;
+const int SAMPLE_COVERAGE = RenderingContextBase.SAMPLE_COVERAGE;
+const int SAMPLE_COVERAGE_INVERT = RenderingContextBase.SAMPLE_COVERAGE_INVERT;
+const int SAMPLE_COVERAGE_VALUE = RenderingContextBase.SAMPLE_COVERAGE_VALUE;
+const int SCISSOR_BOX = RenderingContextBase.SCISSOR_BOX;
+const int SCISSOR_TEST = RenderingContextBase.SCISSOR_TEST;
+const int SHADER_TYPE = RenderingContextBase.SHADER_TYPE;
+const int SHADING_LANGUAGE_VERSION = RenderingContextBase.SHADING_LANGUAGE_VERSION;
+const int SHORT = RenderingContextBase.SHORT;
+const int SRC_ALPHA = RenderingContextBase.SRC_ALPHA;
+const int SRC_ALPHA_SATURATE = RenderingContextBase.SRC_ALPHA_SATURATE;
+const int SRC_COLOR = RenderingContextBase.SRC_COLOR;
+const int STATIC_DRAW = RenderingContextBase.STATIC_DRAW;
+const int STENCIL_ATTACHMENT = RenderingContextBase.STENCIL_ATTACHMENT;
+const int STENCIL_BACK_FAIL = RenderingContextBase.STENCIL_BACK_FAIL;
+const int STENCIL_BACK_FUNC = RenderingContextBase.STENCIL_BACK_FUNC;
+const int STENCIL_BACK_PASS_DEPTH_FAIL = RenderingContextBase.STENCIL_BACK_PASS_DEPTH_FAIL;
+const int STENCIL_BACK_PASS_DEPTH_PASS = RenderingContextBase.STENCIL_BACK_PASS_DEPTH_PASS;
+const int STENCIL_BACK_REF = RenderingContextBase.STENCIL_BACK_REF;
+const int STENCIL_BACK_VALUE_MASK = RenderingContextBase.STENCIL_BACK_VALUE_MASK;
+const int STENCIL_BACK_WRITEMASK = RenderingContextBase.STENCIL_BACK_WRITEMASK;
+const int STENCIL_BITS = RenderingContextBase.STENCIL_BITS;
+const int STENCIL_BUFFER_BIT = RenderingContextBase.STENCIL_BUFFER_BIT;
+const int STENCIL_CLEAR_VALUE = RenderingContextBase.STENCIL_CLEAR_VALUE;
+const int STENCIL_FAIL = RenderingContextBase.STENCIL_FAIL;
+const int STENCIL_FUNC = RenderingContextBase.STENCIL_FUNC;
+const int STENCIL_INDEX = RenderingContextBase.STENCIL_INDEX;
+const int STENCIL_INDEX8 = RenderingContextBase.STENCIL_INDEX8;
+const int STENCIL_PASS_DEPTH_FAIL = RenderingContextBase.STENCIL_PASS_DEPTH_FAIL;
+const int STENCIL_PASS_DEPTH_PASS = RenderingContextBase.STENCIL_PASS_DEPTH_PASS;
+const int STENCIL_REF = RenderingContextBase.STENCIL_REF;
+const int STENCIL_TEST = RenderingContextBase.STENCIL_TEST;
+const int STENCIL_VALUE_MASK = RenderingContextBase.STENCIL_VALUE_MASK;
+const int STENCIL_WRITEMASK = RenderingContextBase.STENCIL_WRITEMASK;
+const int STREAM_DRAW = RenderingContextBase.STREAM_DRAW;
+const int SUBPIXEL_BITS = RenderingContextBase.SUBPIXEL_BITS;
+const int TEXTURE = RenderingContextBase.TEXTURE;
+const int TEXTURE0 = RenderingContextBase.TEXTURE0;
+const int TEXTURE1 = RenderingContextBase.TEXTURE1;
+const int TEXTURE10 = RenderingContextBase.TEXTURE10;
+const int TEXTURE11 = RenderingContextBase.TEXTURE11;
+const int TEXTURE12 = RenderingContextBase.TEXTURE12;
+const int TEXTURE13 = RenderingContextBase.TEXTURE13;
+const int TEXTURE14 = RenderingContextBase.TEXTURE14;
+const int TEXTURE15 = RenderingContextBase.TEXTURE15;
+const int TEXTURE16 = RenderingContextBase.TEXTURE16;
+const int TEXTURE17 = RenderingContextBase.TEXTURE17;
+const int TEXTURE18 = RenderingContextBase.TEXTURE18;
+const int TEXTURE19 = RenderingContextBase.TEXTURE19;
+const int TEXTURE2 = RenderingContextBase.TEXTURE2;
+const int TEXTURE20 = RenderingContextBase.TEXTURE20;
+const int TEXTURE21 = RenderingContextBase.TEXTURE21;
+const int TEXTURE22 = RenderingContextBase.TEXTURE22;
+const int TEXTURE23 = RenderingContextBase.TEXTURE23;
+const int TEXTURE24 = RenderingContextBase.TEXTURE24;
+const int TEXTURE25 = RenderingContextBase.TEXTURE25;
+const int TEXTURE26 = RenderingContextBase.TEXTURE26;
+const int TEXTURE27 = RenderingContextBase.TEXTURE27;
+const int TEXTURE28 = RenderingContextBase.TEXTURE28;
+const int TEXTURE29 = RenderingContextBase.TEXTURE29;
+const int TEXTURE3 = RenderingContextBase.TEXTURE3;
+const int TEXTURE30 = RenderingContextBase.TEXTURE30;
+const int TEXTURE31 = RenderingContextBase.TEXTURE31;
+const int TEXTURE4 = RenderingContextBase.TEXTURE4;
+const int TEXTURE5 = RenderingContextBase.TEXTURE5;
+const int TEXTURE6 = RenderingContextBase.TEXTURE6;
+const int TEXTURE7 = RenderingContextBase.TEXTURE7;
+const int TEXTURE8 = RenderingContextBase.TEXTURE8;
+const int TEXTURE9 = RenderingContextBase.TEXTURE9;
+const int TEXTURE_2D = RenderingContextBase.TEXTURE_2D;
+const int TEXTURE_BINDING_2D = RenderingContextBase.TEXTURE_BINDING_2D;
+const int TEXTURE_BINDING_CUBE_MAP = RenderingContextBase.TEXTURE_BINDING_CUBE_MAP;
+const int TEXTURE_CUBE_MAP = RenderingContextBase.TEXTURE_CUBE_MAP;
+const int TEXTURE_CUBE_MAP_NEGATIVE_X = RenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_X;
+const int TEXTURE_CUBE_MAP_NEGATIVE_Y = RenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_Y;
+const int TEXTURE_CUBE_MAP_NEGATIVE_Z = RenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_Z;
+const int TEXTURE_CUBE_MAP_POSITIVE_X = RenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_X;
+const int TEXTURE_CUBE_MAP_POSITIVE_Y = RenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_Y;
+const int TEXTURE_CUBE_MAP_POSITIVE_Z = RenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_Z;
+const int TEXTURE_MAG_FILTER = RenderingContextBase.TEXTURE_MAG_FILTER;
+const int TEXTURE_MIN_FILTER = RenderingContextBase.TEXTURE_MIN_FILTER;
+const int TEXTURE_WRAP_S = RenderingContextBase.TEXTURE_WRAP_S;
+const int TEXTURE_WRAP_T = RenderingContextBase.TEXTURE_WRAP_T;
+const int TRIANGLES = RenderingContextBase.TRIANGLES;
+const int TRIANGLE_FAN = RenderingContextBase.TRIANGLE_FAN;
+const int TRIANGLE_STRIP = RenderingContextBase.TRIANGLE_STRIP;
+const int UNPACK_ALIGNMENT = RenderingContextBase.UNPACK_ALIGNMENT;
+const int UNPACK_COLORSPACE_CONVERSION_WEBGL = RenderingContextBase.UNPACK_COLORSPACE_CONVERSION_WEBGL;
+const int UNPACK_FLIP_Y_WEBGL = RenderingContextBase.UNPACK_FLIP_Y_WEBGL;
+const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = RenderingContextBase.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
+const int UNSIGNED_BYTE = RenderingContextBase.UNSIGNED_BYTE;
+const int UNSIGNED_INT = RenderingContextBase.UNSIGNED_INT;
+const int UNSIGNED_SHORT = RenderingContextBase.UNSIGNED_SHORT;
+const int UNSIGNED_SHORT_4_4_4_4 = RenderingContextBase.UNSIGNED_SHORT_4_4_4_4;
+const int UNSIGNED_SHORT_5_5_5_1 = RenderingContextBase.UNSIGNED_SHORT_5_5_5_1;
+const int UNSIGNED_SHORT_5_6_5 = RenderingContextBase.UNSIGNED_SHORT_5_6_5;
+const int VALIDATE_STATUS = RenderingContextBase.VALIDATE_STATUS;
+const int VENDOR = RenderingContextBase.VENDOR;
+const int VERSION = RenderingContextBase.VERSION;
+const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = RenderingContextBase.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
+const int VERTEX_ATTRIB_ARRAY_ENABLED = RenderingContextBase.VERTEX_ATTRIB_ARRAY_ENABLED;
+const int VERTEX_ATTRIB_ARRAY_NORMALIZED = RenderingContextBase.VERTEX_ATTRIB_ARRAY_NORMALIZED;
+const int VERTEX_ATTRIB_ARRAY_POINTER = RenderingContextBase.VERTEX_ATTRIB_ARRAY_POINTER;
+const int VERTEX_ATTRIB_ARRAY_SIZE = RenderingContextBase.VERTEX_ATTRIB_ARRAY_SIZE;
+const int VERTEX_ATTRIB_ARRAY_STRIDE = RenderingContextBase.VERTEX_ATTRIB_ARRAY_STRIDE;
+const int VERTEX_ATTRIB_ARRAY_TYPE = RenderingContextBase.VERTEX_ATTRIB_ARRAY_TYPE;
+const int VERTEX_SHADER = RenderingContextBase.VERTEX_SHADER;
+const int VIEWPORT = RenderingContextBase.VIEWPORT;
+const int ZERO = RenderingContextBase.ZERO;
 // 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.
@@ -464,6 +468,26 @@
 
 
 @DocsEditable()
+@DomName('WebGLCompressedTextureETC1')
+@Experimental() // untriaged
+class CompressedTextureETC1 extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory CompressedTextureETC1._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WebGLCompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_RGB_ETC1_WEBGL = 0x8D64;
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('WebGLCompressedTexturePVRTC')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/
 @Experimental() // experimental
@@ -849,9 +873,30 @@
   @DocsEditable()
   static const int MAX_DRAW_BUFFERS_WEBGL = 0x8824;
 
-  @DomName('WebGLDrawBuffers.drawBuffersWEBGL')
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('EXTBlendMinMax')
+@Experimental() // untriaged
+class ExtBlendMinMax extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory ExtBlendMinMax._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('EXTBlendMinMax.MAX_EXT')
   @DocsEditable()
-  void drawBuffersWebgl(List<int> buffers) => _blink.BlinkWebGLDrawBuffers.drawBuffersWEBGL_Callback_SEQ_GLenum_SEQ(this, buffers);
+  @Experimental() // untriaged
+  static const int MAX_EXT = 0x8008;
+
+  @DomName('EXTBlendMinMax.MIN_EXT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MIN_EXT = 0x8007;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -878,6 +923,21 @@
 
 
 @DocsEditable()
+@DomName('EXTShaderTextureLOD')
+@Experimental() // untriaged
+class ExtShaderTextureLod extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory ExtShaderTextureLod._() { throw new UnsupportedError("Not supported"); }
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('EXTTextureFilterAnisotropic')
 // http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/
 @Experimental()
@@ -1113,1192 +1173,17 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @Experimental()
 @Unstable()
-class RenderingContext extends CanvasRenderingContext {
+class RenderingContext extends NativeFieldWrapperClass2 implements CanvasRenderingContext {
   // To suppress missing implicit constructor warnings.
   factory RenderingContext._() { throw new UnsupportedError("Not supported"); }
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-  @DomName('WebGLRenderingContext.ACTIVE_ATTRIBUTES')
+  @DomName('WebGLRenderingContext.canvas')
   @DocsEditable()
-  static const int ACTIVE_ATTRIBUTES = 0x8B89;
-
-  @DomName('WebGLRenderingContext.ACTIVE_TEXTURE')
-  @DocsEditable()
-  static const int ACTIVE_TEXTURE = 0x84E0;
-
-  @DomName('WebGLRenderingContext.ACTIVE_UNIFORMS')
-  @DocsEditable()
-  static const int ACTIVE_UNIFORMS = 0x8B86;
-
-  @DomName('WebGLRenderingContext.ALIASED_LINE_WIDTH_RANGE')
-  @DocsEditable()
-  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
-
-  @DomName('WebGLRenderingContext.ALIASED_POINT_SIZE_RANGE')
-  @DocsEditable()
-  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
-
-  @DomName('WebGLRenderingContext.ALPHA')
-  @DocsEditable()
-  static const int ALPHA = 0x1906;
-
-  @DomName('WebGLRenderingContext.ALPHA_BITS')
-  @DocsEditable()
-  static const int ALPHA_BITS = 0x0D55;
-
-  @DomName('WebGLRenderingContext.ALWAYS')
-  @DocsEditable()
-  static const int ALWAYS = 0x0207;
-
-  @DomName('WebGLRenderingContext.ARRAY_BUFFER')
-  @DocsEditable()
-  static const int ARRAY_BUFFER = 0x8892;
-
-  @DomName('WebGLRenderingContext.ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  static const int ARRAY_BUFFER_BINDING = 0x8894;
-
-  @DomName('WebGLRenderingContext.ATTACHED_SHADERS')
-  @DocsEditable()
-  static const int ATTACHED_SHADERS = 0x8B85;
-
-  @DomName('WebGLRenderingContext.BACK')
-  @DocsEditable()
-  static const int BACK = 0x0405;
-
-  @DomName('WebGLRenderingContext.BLEND')
-  @DocsEditable()
-  static const int BLEND = 0x0BE2;
-
-  @DomName('WebGLRenderingContext.BLEND_COLOR')
-  @DocsEditable()
-  static const int BLEND_COLOR = 0x8005;
-
-  @DomName('WebGLRenderingContext.BLEND_DST_ALPHA')
-  @DocsEditable()
-  static const int BLEND_DST_ALPHA = 0x80CA;
-
-  @DomName('WebGLRenderingContext.BLEND_DST_RGB')
-  @DocsEditable()
-  static const int BLEND_DST_RGB = 0x80C8;
-
-  @DomName('WebGLRenderingContext.BLEND_EQUATION')
-  @DocsEditable()
-  static const int BLEND_EQUATION = 0x8009;
-
-  @DomName('WebGLRenderingContext.BLEND_EQUATION_ALPHA')
-  @DocsEditable()
-  static const int BLEND_EQUATION_ALPHA = 0x883D;
-
-  @DomName('WebGLRenderingContext.BLEND_EQUATION_RGB')
-  @DocsEditable()
-  static const int BLEND_EQUATION_RGB = 0x8009;
-
-  @DomName('WebGLRenderingContext.BLEND_SRC_ALPHA')
-  @DocsEditable()
-  static const int BLEND_SRC_ALPHA = 0x80CB;
-
-  @DomName('WebGLRenderingContext.BLEND_SRC_RGB')
-  @DocsEditable()
-  static const int BLEND_SRC_RGB = 0x80C9;
-
-  @DomName('WebGLRenderingContext.BLUE_BITS')
-  @DocsEditable()
-  static const int BLUE_BITS = 0x0D54;
-
-  @DomName('WebGLRenderingContext.BOOL')
-  @DocsEditable()
-  static const int BOOL = 0x8B56;
-
-  @DomName('WebGLRenderingContext.BOOL_VEC2')
-  @DocsEditable()
-  static const int BOOL_VEC2 = 0x8B57;
-
-  @DomName('WebGLRenderingContext.BOOL_VEC3')
-  @DocsEditable()
-  static const int BOOL_VEC3 = 0x8B58;
-
-  @DomName('WebGLRenderingContext.BOOL_VEC4')
-  @DocsEditable()
-  static const int BOOL_VEC4 = 0x8B59;
-
-  @DomName('WebGLRenderingContext.BROWSER_DEFAULT_WEBGL')
-  @DocsEditable()
-  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
-
-  @DomName('WebGLRenderingContext.BUFFER_SIZE')
-  @DocsEditable()
-  static const int BUFFER_SIZE = 0x8764;
-
-  @DomName('WebGLRenderingContext.BUFFER_USAGE')
-  @DocsEditable()
-  static const int BUFFER_USAGE = 0x8765;
-
-  @DomName('WebGLRenderingContext.BYTE')
-  @DocsEditable()
-  static const int BYTE = 0x1400;
-
-  @DomName('WebGLRenderingContext.CCW')
-  @DocsEditable()
-  static const int CCW = 0x0901;
-
-  @DomName('WebGLRenderingContext.CLAMP_TO_EDGE')
-  @DocsEditable()
-  static const int CLAMP_TO_EDGE = 0x812F;
-
-  @DomName('WebGLRenderingContext.COLOR_ATTACHMENT0')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT0 = 0x8CE0;
-
-  @DomName('WebGLRenderingContext.COLOR_BUFFER_BIT')
-  @DocsEditable()
-  static const int COLOR_BUFFER_BIT = 0x00004000;
-
-  @DomName('WebGLRenderingContext.COLOR_CLEAR_VALUE')
-  @DocsEditable()
-  static const int COLOR_CLEAR_VALUE = 0x0C22;
-
-  @DomName('WebGLRenderingContext.COLOR_WRITEMASK')
-  @DocsEditable()
-  static const int COLOR_WRITEMASK = 0x0C23;
-
-  @DomName('WebGLRenderingContext.COMPILE_STATUS')
-  @DocsEditable()
-  static const int COMPILE_STATUS = 0x8B81;
-
-  @DomName('WebGLRenderingContext.COMPRESSED_TEXTURE_FORMATS')
-  @DocsEditable()
-  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
-
-  @DomName('WebGLRenderingContext.CONSTANT_ALPHA')
-  @DocsEditable()
-  static const int CONSTANT_ALPHA = 0x8003;
-
-  @DomName('WebGLRenderingContext.CONSTANT_COLOR')
-  @DocsEditable()
-  static const int CONSTANT_COLOR = 0x8001;
-
-  @DomName('WebGLRenderingContext.CONTEXT_LOST_WEBGL')
-  @DocsEditable()
-  static const int CONTEXT_LOST_WEBGL = 0x9242;
-
-  @DomName('WebGLRenderingContext.CULL_FACE')
-  @DocsEditable()
-  static const int CULL_FACE = 0x0B44;
-
-  @DomName('WebGLRenderingContext.CULL_FACE_MODE')
-  @DocsEditable()
-  static const int CULL_FACE_MODE = 0x0B45;
-
-  @DomName('WebGLRenderingContext.CURRENT_PROGRAM')
-  @DocsEditable()
-  static const int CURRENT_PROGRAM = 0x8B8D;
-
-  @DomName('WebGLRenderingContext.CURRENT_VERTEX_ATTRIB')
-  @DocsEditable()
-  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
-
-  @DomName('WebGLRenderingContext.CW')
-  @DocsEditable()
-  static const int CW = 0x0900;
-
-  @DomName('WebGLRenderingContext.DECR')
-  @DocsEditable()
-  static const int DECR = 0x1E03;
-
-  @DomName('WebGLRenderingContext.DECR_WRAP')
-  @DocsEditable()
-  static const int DECR_WRAP = 0x8508;
-
-  @DomName('WebGLRenderingContext.DELETE_STATUS')
-  @DocsEditable()
-  static const int DELETE_STATUS = 0x8B80;
-
-  @DomName('WebGLRenderingContext.DEPTH_ATTACHMENT')
-  @DocsEditable()
-  static const int DEPTH_ATTACHMENT = 0x8D00;
-
-  @DomName('WebGLRenderingContext.DEPTH_BITS')
-  @DocsEditable()
-  static const int DEPTH_BITS = 0x0D56;
-
-  @DomName('WebGLRenderingContext.DEPTH_BUFFER_BIT')
-  @DocsEditable()
-  static const int DEPTH_BUFFER_BIT = 0x00000100;
-
-  @DomName('WebGLRenderingContext.DEPTH_CLEAR_VALUE')
-  @DocsEditable()
-  static const int DEPTH_CLEAR_VALUE = 0x0B73;
-
-  @DomName('WebGLRenderingContext.DEPTH_COMPONENT')
-  @DocsEditable()
-  static const int DEPTH_COMPONENT = 0x1902;
-
-  @DomName('WebGLRenderingContext.DEPTH_COMPONENT16')
-  @DocsEditable()
-  static const int DEPTH_COMPONENT16 = 0x81A5;
-
-  @DomName('WebGLRenderingContext.DEPTH_FUNC')
-  @DocsEditable()
-  static const int DEPTH_FUNC = 0x0B74;
-
-  @DomName('WebGLRenderingContext.DEPTH_RANGE')
-  @DocsEditable()
-  static const int DEPTH_RANGE = 0x0B70;
-
-  @DomName('WebGLRenderingContext.DEPTH_STENCIL')
-  @DocsEditable()
-  static const int DEPTH_STENCIL = 0x84F9;
-
-  @DomName('WebGLRenderingContext.DEPTH_STENCIL_ATTACHMENT')
-  @DocsEditable()
-  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
-
-  @DomName('WebGLRenderingContext.DEPTH_TEST')
-  @DocsEditable()
-  static const int DEPTH_TEST = 0x0B71;
-
-  @DomName('WebGLRenderingContext.DEPTH_WRITEMASK')
-  @DocsEditable()
-  static const int DEPTH_WRITEMASK = 0x0B72;
-
-  @DomName('WebGLRenderingContext.DITHER')
-  @DocsEditable()
-  static const int DITHER = 0x0BD0;
-
-  @DomName('WebGLRenderingContext.DONT_CARE')
-  @DocsEditable()
-  static const int DONT_CARE = 0x1100;
-
-  @DomName('WebGLRenderingContext.DST_ALPHA')
-  @DocsEditable()
-  static const int DST_ALPHA = 0x0304;
-
-  @DomName('WebGLRenderingContext.DST_COLOR')
-  @DocsEditable()
-  static const int DST_COLOR = 0x0306;
-
-  @DomName('WebGLRenderingContext.DYNAMIC_DRAW')
-  @DocsEditable()
-  static const int DYNAMIC_DRAW = 0x88E8;
-
-  @DomName('WebGLRenderingContext.ELEMENT_ARRAY_BUFFER')
-  @DocsEditable()
-  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
-
-  @DomName('WebGLRenderingContext.ELEMENT_ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
-
-  @DomName('WebGLRenderingContext.EQUAL')
-  @DocsEditable()
-  static const int EQUAL = 0x0202;
-
-  @DomName('WebGLRenderingContext.FASTEST')
-  @DocsEditable()
-  static const int FASTEST = 0x1101;
-
-  @DomName('WebGLRenderingContext.FLOAT')
-  @DocsEditable()
-  static const int FLOAT = 0x1406;
-
-  @DomName('WebGLRenderingContext.FLOAT_MAT2')
-  @DocsEditable()
-  static const int FLOAT_MAT2 = 0x8B5A;
-
-  @DomName('WebGLRenderingContext.FLOAT_MAT3')
-  @DocsEditable()
-  static const int FLOAT_MAT3 = 0x8B5B;
-
-  @DomName('WebGLRenderingContext.FLOAT_MAT4')
-  @DocsEditable()
-  static const int FLOAT_MAT4 = 0x8B5C;
-
-  @DomName('WebGLRenderingContext.FLOAT_VEC2')
-  @DocsEditable()
-  static const int FLOAT_VEC2 = 0x8B50;
-
-  @DomName('WebGLRenderingContext.FLOAT_VEC3')
-  @DocsEditable()
-  static const int FLOAT_VEC3 = 0x8B51;
-
-  @DomName('WebGLRenderingContext.FLOAT_VEC4')
-  @DocsEditable()
-  static const int FLOAT_VEC4 = 0x8B52;
-
-  @DomName('WebGLRenderingContext.FRAGMENT_SHADER')
-  @DocsEditable()
-  static const int FRAGMENT_SHADER = 0x8B30;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER')
-  @DocsEditable()
-  static const int FRAMEBUFFER = 0x8D40;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_BINDING')
-  @DocsEditable()
-  static const int FRAMEBUFFER_BINDING = 0x8CA6;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_COMPLETE')
-  @DocsEditable()
-  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT')
-  @DocsEditable()
-  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS')
-  @DocsEditable()
-  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT')
-  @DocsEditable()
-  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_UNSUPPORTED')
-  @DocsEditable()
-  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
-
-  @DomName('WebGLRenderingContext.FRONT')
-  @DocsEditable()
-  static const int FRONT = 0x0404;
-
-  @DomName('WebGLRenderingContext.FRONT_AND_BACK')
-  @DocsEditable()
-  static const int FRONT_AND_BACK = 0x0408;
-
-  @DomName('WebGLRenderingContext.FRONT_FACE')
-  @DocsEditable()
-  static const int FRONT_FACE = 0x0B46;
-
-  @DomName('WebGLRenderingContext.FUNC_ADD')
-  @DocsEditable()
-  static const int FUNC_ADD = 0x8006;
-
-  @DomName('WebGLRenderingContext.FUNC_REVERSE_SUBTRACT')
-  @DocsEditable()
-  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
-
-  @DomName('WebGLRenderingContext.FUNC_SUBTRACT')
-  @DocsEditable()
-  static const int FUNC_SUBTRACT = 0x800A;
-
-  @DomName('WebGLRenderingContext.GENERATE_MIPMAP_HINT')
-  @DocsEditable()
-  static const int GENERATE_MIPMAP_HINT = 0x8192;
-
-  @DomName('WebGLRenderingContext.GEQUAL')
-  @DocsEditable()
-  static const int GEQUAL = 0x0206;
-
-  @DomName('WebGLRenderingContext.GREATER')
-  @DocsEditable()
-  static const int GREATER = 0x0204;
-
-  @DomName('WebGLRenderingContext.GREEN_BITS')
-  @DocsEditable()
-  static const int GREEN_BITS = 0x0D53;
-
-  @DomName('WebGLRenderingContext.HIGH_FLOAT')
-  @DocsEditable()
-  static const int HIGH_FLOAT = 0x8DF2;
-
-  @DomName('WebGLRenderingContext.HIGH_INT')
-  @DocsEditable()
-  static const int HIGH_INT = 0x8DF5;
-
-  @DomName('WebGLRenderingContext.INCR')
-  @DocsEditable()
-  static const int INCR = 0x1E02;
-
-  @DomName('WebGLRenderingContext.INCR_WRAP')
-  @DocsEditable()
-  static const int INCR_WRAP = 0x8507;
-
-  @DomName('WebGLRenderingContext.INT')
-  @DocsEditable()
-  static const int INT = 0x1404;
-
-  @DomName('WebGLRenderingContext.INT_VEC2')
-  @DocsEditable()
-  static const int INT_VEC2 = 0x8B53;
-
-  @DomName('WebGLRenderingContext.INT_VEC3')
-  @DocsEditable()
-  static const int INT_VEC3 = 0x8B54;
-
-  @DomName('WebGLRenderingContext.INT_VEC4')
-  @DocsEditable()
-  static const int INT_VEC4 = 0x8B55;
-
-  @DomName('WebGLRenderingContext.INVALID_ENUM')
-  @DocsEditable()
-  static const int INVALID_ENUM = 0x0500;
-
-  @DomName('WebGLRenderingContext.INVALID_FRAMEBUFFER_OPERATION')
-  @DocsEditable()
-  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
-
-  @DomName('WebGLRenderingContext.INVALID_OPERATION')
-  @DocsEditable()
-  static const int INVALID_OPERATION = 0x0502;
-
-  @DomName('WebGLRenderingContext.INVALID_VALUE')
-  @DocsEditable()
-  static const int INVALID_VALUE = 0x0501;
-
-  @DomName('WebGLRenderingContext.INVERT')
-  @DocsEditable()
-  static const int INVERT = 0x150A;
-
-  @DomName('WebGLRenderingContext.KEEP')
-  @DocsEditable()
-  static const int KEEP = 0x1E00;
-
-  @DomName('WebGLRenderingContext.LEQUAL')
-  @DocsEditable()
-  static const int LEQUAL = 0x0203;
-
-  @DomName('WebGLRenderingContext.LESS')
-  @DocsEditable()
-  static const int LESS = 0x0201;
-
-  @DomName('WebGLRenderingContext.LINEAR')
-  @DocsEditable()
-  static const int LINEAR = 0x2601;
-
-  @DomName('WebGLRenderingContext.LINEAR_MIPMAP_LINEAR')
-  @DocsEditable()
-  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
-
-  @DomName('WebGLRenderingContext.LINEAR_MIPMAP_NEAREST')
-  @DocsEditable()
-  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
-
-  @DomName('WebGLRenderingContext.LINES')
-  @DocsEditable()
-  static const int LINES = 0x0001;
-
-  @DomName('WebGLRenderingContext.LINE_LOOP')
-  @DocsEditable()
-  static const int LINE_LOOP = 0x0002;
-
-  @DomName('WebGLRenderingContext.LINE_STRIP')
-  @DocsEditable()
-  static const int LINE_STRIP = 0x0003;
-
-  @DomName('WebGLRenderingContext.LINE_WIDTH')
-  @DocsEditable()
-  static const int LINE_WIDTH = 0x0B21;
-
-  @DomName('WebGLRenderingContext.LINK_STATUS')
-  @DocsEditable()
-  static const int LINK_STATUS = 0x8B82;
-
-  @DomName('WebGLRenderingContext.LOW_FLOAT')
-  @DocsEditable()
-  static const int LOW_FLOAT = 0x8DF0;
-
-  @DomName('WebGLRenderingContext.LOW_INT')
-  @DocsEditable()
-  static const int LOW_INT = 0x8DF3;
-
-  @DomName('WebGLRenderingContext.LUMINANCE')
-  @DocsEditable()
-  static const int LUMINANCE = 0x1909;
-
-  @DomName('WebGLRenderingContext.LUMINANCE_ALPHA')
-  @DocsEditable()
-  static const int LUMINANCE_ALPHA = 0x190A;
-
-  @DomName('WebGLRenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
-
-  @DomName('WebGLRenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE')
-  @DocsEditable()
-  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
-
-  @DomName('WebGLRenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS')
-  @DocsEditable()
-  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
-
-  @DomName('WebGLRenderingContext.MAX_RENDERBUFFER_SIZE')
-  @DocsEditable()
-  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
-
-  @DomName('WebGLRenderingContext.MAX_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
-
-  @DomName('WebGLRenderingContext.MAX_TEXTURE_SIZE')
-  @DocsEditable()
-  static const int MAX_TEXTURE_SIZE = 0x0D33;
-
-  @DomName('WebGLRenderingContext.MAX_VARYING_VECTORS')
-  @DocsEditable()
-  static const int MAX_VARYING_VECTORS = 0x8DFC;
-
-  @DomName('WebGLRenderingContext.MAX_VERTEX_ATTRIBS')
-  @DocsEditable()
-  static const int MAX_VERTEX_ATTRIBS = 0x8869;
-
-  @DomName('WebGLRenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
-
-  @DomName('WebGLRenderingContext.MAX_VERTEX_UNIFORM_VECTORS')
-  @DocsEditable()
-  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
-
-  @DomName('WebGLRenderingContext.MAX_VIEWPORT_DIMS')
-  @DocsEditable()
-  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
-
-  @DomName('WebGLRenderingContext.MEDIUM_FLOAT')
-  @DocsEditable()
-  static const int MEDIUM_FLOAT = 0x8DF1;
-
-  @DomName('WebGLRenderingContext.MEDIUM_INT')
-  @DocsEditable()
-  static const int MEDIUM_INT = 0x8DF4;
-
-  @DomName('WebGLRenderingContext.MIRRORED_REPEAT')
-  @DocsEditable()
-  static const int MIRRORED_REPEAT = 0x8370;
-
-  @DomName('WebGLRenderingContext.NEAREST')
-  @DocsEditable()
-  static const int NEAREST = 0x2600;
-
-  @DomName('WebGLRenderingContext.NEAREST_MIPMAP_LINEAR')
-  @DocsEditable()
-  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
-
-  @DomName('WebGLRenderingContext.NEAREST_MIPMAP_NEAREST')
-  @DocsEditable()
-  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
-
-  @DomName('WebGLRenderingContext.NEVER')
-  @DocsEditable()
-  static const int NEVER = 0x0200;
-
-  @DomName('WebGLRenderingContext.NICEST')
-  @DocsEditable()
-  static const int NICEST = 0x1102;
-
-  @DomName('WebGLRenderingContext.NONE')
-  @DocsEditable()
-  static const int NONE = 0;
-
-  @DomName('WebGLRenderingContext.NOTEQUAL')
-  @DocsEditable()
-  static const int NOTEQUAL = 0x0205;
-
-  @DomName('WebGLRenderingContext.NO_ERROR')
-  @DocsEditable()
-  static const int NO_ERROR = 0;
-
-  @DomName('WebGLRenderingContext.ONE')
-  @DocsEditable()
-  static const int ONE = 1;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_CONSTANT_ALPHA')
-  @DocsEditable()
-  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_CONSTANT_COLOR')
-  @DocsEditable()
-  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_DST_ALPHA')
-  @DocsEditable()
-  static const int ONE_MINUS_DST_ALPHA = 0x0305;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_DST_COLOR')
-  @DocsEditable()
-  static const int ONE_MINUS_DST_COLOR = 0x0307;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_SRC_ALPHA')
-  @DocsEditable()
-  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_SRC_COLOR')
-  @DocsEditable()
-  static const int ONE_MINUS_SRC_COLOR = 0x0301;
-
-  @DomName('WebGLRenderingContext.OUT_OF_MEMORY')
-  @DocsEditable()
-  static const int OUT_OF_MEMORY = 0x0505;
-
-  @DomName('WebGLRenderingContext.PACK_ALIGNMENT')
-  @DocsEditable()
-  static const int PACK_ALIGNMENT = 0x0D05;
-
-  @DomName('WebGLRenderingContext.POINTS')
-  @DocsEditable()
-  static const int POINTS = 0x0000;
-
-  @DomName('WebGLRenderingContext.POLYGON_OFFSET_FACTOR')
-  @DocsEditable()
-  static const int POLYGON_OFFSET_FACTOR = 0x8038;
-
-  @DomName('WebGLRenderingContext.POLYGON_OFFSET_FILL')
-  @DocsEditable()
-  static const int POLYGON_OFFSET_FILL = 0x8037;
-
-  @DomName('WebGLRenderingContext.POLYGON_OFFSET_UNITS')
-  @DocsEditable()
-  static const int POLYGON_OFFSET_UNITS = 0x2A00;
-
-  @DomName('WebGLRenderingContext.RED_BITS')
-  @DocsEditable()
-  static const int RED_BITS = 0x0D52;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER')
-  @DocsEditable()
-  static const int RENDERBUFFER = 0x8D41;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_ALPHA_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_BINDING')
-  @DocsEditable()
-  static const int RENDERBUFFER_BINDING = 0x8CA7;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_BLUE_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_DEPTH_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_GREEN_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_HEIGHT')
-  @DocsEditable()
-  static const int RENDERBUFFER_HEIGHT = 0x8D43;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_INTERNAL_FORMAT')
-  @DocsEditable()
-  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_RED_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_STENCIL_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_WIDTH')
-  @DocsEditable()
-  static const int RENDERBUFFER_WIDTH = 0x8D42;
-
-  @DomName('WebGLRenderingContext.RENDERER')
-  @DocsEditable()
-  static const int RENDERER = 0x1F01;
-
-  @DomName('WebGLRenderingContext.REPEAT')
-  @DocsEditable()
-  static const int REPEAT = 0x2901;
-
-  @DomName('WebGLRenderingContext.REPLACE')
-  @DocsEditable()
-  static const int REPLACE = 0x1E01;
-
-  @DomName('WebGLRenderingContext.RGB')
-  @DocsEditable()
-  static const int RGB = 0x1907;
-
-  @DomName('WebGLRenderingContext.RGB565')
-  @DocsEditable()
-  static const int RGB565 = 0x8D62;
-
-  @DomName('WebGLRenderingContext.RGB5_A1')
-  @DocsEditable()
-  static const int RGB5_A1 = 0x8057;
-
-  @DomName('WebGLRenderingContext.RGBA')
-  @DocsEditable()
-  static const int RGBA = 0x1908;
-
-  @DomName('WebGLRenderingContext.RGBA4')
-  @DocsEditable()
-  static const int RGBA4 = 0x8056;
-
-  @DomName('WebGLRenderingContext.SAMPLER_2D')
-  @DocsEditable()
-  static const int SAMPLER_2D = 0x8B5E;
-
-  @DomName('WebGLRenderingContext.SAMPLER_CUBE')
-  @DocsEditable()
-  static const int SAMPLER_CUBE = 0x8B60;
-
-  @DomName('WebGLRenderingContext.SAMPLES')
-  @DocsEditable()
-  static const int SAMPLES = 0x80A9;
-
-  @DomName('WebGLRenderingContext.SAMPLE_ALPHA_TO_COVERAGE')
-  @DocsEditable()
-  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
-
-  @DomName('WebGLRenderingContext.SAMPLE_BUFFERS')
-  @DocsEditable()
-  static const int SAMPLE_BUFFERS = 0x80A8;
-
-  @DomName('WebGLRenderingContext.SAMPLE_COVERAGE')
-  @DocsEditable()
-  static const int SAMPLE_COVERAGE = 0x80A0;
-
-  @DomName('WebGLRenderingContext.SAMPLE_COVERAGE_INVERT')
-  @DocsEditable()
-  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
-
-  @DomName('WebGLRenderingContext.SAMPLE_COVERAGE_VALUE')
-  @DocsEditable()
-  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
-
-  @DomName('WebGLRenderingContext.SCISSOR_BOX')
-  @DocsEditable()
-  static const int SCISSOR_BOX = 0x0C10;
-
-  @DomName('WebGLRenderingContext.SCISSOR_TEST')
-  @DocsEditable()
-  static const int SCISSOR_TEST = 0x0C11;
-
-  @DomName('WebGLRenderingContext.SHADER_TYPE')
-  @DocsEditable()
-  static const int SHADER_TYPE = 0x8B4F;
-
-  @DomName('WebGLRenderingContext.SHADING_LANGUAGE_VERSION')
-  @DocsEditable()
-  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
-
-  @DomName('WebGLRenderingContext.SHORT')
-  @DocsEditable()
-  static const int SHORT = 0x1402;
-
-  @DomName('WebGLRenderingContext.SRC_ALPHA')
-  @DocsEditable()
-  static const int SRC_ALPHA = 0x0302;
-
-  @DomName('WebGLRenderingContext.SRC_ALPHA_SATURATE')
-  @DocsEditable()
-  static const int SRC_ALPHA_SATURATE = 0x0308;
-
-  @DomName('WebGLRenderingContext.SRC_COLOR')
-  @DocsEditable()
-  static const int SRC_COLOR = 0x0300;
-
-  @DomName('WebGLRenderingContext.STATIC_DRAW')
-  @DocsEditable()
-  static const int STATIC_DRAW = 0x88E4;
-
-  @DomName('WebGLRenderingContext.STENCIL_ATTACHMENT')
-  @DocsEditable()
-  static const int STENCIL_ATTACHMENT = 0x8D20;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_FAIL')
-  @DocsEditable()
-  static const int STENCIL_BACK_FAIL = 0x8801;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_FUNC')
-  @DocsEditable()
-  static const int STENCIL_BACK_FUNC = 0x8800;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL')
-  @DocsEditable()
-  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_PASS_DEPTH_PASS')
-  @DocsEditable()
-  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_REF')
-  @DocsEditable()
-  static const int STENCIL_BACK_REF = 0x8CA3;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_VALUE_MASK')
-  @DocsEditable()
-  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_WRITEMASK')
-  @DocsEditable()
-  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
-
-  @DomName('WebGLRenderingContext.STENCIL_BITS')
-  @DocsEditable()
-  static const int STENCIL_BITS = 0x0D57;
-
-  @DomName('WebGLRenderingContext.STENCIL_BUFFER_BIT')
-  @DocsEditable()
-  static const int STENCIL_BUFFER_BIT = 0x00000400;
-
-  @DomName('WebGLRenderingContext.STENCIL_CLEAR_VALUE')
-  @DocsEditable()
-  static const int STENCIL_CLEAR_VALUE = 0x0B91;
-
-  @DomName('WebGLRenderingContext.STENCIL_FAIL')
-  @DocsEditable()
-  static const int STENCIL_FAIL = 0x0B94;
-
-  @DomName('WebGLRenderingContext.STENCIL_FUNC')
-  @DocsEditable()
-  static const int STENCIL_FUNC = 0x0B92;
-
-  @DomName('WebGLRenderingContext.STENCIL_INDEX')
-  @DocsEditable()
-  static const int STENCIL_INDEX = 0x1901;
-
-  @DomName('WebGLRenderingContext.STENCIL_INDEX8')
-  @DocsEditable()
-  static const int STENCIL_INDEX8 = 0x8D48;
-
-  @DomName('WebGLRenderingContext.STENCIL_PASS_DEPTH_FAIL')
-  @DocsEditable()
-  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
-
-  @DomName('WebGLRenderingContext.STENCIL_PASS_DEPTH_PASS')
-  @DocsEditable()
-  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
-
-  @DomName('WebGLRenderingContext.STENCIL_REF')
-  @DocsEditable()
-  static const int STENCIL_REF = 0x0B97;
-
-  @DomName('WebGLRenderingContext.STENCIL_TEST')
-  @DocsEditable()
-  static const int STENCIL_TEST = 0x0B90;
-
-  @DomName('WebGLRenderingContext.STENCIL_VALUE_MASK')
-  @DocsEditable()
-  static const int STENCIL_VALUE_MASK = 0x0B93;
-
-  @DomName('WebGLRenderingContext.STENCIL_WRITEMASK')
-  @DocsEditable()
-  static const int STENCIL_WRITEMASK = 0x0B98;
-
-  @DomName('WebGLRenderingContext.STREAM_DRAW')
-  @DocsEditable()
-  static const int STREAM_DRAW = 0x88E0;
-
-  @DomName('WebGLRenderingContext.SUBPIXEL_BITS')
-  @DocsEditable()
-  static const int SUBPIXEL_BITS = 0x0D50;
-
-  @DomName('WebGLRenderingContext.TEXTURE')
-  @DocsEditable()
-  static const int TEXTURE = 0x1702;
-
-  @DomName('WebGLRenderingContext.TEXTURE0')
-  @DocsEditable()
-  static const int TEXTURE0 = 0x84C0;
-
-  @DomName('WebGLRenderingContext.TEXTURE1')
-  @DocsEditable()
-  static const int TEXTURE1 = 0x84C1;
-
-  @DomName('WebGLRenderingContext.TEXTURE10')
-  @DocsEditable()
-  static const int TEXTURE10 = 0x84CA;
-
-  @DomName('WebGLRenderingContext.TEXTURE11')
-  @DocsEditable()
-  static const int TEXTURE11 = 0x84CB;
-
-  @DomName('WebGLRenderingContext.TEXTURE12')
-  @DocsEditable()
-  static const int TEXTURE12 = 0x84CC;
-
-  @DomName('WebGLRenderingContext.TEXTURE13')
-  @DocsEditable()
-  static const int TEXTURE13 = 0x84CD;
-
-  @DomName('WebGLRenderingContext.TEXTURE14')
-  @DocsEditable()
-  static const int TEXTURE14 = 0x84CE;
-
-  @DomName('WebGLRenderingContext.TEXTURE15')
-  @DocsEditable()
-  static const int TEXTURE15 = 0x84CF;
-
-  @DomName('WebGLRenderingContext.TEXTURE16')
-  @DocsEditable()
-  static const int TEXTURE16 = 0x84D0;
-
-  @DomName('WebGLRenderingContext.TEXTURE17')
-  @DocsEditable()
-  static const int TEXTURE17 = 0x84D1;
-
-  @DomName('WebGLRenderingContext.TEXTURE18')
-  @DocsEditable()
-  static const int TEXTURE18 = 0x84D2;
-
-  @DomName('WebGLRenderingContext.TEXTURE19')
-  @DocsEditable()
-  static const int TEXTURE19 = 0x84D3;
-
-  @DomName('WebGLRenderingContext.TEXTURE2')
-  @DocsEditable()
-  static const int TEXTURE2 = 0x84C2;
-
-  @DomName('WebGLRenderingContext.TEXTURE20')
-  @DocsEditable()
-  static const int TEXTURE20 = 0x84D4;
-
-  @DomName('WebGLRenderingContext.TEXTURE21')
-  @DocsEditable()
-  static const int TEXTURE21 = 0x84D5;
-
-  @DomName('WebGLRenderingContext.TEXTURE22')
-  @DocsEditable()
-  static const int TEXTURE22 = 0x84D6;
-
-  @DomName('WebGLRenderingContext.TEXTURE23')
-  @DocsEditable()
-  static const int TEXTURE23 = 0x84D7;
-
-  @DomName('WebGLRenderingContext.TEXTURE24')
-  @DocsEditable()
-  static const int TEXTURE24 = 0x84D8;
-
-  @DomName('WebGLRenderingContext.TEXTURE25')
-  @DocsEditable()
-  static const int TEXTURE25 = 0x84D9;
-
-  @DomName('WebGLRenderingContext.TEXTURE26')
-  @DocsEditable()
-  static const int TEXTURE26 = 0x84DA;
-
-  @DomName('WebGLRenderingContext.TEXTURE27')
-  @DocsEditable()
-  static const int TEXTURE27 = 0x84DB;
-
-  @DomName('WebGLRenderingContext.TEXTURE28')
-  @DocsEditable()
-  static const int TEXTURE28 = 0x84DC;
-
-  @DomName('WebGLRenderingContext.TEXTURE29')
-  @DocsEditable()
-  static const int TEXTURE29 = 0x84DD;
-
-  @DomName('WebGLRenderingContext.TEXTURE3')
-  @DocsEditable()
-  static const int TEXTURE3 = 0x84C3;
-
-  @DomName('WebGLRenderingContext.TEXTURE30')
-  @DocsEditable()
-  static const int TEXTURE30 = 0x84DE;
-
-  @DomName('WebGLRenderingContext.TEXTURE31')
-  @DocsEditable()
-  static const int TEXTURE31 = 0x84DF;
-
-  @DomName('WebGLRenderingContext.TEXTURE4')
-  @DocsEditable()
-  static const int TEXTURE4 = 0x84C4;
-
-  @DomName('WebGLRenderingContext.TEXTURE5')
-  @DocsEditable()
-  static const int TEXTURE5 = 0x84C5;
-
-  @DomName('WebGLRenderingContext.TEXTURE6')
-  @DocsEditable()
-  static const int TEXTURE6 = 0x84C6;
-
-  @DomName('WebGLRenderingContext.TEXTURE7')
-  @DocsEditable()
-  static const int TEXTURE7 = 0x84C7;
-
-  @DomName('WebGLRenderingContext.TEXTURE8')
-  @DocsEditable()
-  static const int TEXTURE8 = 0x84C8;
-
-  @DomName('WebGLRenderingContext.TEXTURE9')
-  @DocsEditable()
-  static const int TEXTURE9 = 0x84C9;
-
-  @DomName('WebGLRenderingContext.TEXTURE_2D')
-  @DocsEditable()
-  static const int TEXTURE_2D = 0x0DE1;
-
-  @DomName('WebGLRenderingContext.TEXTURE_BINDING_2D')
-  @DocsEditable()
-  static const int TEXTURE_BINDING_2D = 0x8069;
-
-  @DomName('WebGLRenderingContext.TEXTURE_BINDING_CUBE_MAP')
-  @DocsEditable()
-  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP = 0x8513;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
-
-  @DomName('WebGLRenderingContext.TEXTURE_MAG_FILTER')
-  @DocsEditable()
-  static const int TEXTURE_MAG_FILTER = 0x2800;
-
-  @DomName('WebGLRenderingContext.TEXTURE_MIN_FILTER')
-  @DocsEditable()
-  static const int TEXTURE_MIN_FILTER = 0x2801;
-
-  @DomName('WebGLRenderingContext.TEXTURE_WRAP_S')
-  @DocsEditable()
-  static const int TEXTURE_WRAP_S = 0x2802;
-
-  @DomName('WebGLRenderingContext.TEXTURE_WRAP_T')
-  @DocsEditable()
-  static const int TEXTURE_WRAP_T = 0x2803;
-
-  @DomName('WebGLRenderingContext.TRIANGLES')
-  @DocsEditable()
-  static const int TRIANGLES = 0x0004;
-
-  @DomName('WebGLRenderingContext.TRIANGLE_FAN')
-  @DocsEditable()
-  static const int TRIANGLE_FAN = 0x0006;
-
-  @DomName('WebGLRenderingContext.TRIANGLE_STRIP')
-  @DocsEditable()
-  static const int TRIANGLE_STRIP = 0x0005;
-
-  @DomName('WebGLRenderingContext.UNPACK_ALIGNMENT')
-  @DocsEditable()
-  static const int UNPACK_ALIGNMENT = 0x0CF5;
-
-  @DomName('WebGLRenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL')
-  @DocsEditable()
-  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
-
-  @DomName('WebGLRenderingContext.UNPACK_FLIP_Y_WEBGL')
-  @DocsEditable()
-  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
-
-  @DomName('WebGLRenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL')
-  @DocsEditable()
-  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_BYTE')
-  @DocsEditable()
-  static const int UNSIGNED_BYTE = 0x1401;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_INT')
-  @DocsEditable()
-  static const int UNSIGNED_INT = 0x1405;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT = 0x1403;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT_4_4_4_4')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT_5_5_5_1')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT_5_6_5')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
-
-  @DomName('WebGLRenderingContext.VALIDATE_STATUS')
-  @DocsEditable()
-  static const int VALIDATE_STATUS = 0x8B83;
-
-  @DomName('WebGLRenderingContext.VENDOR')
-  @DocsEditable()
-  static const int VENDOR = 0x1F00;
-
-  @DomName('WebGLRenderingContext.VERSION')
-  @DocsEditable()
-  static const int VERSION = 0x1F02;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_POINTER')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_SIZE')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_TYPE')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
-
-  @DomName('WebGLRenderingContext.VERTEX_SHADER')
-  @DocsEditable()
-  static const int VERTEX_SHADER = 0x8B31;
-
-  @DomName('WebGLRenderingContext.VIEWPORT')
-  @DocsEditable()
-  static const int VIEWPORT = 0x0BA2;
-
-  @DomName('WebGLRenderingContext.ZERO')
-  @DocsEditable()
-  static const int ZERO = 0;
+  @Experimental() // untriaged
+  CanvasElement get canvas => _blink.BlinkWebGLRenderingContext.canvas_Getter(this);
 
   @DomName('WebGLRenderingContext.drawingBufferHeight')
   @DocsEditable()
@@ -2361,18 +1246,18 @@
   void bufferByteData(int target, ByteBuffer data, int usage) => _blink.BlinkWebGLRenderingContext.bufferData_Callback_ul_ArrayBuffer_ul(this, target, data, usage);
 
   void bufferData(int target, data_OR_size, int usage) {
-    if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
+    if ((usage is int) && (data_OR_size is int) && (target is int)) {
+      _blink.BlinkWebGLRenderingContext.bufferData_Callback_ul_ll_ul(this, target, data_OR_size, usage);
+      return;
+    }
+    if ((usage is int) && (data_OR_size is TypedData) && (target is int)) {
       _blink.BlinkWebGLRenderingContext.bufferData_Callback_ul_ArrayBufferView_ul(this, 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)) {
+    if ((usage is int) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int)) {
       _blink.BlinkWebGLRenderingContext.bufferData_Callback_ul_ArrayBuffer_ul(this, 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)) {
-      _blink.BlinkWebGLRenderingContext.bufferData_Callback_ul_ll_ul(this, target, data_OR_size, usage);
-      return;
-    }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
@@ -2385,11 +1270,11 @@
   void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.BlinkWebGLRenderingContext.bufferSubData_Callback_ul_ll_ArrayBuffer(this, target, offset, data);
 
   void bufferSubData(int target, int offset, data) {
-    if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
+    if ((data is TypedData) && (offset is int) && (target is int)) {
       _blink.BlinkWebGLRenderingContext.bufferSubData_Callback_ul_ll_ArrayBufferView(this, target, offset, data);
       return;
     }
-    if ((data is ByteBuffer || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
+    if ((data is ByteBuffer || data == null) && (offset is int) && (target is int)) {
       _blink.BlinkWebGLRenderingContext.bufferSubData_Callback_ul_ll_ArrayBuffer(this, target, offset, data);
       return;
     }
@@ -2749,23 +1634,23 @@
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.stencilOpSeparate_Callback_ul_ul_ul_ul(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]) {
-    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)) {
+    if ((pixels is TypedData || pixels == null) && (type is int) && (format is int) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int)) {
       _blink.BlinkWebGLRenderingContext.texImage2D_Callback_ul_long_ul_long_long_long_ul_ul_ArrayBufferView(this, 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) {
+    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) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
       _blink.BlinkWebGLRenderingContext.texImage2D_Callback_ul_long_ul_ul_ul_ImageData(this, 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) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
       _blink.BlinkWebGLRenderingContext.texImage2D_Callback_ul_long_ul_ul_ul_HTMLImageElement(this, 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) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
       _blink.BlinkWebGLRenderingContext.texImage2D_Callback_ul_long_ul_ul_ul_HTMLCanvasElement(this, 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) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
       _blink.BlinkWebGLRenderingContext.texImage2D_Callback_ul_long_ul_ul_ul_HTMLVideoElement(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
@@ -2797,23 +1682,23 @@
   void texParameteri(int target, int pname, int param) => _blink.BlinkWebGLRenderingContext.texParameteri_Callback_ul_ul_long(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]) {
-    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)) {
+    if ((pixels is TypedData || pixels == null) && (type is int) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int)) {
       _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_ul_long_long_long_long_long_ul_ul_ArrayBufferView(this, 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) {
+    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) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
       _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_ul_long_long_long_ul_ul_ImageData(this, 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) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
       _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLImageElement(this, 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) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
       _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLCanvasElement(this, 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) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
       _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLVideoElement(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
@@ -3029,6 +1914,2317 @@
 
 
 @DocsEditable()
+@DomName('WebGLRenderingContextBase')
+@Experimental() // untriaged
+abstract class RenderingContextBase extends NativeFieldWrapperClass2 {
+  // To suppress missing implicit constructor warnings.
+  factory RenderingContextBase._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WebGLRenderingContextBase.ACTIVE_ATTRIBUTES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_ATTRIBUTES = 0x8B89;
+
+  @DomName('WebGLRenderingContextBase.ACTIVE_TEXTURE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_TEXTURE = 0x84E0;
+
+  @DomName('WebGLRenderingContextBase.ACTIVE_UNIFORMS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ACTIVE_UNIFORMS = 0x8B86;
+
+  @DomName('WebGLRenderingContextBase.ALIASED_LINE_WIDTH_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
+
+  @DomName('WebGLRenderingContextBase.ALIASED_POINT_SIZE_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
+
+  @DomName('WebGLRenderingContextBase.ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALPHA = 0x1906;
+
+  @DomName('WebGLRenderingContextBase.ALPHA_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALPHA_BITS = 0x0D55;
+
+  @DomName('WebGLRenderingContextBase.ALWAYS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ALWAYS = 0x0207;
+
+  @DomName('WebGLRenderingContextBase.ARRAY_BUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ARRAY_BUFFER = 0x8892;
+
+  @DomName('WebGLRenderingContextBase.ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ARRAY_BUFFER_BINDING = 0x8894;
+
+  @DomName('WebGLRenderingContextBase.ATTACHED_SHADERS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ATTACHED_SHADERS = 0x8B85;
+
+  @DomName('WebGLRenderingContextBase.BACK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BACK = 0x0405;
+
+  @DomName('WebGLRenderingContextBase.BLEND')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND = 0x0BE2;
+
+  @DomName('WebGLRenderingContextBase.BLEND_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_COLOR = 0x8005;
+
+  @DomName('WebGLRenderingContextBase.BLEND_DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_DST_ALPHA = 0x80CA;
+
+  @DomName('WebGLRenderingContextBase.BLEND_DST_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_DST_RGB = 0x80C8;
+
+  @DomName('WebGLRenderingContextBase.BLEND_EQUATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION = 0x8009;
+
+  @DomName('WebGLRenderingContextBase.BLEND_EQUATION_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION_ALPHA = 0x883D;
+
+  @DomName('WebGLRenderingContextBase.BLEND_EQUATION_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_EQUATION_RGB = 0x8009;
+
+  @DomName('WebGLRenderingContextBase.BLEND_SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_SRC_ALPHA = 0x80CB;
+
+  @DomName('WebGLRenderingContextBase.BLEND_SRC_RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLEND_SRC_RGB = 0x80C9;
+
+  @DomName('WebGLRenderingContextBase.BLUE_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BLUE_BITS = 0x0D54;
+
+  @DomName('WebGLRenderingContextBase.BOOL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL = 0x8B56;
+
+  @DomName('WebGLRenderingContextBase.BOOL_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC2 = 0x8B57;
+
+  @DomName('WebGLRenderingContextBase.BOOL_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC3 = 0x8B58;
+
+  @DomName('WebGLRenderingContextBase.BOOL_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BOOL_VEC4 = 0x8B59;
+
+  @DomName('WebGLRenderingContextBase.BROWSER_DEFAULT_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
+
+  @DomName('WebGLRenderingContextBase.BUFFER_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BUFFER_SIZE = 0x8764;
+
+  @DomName('WebGLRenderingContextBase.BUFFER_USAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BUFFER_USAGE = 0x8765;
+
+  @DomName('WebGLRenderingContextBase.BYTE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int BYTE = 0x1400;
+
+  @DomName('WebGLRenderingContextBase.CCW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CCW = 0x0901;
+
+  @DomName('WebGLRenderingContextBase.CLAMP_TO_EDGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CLAMP_TO_EDGE = 0x812F;
+
+  @DomName('WebGLRenderingContextBase.COLOR_ATTACHMENT0')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_ATTACHMENT0 = 0x8CE0;
+
+  @DomName('WebGLRenderingContextBase.COLOR_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_BUFFER_BIT = 0x00004000;
+
+  @DomName('WebGLRenderingContextBase.COLOR_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_CLEAR_VALUE = 0x0C22;
+
+  @DomName('WebGLRenderingContextBase.COLOR_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COLOR_WRITEMASK = 0x0C23;
+
+  @DomName('WebGLRenderingContextBase.COMPILE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPILE_STATUS = 0x8B81;
+
+  @DomName('WebGLRenderingContextBase.COMPRESSED_TEXTURE_FORMATS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
+
+  @DomName('WebGLRenderingContextBase.CONSTANT_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONSTANT_ALPHA = 0x8003;
+
+  @DomName('WebGLRenderingContextBase.CONSTANT_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONSTANT_COLOR = 0x8001;
+
+  @DomName('WebGLRenderingContextBase.CONTEXT_LOST_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CONTEXT_LOST_WEBGL = 0x9242;
+
+  @DomName('WebGLRenderingContextBase.CULL_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CULL_FACE = 0x0B44;
+
+  @DomName('WebGLRenderingContextBase.CULL_FACE_MODE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CULL_FACE_MODE = 0x0B45;
+
+  @DomName('WebGLRenderingContextBase.CURRENT_PROGRAM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CURRENT_PROGRAM = 0x8B8D;
+
+  @DomName('WebGLRenderingContextBase.CURRENT_VERTEX_ATTRIB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
+
+  @DomName('WebGLRenderingContextBase.CW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int CW = 0x0900;
+
+  @DomName('WebGLRenderingContextBase.DECR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DECR = 0x1E03;
+
+  @DomName('WebGLRenderingContextBase.DECR_WRAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DECR_WRAP = 0x8508;
+
+  @DomName('WebGLRenderingContextBase.DELETE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DELETE_STATUS = 0x8B80;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_ATTACHMENT = 0x8D00;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_BITS = 0x0D56;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_BUFFER_BIT = 0x00000100;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_CLEAR_VALUE = 0x0B73;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_COMPONENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_COMPONENT = 0x1902;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_COMPONENT16')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_COMPONENT16 = 0x81A5;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_FUNC = 0x0B74;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_RANGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_RANGE = 0x0B70;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_STENCIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_STENCIL = 0x84F9;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_STENCIL_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_TEST = 0x0B71;
+
+  @DomName('WebGLRenderingContextBase.DEPTH_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DEPTH_WRITEMASK = 0x0B72;
+
+  @DomName('WebGLRenderingContextBase.DITHER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DITHER = 0x0BD0;
+
+  @DomName('WebGLRenderingContextBase.DONT_CARE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DONT_CARE = 0x1100;
+
+  @DomName('WebGLRenderingContextBase.DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DST_ALPHA = 0x0304;
+
+  @DomName('WebGLRenderingContextBase.DST_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DST_COLOR = 0x0306;
+
+  @DomName('WebGLRenderingContextBase.DYNAMIC_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int DYNAMIC_DRAW = 0x88E8;
+
+  @DomName('WebGLRenderingContextBase.ELEMENT_ARRAY_BUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
+
+  @DomName('WebGLRenderingContextBase.ELEMENT_ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
+
+  @DomName('WebGLRenderingContextBase.EQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int EQUAL = 0x0202;
+
+  @DomName('WebGLRenderingContextBase.FASTEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FASTEST = 0x1101;
+
+  @DomName('WebGLRenderingContextBase.FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT = 0x1406;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_MAT2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT2 = 0x8B5A;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_MAT3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT3 = 0x8B5B;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_MAT4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_MAT4 = 0x8B5C;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC2 = 0x8B50;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC3 = 0x8B51;
+
+  @DomName('WebGLRenderingContextBase.FLOAT_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FLOAT_VEC4 = 0x8B52;
+
+  @DomName('WebGLRenderingContextBase.FRAGMENT_SHADER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAGMENT_SHADER = 0x8B30;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER = 0x8D40;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_BINDING = 0x8CA6;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_COMPLETE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_INCOMPLETE_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_INCOMPLETE_DIMENSIONS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
+
+  @DomName('WebGLRenderingContextBase.FRAMEBUFFER_UNSUPPORTED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
+
+  @DomName('WebGLRenderingContextBase.FRONT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT = 0x0404;
+
+  @DomName('WebGLRenderingContextBase.FRONT_AND_BACK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT_AND_BACK = 0x0408;
+
+  @DomName('WebGLRenderingContextBase.FRONT_FACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FRONT_FACE = 0x0B46;
+
+  @DomName('WebGLRenderingContextBase.FUNC_ADD')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_ADD = 0x8006;
+
+  @DomName('WebGLRenderingContextBase.FUNC_REVERSE_SUBTRACT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
+
+  @DomName('WebGLRenderingContextBase.FUNC_SUBTRACT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int FUNC_SUBTRACT = 0x800A;
+
+  @DomName('WebGLRenderingContextBase.GENERATE_MIPMAP_HINT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GENERATE_MIPMAP_HINT = 0x8192;
+
+  @DomName('WebGLRenderingContextBase.GEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GEQUAL = 0x0206;
+
+  @DomName('WebGLRenderingContextBase.GREATER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GREATER = 0x0204;
+
+  @DomName('WebGLRenderingContextBase.GREEN_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int GREEN_BITS = 0x0D53;
+
+  @DomName('WebGLRenderingContextBase.HIGH_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int HIGH_FLOAT = 0x8DF2;
+
+  @DomName('WebGLRenderingContextBase.HIGH_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int HIGH_INT = 0x8DF5;
+
+  @DomName('WebGLRenderingContextBase.IMPLEMENTATION_COLOR_READ_FORMAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
+
+  @DomName('WebGLRenderingContextBase.IMPLEMENTATION_COLOR_READ_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;
+
+  @DomName('WebGLRenderingContextBase.INCR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INCR = 0x1E02;
+
+  @DomName('WebGLRenderingContextBase.INCR_WRAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INCR_WRAP = 0x8507;
+
+  @DomName('WebGLRenderingContextBase.INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT = 0x1404;
+
+  @DomName('WebGLRenderingContextBase.INT_VEC2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC2 = 0x8B53;
+
+  @DomName('WebGLRenderingContextBase.INT_VEC3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC3 = 0x8B54;
+
+  @DomName('WebGLRenderingContextBase.INT_VEC4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INT_VEC4 = 0x8B55;
+
+  @DomName('WebGLRenderingContextBase.INVALID_ENUM')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_ENUM = 0x0500;
+
+  @DomName('WebGLRenderingContextBase.INVALID_FRAMEBUFFER_OPERATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
+
+  @DomName('WebGLRenderingContextBase.INVALID_OPERATION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_OPERATION = 0x0502;
+
+  @DomName('WebGLRenderingContextBase.INVALID_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVALID_VALUE = 0x0501;
+
+  @DomName('WebGLRenderingContextBase.INVERT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int INVERT = 0x150A;
+
+  @DomName('WebGLRenderingContextBase.KEEP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int KEEP = 0x1E00;
+
+  @DomName('WebGLRenderingContextBase.LEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LEQUAL = 0x0203;
+
+  @DomName('WebGLRenderingContextBase.LESS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LESS = 0x0201;
+
+  @DomName('WebGLRenderingContextBase.LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR = 0x2601;
+
+  @DomName('WebGLRenderingContextBase.LINEAR_MIPMAP_LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
+
+  @DomName('WebGLRenderingContextBase.LINEAR_MIPMAP_NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
+
+  @DomName('WebGLRenderingContextBase.LINES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINES = 0x0001;
+
+  @DomName('WebGLRenderingContextBase.LINE_LOOP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_LOOP = 0x0002;
+
+  @DomName('WebGLRenderingContextBase.LINE_STRIP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_STRIP = 0x0003;
+
+  @DomName('WebGLRenderingContextBase.LINE_WIDTH')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINE_WIDTH = 0x0B21;
+
+  @DomName('WebGLRenderingContextBase.LINK_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LINK_STATUS = 0x8B82;
+
+  @DomName('WebGLRenderingContextBase.LOW_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LOW_FLOAT = 0x8DF0;
+
+  @DomName('WebGLRenderingContextBase.LOW_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LOW_INT = 0x8DF3;
+
+  @DomName('WebGLRenderingContextBase.LUMINANCE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LUMINANCE = 0x1909;
+
+  @DomName('WebGLRenderingContextBase.LUMINANCE_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int LUMINANCE_ALPHA = 0x190A;
+
+  @DomName('WebGLRenderingContextBase.MAX_COMBINED_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
+
+  @DomName('WebGLRenderingContextBase.MAX_CUBE_MAP_TEXTURE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
+
+  @DomName('WebGLRenderingContextBase.MAX_FRAGMENT_UNIFORM_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
+
+  @DomName('WebGLRenderingContextBase.MAX_RENDERBUFFER_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
+
+  @DomName('WebGLRenderingContextBase.MAX_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
+
+  @DomName('WebGLRenderingContextBase.MAX_TEXTURE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_TEXTURE_SIZE = 0x0D33;
+
+  @DomName('WebGLRenderingContextBase.MAX_VARYING_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VARYING_VECTORS = 0x8DFC;
+
+  @DomName('WebGLRenderingContextBase.MAX_VERTEX_ATTRIBS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_ATTRIBS = 0x8869;
+
+  @DomName('WebGLRenderingContextBase.MAX_VERTEX_TEXTURE_IMAGE_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
+
+  @DomName('WebGLRenderingContextBase.MAX_VERTEX_UNIFORM_VECTORS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
+
+  @DomName('WebGLRenderingContextBase.MAX_VIEWPORT_DIMS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
+
+  @DomName('WebGLRenderingContextBase.MEDIUM_FLOAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MEDIUM_FLOAT = 0x8DF1;
+
+  @DomName('WebGLRenderingContextBase.MEDIUM_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MEDIUM_INT = 0x8DF4;
+
+  @DomName('WebGLRenderingContextBase.MIRRORED_REPEAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int MIRRORED_REPEAT = 0x8370;
+
+  @DomName('WebGLRenderingContextBase.NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST = 0x2600;
+
+  @DomName('WebGLRenderingContextBase.NEAREST_MIPMAP_LINEAR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
+
+  @DomName('WebGLRenderingContextBase.NEAREST_MIPMAP_NEAREST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
+
+  @DomName('WebGLRenderingContextBase.NEVER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NEVER = 0x0200;
+
+  @DomName('WebGLRenderingContextBase.NICEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NICEST = 0x1102;
+
+  @DomName('WebGLRenderingContextBase.NONE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NONE = 0;
+
+  @DomName('WebGLRenderingContextBase.NOTEQUAL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NOTEQUAL = 0x0205;
+
+  @DomName('WebGLRenderingContextBase.NO_ERROR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int NO_ERROR = 0;
+
+  @DomName('WebGLRenderingContextBase.ONE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE = 1;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_CONSTANT_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_CONSTANT_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_DST_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_DST_ALPHA = 0x0305;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_DST_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_DST_COLOR = 0x0307;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
+
+  @DomName('WebGLRenderingContextBase.ONE_MINUS_SRC_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ONE_MINUS_SRC_COLOR = 0x0301;
+
+  @DomName('WebGLRenderingContextBase.OUT_OF_MEMORY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int OUT_OF_MEMORY = 0x0505;
+
+  @DomName('WebGLRenderingContextBase.PACK_ALIGNMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int PACK_ALIGNMENT = 0x0D05;
+
+  @DomName('WebGLRenderingContextBase.POINTS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POINTS = 0x0000;
+
+  @DomName('WebGLRenderingContextBase.POLYGON_OFFSET_FACTOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_FACTOR = 0x8038;
+
+  @DomName('WebGLRenderingContextBase.POLYGON_OFFSET_FILL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_FILL = 0x8037;
+
+  @DomName('WebGLRenderingContextBase.POLYGON_OFFSET_UNITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int POLYGON_OFFSET_UNITS = 0x2A00;
+
+  @DomName('WebGLRenderingContextBase.RED_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RED_BITS = 0x0D52;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER = 0x8D41;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_ALPHA_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_BINDING = 0x8CA7;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_BLUE_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_DEPTH_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_GREEN_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_HEIGHT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_HEIGHT = 0x8D43;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_INTERNAL_FORMAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_RED_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_STENCIL_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
+
+  @DomName('WebGLRenderingContextBase.RENDERBUFFER_WIDTH')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERBUFFER_WIDTH = 0x8D42;
+
+  @DomName('WebGLRenderingContextBase.RENDERER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RENDERER = 0x1F01;
+
+  @DomName('WebGLRenderingContextBase.REPEAT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int REPEAT = 0x2901;
+
+  @DomName('WebGLRenderingContextBase.REPLACE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int REPLACE = 0x1E01;
+
+  @DomName('WebGLRenderingContextBase.RGB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB = 0x1907;
+
+  @DomName('WebGLRenderingContextBase.RGB565')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB565 = 0x8D62;
+
+  @DomName('WebGLRenderingContextBase.RGB5_A1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGB5_A1 = 0x8057;
+
+  @DomName('WebGLRenderingContextBase.RGBA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGBA = 0x1908;
+
+  @DomName('WebGLRenderingContextBase.RGBA4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int RGBA4 = 0x8056;
+
+  @DomName('WebGLRenderingContextBase.SAMPLER_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLER_2D = 0x8B5E;
+
+  @DomName('WebGLRenderingContextBase.SAMPLER_CUBE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLER_CUBE = 0x8B60;
+
+  @DomName('WebGLRenderingContextBase.SAMPLES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLES = 0x80A9;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_ALPHA_TO_COVERAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_BUFFERS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_BUFFERS = 0x80A8;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_COVERAGE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE = 0x80A0;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_COVERAGE_INVERT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
+
+  @DomName('WebGLRenderingContextBase.SAMPLE_COVERAGE_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
+
+  @DomName('WebGLRenderingContextBase.SCISSOR_BOX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SCISSOR_BOX = 0x0C10;
+
+  @DomName('WebGLRenderingContextBase.SCISSOR_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SCISSOR_TEST = 0x0C11;
+
+  @DomName('WebGLRenderingContextBase.SHADER_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHADER_TYPE = 0x8B4F;
+
+  @DomName('WebGLRenderingContextBase.SHADING_LANGUAGE_VERSION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
+
+  @DomName('WebGLRenderingContextBase.SHORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SHORT = 0x1402;
+
+  @DomName('WebGLRenderingContextBase.SRC_ALPHA')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_ALPHA = 0x0302;
+
+  @DomName('WebGLRenderingContextBase.SRC_ALPHA_SATURATE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_ALPHA_SATURATE = 0x0308;
+
+  @DomName('WebGLRenderingContextBase.SRC_COLOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SRC_COLOR = 0x0300;
+
+  @DomName('WebGLRenderingContextBase.STATIC_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STATIC_DRAW = 0x88E4;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_ATTACHMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_ATTACHMENT = 0x8D20;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_FAIL = 0x8801;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_FUNC = 0x8800;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_PASS_DEPTH_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_PASS_DEPTH_PASS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_REF')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_REF = 0x8CA3;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_VALUE_MASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BACK_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BITS = 0x0D57;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_BUFFER_BIT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_BUFFER_BIT = 0x00000400;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_CLEAR_VALUE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_CLEAR_VALUE = 0x0B91;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_FAIL = 0x0B94;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_FUNC')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_FUNC = 0x0B92;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_INDEX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_INDEX = 0x1901;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_INDEX8')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_INDEX8 = 0x8D48;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_PASS_DEPTH_FAIL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_PASS_DEPTH_PASS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_REF')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_REF = 0x0B97;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_TEST')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_TEST = 0x0B90;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_VALUE_MASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_VALUE_MASK = 0x0B93;
+
+  @DomName('WebGLRenderingContextBase.STENCIL_WRITEMASK')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STENCIL_WRITEMASK = 0x0B98;
+
+  @DomName('WebGLRenderingContextBase.STREAM_DRAW')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int STREAM_DRAW = 0x88E0;
+
+  @DomName('WebGLRenderingContextBase.SUBPIXEL_BITS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int SUBPIXEL_BITS = 0x0D50;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE = 0x1702;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE0')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE0 = 0x84C0;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE1 = 0x84C1;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE10')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE10 = 0x84CA;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE11')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE11 = 0x84CB;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE12')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE12 = 0x84CC;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE13')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE13 = 0x84CD;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE14')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE14 = 0x84CE;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE15')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE15 = 0x84CF;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE16')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE16 = 0x84D0;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE17')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE17 = 0x84D1;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE18')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE18 = 0x84D2;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE19')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE19 = 0x84D3;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE2')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE2 = 0x84C2;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE20')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE20 = 0x84D4;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE21')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE21 = 0x84D5;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE22')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE22 = 0x84D6;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE23')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE23 = 0x84D7;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE24')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE24 = 0x84D8;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE25')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE25 = 0x84D9;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE26')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE26 = 0x84DA;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE27')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE27 = 0x84DB;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE28')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE28 = 0x84DC;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE29')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE29 = 0x84DD;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE3')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE3 = 0x84C3;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE30')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE30 = 0x84DE;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE31')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE31 = 0x84DF;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE4 = 0x84C4;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE5')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE5 = 0x84C5;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE6')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE6 = 0x84C6;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE7')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE7 = 0x84C7;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE8')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE8 = 0x84C8;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE9')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE9 = 0x84C9;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_2D = 0x0DE1;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_BINDING_2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_BINDING_2D = 0x8069;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_BINDING_CUBE_MAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP = 0x8513;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_X')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_Y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_NEGATIVE_Z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_X')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_Y')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_CUBE_MAP_POSITIVE_Z')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_MAG_FILTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_MAG_FILTER = 0x2800;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_MIN_FILTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_MIN_FILTER = 0x2801;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_WRAP_S')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_WRAP_S = 0x2802;
+
+  @DomName('WebGLRenderingContextBase.TEXTURE_WRAP_T')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEXTURE_WRAP_T = 0x2803;
+
+  @DomName('WebGLRenderingContextBase.TRIANGLES')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLES = 0x0004;
+
+  @DomName('WebGLRenderingContextBase.TRIANGLE_FAN')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLE_FAN = 0x0006;
+
+  @DomName('WebGLRenderingContextBase.TRIANGLE_STRIP')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TRIANGLE_STRIP = 0x0005;
+
+  @DomName('WebGLRenderingContextBase.UNPACK_ALIGNMENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_ALIGNMENT = 0x0CF5;
+
+  @DomName('WebGLRenderingContextBase.UNPACK_COLORSPACE_CONVERSION_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
+
+  @DomName('WebGLRenderingContextBase.UNPACK_FLIP_Y_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
+
+  @DomName('WebGLRenderingContextBase.UNPACK_PREMULTIPLY_ALPHA_WEBGL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_BYTE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_BYTE = 0x1401;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_INT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_INT = 0x1405;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_SHORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT = 0x1403;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_SHORT_4_4_4_4')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_SHORT_5_5_5_1')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
+
+  @DomName('WebGLRenderingContextBase.UNSIGNED_SHORT_5_6_5')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
+
+  @DomName('WebGLRenderingContextBase.VALIDATE_STATUS')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VALIDATE_STATUS = 0x8B83;
+
+  @DomName('WebGLRenderingContextBase.VENDOR')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VENDOR = 0x1F00;
+
+  @DomName('WebGLRenderingContextBase.VERSION')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERSION = 0x1F02;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_ENABLED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_NORMALIZED')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_POINTER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_SIZE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_STRIDE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_ATTRIB_ARRAY_TYPE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
+
+  @DomName('WebGLRenderingContextBase.VERTEX_SHADER')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VERTEX_SHADER = 0x8B31;
+
+  @DomName('WebGLRenderingContextBase.VIEWPORT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int VIEWPORT = 0x0BA2;
+
+  @DomName('WebGLRenderingContextBase.ZERO')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int ZERO = 0;
+
+  @DomName('WebGLRenderingContextBase.canvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CanvasElement get canvas => _blink.BlinkWebGLRenderingContextBase.canvas_Getter(this);
+
+  @DomName('WebGLRenderingContextBase.drawingBufferHeight')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get drawingBufferHeight => _blink.BlinkWebGLRenderingContextBase.drawingBufferHeight_Getter(this);
+
+  @DomName('WebGLRenderingContextBase.drawingBufferWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get drawingBufferWidth => _blink.BlinkWebGLRenderingContextBase.drawingBufferWidth_Getter(this);
+
+  @DomName('WebGLRenderingContextBase.activeTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void activeTexture(int texture) => _blink.BlinkWebGLRenderingContextBase.activeTexture_Callback_ul(this, texture);
+
+  @DomName('WebGLRenderingContextBase.attachShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void attachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContextBase.attachShader_Callback_WebGLProgram_WebGLShader(this, program, shader);
+
+  @DomName('WebGLRenderingContextBase.bindAttribLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGLRenderingContextBase.bindAttribLocation_Callback_WebGLProgram_ul_DOMString(this, program, index, name);
+
+  @DomName('WebGLRenderingContextBase.bindBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGLRenderingContextBase.bindBuffer_Callback_ul_WebGLBuffer(this, target, buffer);
+
+  @DomName('WebGLRenderingContextBase.bindFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContextBase.bindFramebuffer_Callback_ul_WebGLFramebuffer(this, target, framebuffer);
+
+  @DomName('WebGLRenderingContextBase.bindRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContextBase.bindRenderbuffer_Callback_ul_WebGLRenderbuffer(this, target, renderbuffer);
+
+  @DomName('WebGLRenderingContextBase.bindTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bindTexture(int target, Texture texture) => _blink.BlinkWebGLRenderingContextBase.bindTexture_Callback_ul_WebGLTexture(this, target, texture);
+
+  @DomName('WebGLRenderingContextBase.blendColor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContextBase.blendColor_Callback_float_float_float_float(this, red, green, blue, alpha);
+
+  @DomName('WebGLRenderingContextBase.blendEquation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendEquation(int mode) => _blink.BlinkWebGLRenderingContextBase.blendEquation_Callback_ul(this, mode);
+
+  @DomName('WebGLRenderingContextBase.blendEquationSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGLRenderingContextBase.blendEquationSeparate_Callback_ul_ul(this, modeRGB, modeAlpha);
+
+  @DomName('WebGLRenderingContextBase.blendFunc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGLRenderingContextBase.blendFunc_Callback_ul_ul(this, sfactor, dfactor);
+
+  @DomName('WebGLRenderingContextBase.blendFuncSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGLRenderingContextBase.blendFuncSeparate_Callback_ul_ul_ul_ul(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
+
+  @DomName('WebGLRenderingContextBase.bufferByteData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bufferByteData(int target, ByteBuffer data, int usage) => _blink.BlinkWebGLRenderingContextBase.bufferData_Callback_ul_ArrayBuffer_ul(this, target, data, usage);
+
+  void bufferData(int target, data_OR_size, int usage) {
+    if ((usage is int || usage == null) && (data_OR_size is int || data_OR_size == null) && (target is int || target == null)) {
+      _blink.BlinkWebGLRenderingContextBase.bufferData_Callback_ul_ll_ul(this, target, data_OR_size, usage);
+      return;
+    }
+    if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
+      _blink.BlinkWebGLRenderingContextBase.bufferData_Callback_ul_ArrayBufferView_ul(this, 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)) {
+      _blink.BlinkWebGLRenderingContextBase.bufferData_Callback_ul_ArrayBuffer_ul(this, target, data_OR_size, usage);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGLRenderingContextBase.bufferDataTyped')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bufferDataTyped(int target, TypedData data, int usage) => _blink.BlinkWebGLRenderingContextBase.bufferData_Callback_ul_ArrayBufferView_ul(this, target, data, usage);
+
+  @DomName('WebGLRenderingContextBase.bufferSubByteData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.BlinkWebGLRenderingContextBase.bufferSubData_Callback_ul_ll_ArrayBuffer(this, target, offset, data);
+
+  void bufferSubData(int target, int offset, data) {
+    if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
+      _blink.BlinkWebGLRenderingContextBase.bufferSubData_Callback_ul_ll_ArrayBufferView(this, target, offset, data);
+      return;
+    }
+    if ((data is ByteBuffer || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
+      _blink.BlinkWebGLRenderingContextBase.bufferSubData_Callback_ul_ll_ArrayBuffer(this, target, offset, data);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  @DomName('WebGLRenderingContextBase.bufferSubDataTyped')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void bufferSubDataTyped(int target, int offset, TypedData data) => _blink.BlinkWebGLRenderingContextBase.bufferSubData_Callback_ul_ll_ArrayBufferView(this, target, offset, data);
+
+  @DomName('WebGLRenderingContextBase.checkFramebufferStatus')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int checkFramebufferStatus(int target) => _blink.BlinkWebGLRenderingContextBase.checkFramebufferStatus_Callback_ul(this, target);
+
+  @DomName('WebGLRenderingContextBase.clear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clear(int mask) => _blink.BlinkWebGLRenderingContextBase.clear_Callback_ul(this, mask);
+
+  @DomName('WebGLRenderingContextBase.clearColor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContextBase.clearColor_Callback_float_float_float_float(this, red, green, blue, alpha);
+
+  @DomName('WebGLRenderingContextBase.clearDepth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearDepth(num depth) => _blink.BlinkWebGLRenderingContextBase.clearDepth_Callback_float(this, depth);
+
+  @DomName('WebGLRenderingContextBase.clearStencil')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearStencil(int s) => _blink.BlinkWebGLRenderingContextBase.clearStencil_Callback_long(this, s);
+
+  @DomName('WebGLRenderingContextBase.colorMask')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGLRenderingContextBase.colorMask_Callback_boolean_boolean_boolean_boolean(this, red, green, blue, alpha);
+
+  @DomName('WebGLRenderingContextBase.compileShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compileShader(Shader shader) => _blink.BlinkWebGLRenderingContextBase.compileShader_Callback_WebGLShader(this, shader);
+
+  @DomName('WebGLRenderingContextBase.compressedTexImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGLRenderingContextBase.compressedTexImage2D_Callback_ul_long_ul_long_long_long_ArrayBufferView(this, target, level, internalformat, width, height, border, data);
+
+  @DomName('WebGLRenderingContextBase.compressedTexSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGLRenderingContextBase.compressedTexSubImage2D_Callback_ul_long_long_long_long_long_ul_ArrayBufferView(this, target, level, xoffset, yoffset, width, height, format, data);
+
+  @DomName('WebGLRenderingContextBase.copyTexImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGLRenderingContextBase.copyTexImage2D_Callback_ul_long_ul_long_long_long_long_long(this, target, level, internalformat, x, y, width, height, border);
+
+  @DomName('WebGLRenderingContextBase.copyTexSubImage2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContextBase.copyTexSubImage2D_Callback_ul_long_long_long_long_long_long_long(this, target, level, xoffset, yoffset, x, y, width, height);
+
+  @DomName('WebGLRenderingContextBase.createBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Buffer createBuffer() => _blink.BlinkWebGLRenderingContextBase.createBuffer_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.createFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Framebuffer createFramebuffer() => _blink.BlinkWebGLRenderingContextBase.createFramebuffer_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.createProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Program createProgram() => _blink.BlinkWebGLRenderingContextBase.createProgram_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.createRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Renderbuffer createRenderbuffer() => _blink.BlinkWebGLRenderingContextBase.createRenderbuffer_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.createShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Shader createShader(int type) => _blink.BlinkWebGLRenderingContextBase.createShader_Callback_ul(this, type);
+
+  @DomName('WebGLRenderingContextBase.createTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Texture createTexture() => _blink.BlinkWebGLRenderingContextBase.createTexture_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.cullFace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void cullFace(int mode) => _blink.BlinkWebGLRenderingContextBase.cullFace_Callback_ul(this, mode);
+
+  @DomName('WebGLRenderingContextBase.deleteBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContextBase.deleteBuffer_Callback_WebGLBuffer(this, buffer);
+
+  @DomName('WebGLRenderingContextBase.deleteFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContextBase.deleteFramebuffer_Callback_WebGLFramebuffer(this, framebuffer);
+
+  @DomName('WebGLRenderingContextBase.deleteProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteProgram(Program program) => _blink.BlinkWebGLRenderingContextBase.deleteProgram_Callback_WebGLProgram(this, program);
+
+  @DomName('WebGLRenderingContextBase.deleteRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContextBase.deleteRenderbuffer_Callback_WebGLRenderbuffer(this, renderbuffer);
+
+  @DomName('WebGLRenderingContextBase.deleteShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteShader(Shader shader) => _blink.BlinkWebGLRenderingContextBase.deleteShader_Callback_WebGLShader(this, shader);
+
+  @DomName('WebGLRenderingContextBase.deleteTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void deleteTexture(Texture texture) => _blink.BlinkWebGLRenderingContextBase.deleteTexture_Callback_WebGLTexture(this, texture);
+
+  @DomName('WebGLRenderingContextBase.depthFunc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void depthFunc(int func) => _blink.BlinkWebGLRenderingContextBase.depthFunc_Callback_ul(this, func);
+
+  @DomName('WebGLRenderingContextBase.depthMask')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void depthMask(bool flag) => _blink.BlinkWebGLRenderingContextBase.depthMask_Callback_boolean(this, flag);
+
+  @DomName('WebGLRenderingContextBase.depthRange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void depthRange(num zNear, num zFar) => _blink.BlinkWebGLRenderingContextBase.depthRange_Callback_float_float(this, zNear, zFar);
+
+  @DomName('WebGLRenderingContextBase.detachShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void detachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContextBase.detachShader_Callback_WebGLProgram_WebGLShader(this, program, shader);
+
+  @DomName('WebGLRenderingContextBase.disable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void disable(int cap) => _blink.BlinkWebGLRenderingContextBase.disable_Callback_ul(this, cap);
+
+  @DomName('WebGLRenderingContextBase.disableVertexAttribArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void disableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContextBase.disableVertexAttribArray_Callback_ul(this, index);
+
+  @DomName('WebGLRenderingContextBase.drawArrays')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGLRenderingContextBase.drawArrays_Callback_ul_long_long(this, mode, first, count);
+
+  @DomName('WebGLRenderingContextBase.drawElements')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGLRenderingContextBase.drawElements_Callback_ul_long_ul_ll(this, mode, count, type, offset);
+
+  @DomName('WebGLRenderingContextBase.enable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void enable(int cap) => _blink.BlinkWebGLRenderingContextBase.enable_Callback_ul(this, cap);
+
+  @DomName('WebGLRenderingContextBase.enableVertexAttribArray')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void enableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContextBase.enableVertexAttribArray_Callback_ul(this, index);
+
+  @DomName('WebGLRenderingContextBase.finish')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void finish() => _blink.BlinkWebGLRenderingContextBase.finish_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.flush')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void flush() => _blink.BlinkWebGLRenderingContextBase.flush_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.framebufferRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContextBase.framebufferRenderbuffer_Callback_ul_ul_ul_WebGLRenderbuffer(this, target, attachment, renderbuffertarget, renderbuffer);
+
+  @DomName('WebGLRenderingContextBase.framebufferTexture2D')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGLRenderingContextBase.framebufferTexture2D_Callback_ul_ul_ul_WebGLTexture_long(this, target, attachment, textarget, texture, level);
+
+  @DomName('WebGLRenderingContextBase.frontFace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void frontFace(int mode) => _blink.BlinkWebGLRenderingContextBase.frontFace_Callback_ul(this, mode);
+
+  @DomName('WebGLRenderingContextBase.generateMipmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void generateMipmap(int target) => _blink.BlinkWebGLRenderingContextBase.generateMipmap_Callback_ul(this, target);
+
+  @DomName('WebGLRenderingContextBase.getActiveAttrib')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ActiveInfo getActiveAttrib(Program program, int index) => _blink.BlinkWebGLRenderingContextBase.getActiveAttrib_Callback_WebGLProgram_ul(this, program, index);
+
+  @DomName('WebGLRenderingContextBase.getActiveUniform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ActiveInfo getActiveUniform(Program program, int index) => _blink.BlinkWebGLRenderingContextBase.getActiveUniform_Callback_WebGLProgram_ul(this, program, index);
+
+  @DomName('WebGLRenderingContextBase.getAttachedShaders')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void getAttachedShaders(Program program) => _blink.BlinkWebGLRenderingContextBase.getAttachedShaders_Callback_WebGLProgram(this, program);
+
+  @DomName('WebGLRenderingContextBase.getAttribLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getAttribLocation(Program program, String name) => _blink.BlinkWebGLRenderingContextBase.getAttribLocation_Callback_WebGLProgram_DOMString(this, program, name);
+
+  @DomName('WebGLRenderingContextBase.getBufferParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getBufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContextBase.getBufferParameter_Callback_ul_ul(this, target, pname);
+
+  @DomName('WebGLRenderingContextBase.getContextAttributes')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ContextAttributes getContextAttributes() => _blink.BlinkWebGLRenderingContextBase.getContextAttributes_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.getError')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getError() => _blink.BlinkWebGLRenderingContextBase.getError_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.getExtension')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getExtension(String name) => _blink.BlinkWebGLRenderingContextBase.getExtension_Callback_DOMString(this, name);
+
+  @DomName('WebGLRenderingContextBase.getFramebufferAttachmentParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => _blink.BlinkWebGLRenderingContextBase.getFramebufferAttachmentParameter_Callback_ul_ul_ul(this, target, attachment, pname);
+
+  @DomName('WebGLRenderingContextBase.getParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getParameter(int pname) => _blink.BlinkWebGLRenderingContextBase.getParameter_Callback_ul(this, pname);
+
+  @DomName('WebGLRenderingContextBase.getProgramInfoLog')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getProgramInfoLog(Program program) => _blink.BlinkWebGLRenderingContextBase.getProgramInfoLog_Callback_WebGLProgram(this, program);
+
+  @DomName('WebGLRenderingContextBase.getProgramParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getProgramParameter(Program program, int pname) => _blink.BlinkWebGLRenderingContextBase.getProgramParameter_Callback_WebGLProgram_ul(this, program, pname);
+
+  @DomName('WebGLRenderingContextBase.getRenderbufferParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getRenderbufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContextBase.getRenderbufferParameter_Callback_ul_ul(this, target, pname);
+
+  @DomName('WebGLRenderingContextBase.getShaderInfoLog')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGLRenderingContextBase.getShaderInfoLog_Callback_WebGLShader(this, shader);
+
+  @DomName('WebGLRenderingContextBase.getShaderParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getShaderParameter(Shader shader, int pname) => _blink.BlinkWebGLRenderingContextBase.getShaderParameter_Callback_WebGLShader_ul(this, shader, pname);
+
+  @DomName('WebGLRenderingContextBase.getShaderPrecisionFormat')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.BlinkWebGLRenderingContextBase.getShaderPrecisionFormat_Callback_ul_ul(this, shadertype, precisiontype);
+
+  @DomName('WebGLRenderingContextBase.getShaderSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String getShaderSource(Shader shader) => _blink.BlinkWebGLRenderingContextBase.getShaderSource_Callback_WebGLShader(this, shader);
+
+  @DomName('WebGLRenderingContextBase.getSupportedExtensions')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> getSupportedExtensions() => _blink.BlinkWebGLRenderingContextBase.getSupportedExtensions_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.getTexParameter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getTexParameter(int target, int pname) => _blink.BlinkWebGLRenderingContextBase.getTexParameter_Callback_ul_ul(this, target, pname);
+
+  @DomName('WebGLRenderingContextBase.getUniform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getUniform(Program program, UniformLocation location) => _blink.BlinkWebGLRenderingContextBase.getUniform_Callback_WebGLProgram_WebGLUniformLocation(this, program, location);
+
+  @DomName('WebGLRenderingContextBase.getUniformLocation')
+  @DocsEditable()
+  @Experimental() // untriaged
+  UniformLocation getUniformLocation(Program program, String name) => _blink.BlinkWebGLRenderingContextBase.getUniformLocation_Callback_WebGLProgram_DOMString(this, program, name);
+
+  @DomName('WebGLRenderingContextBase.getVertexAttrib')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object getVertexAttrib(int index, int pname) => _blink.BlinkWebGLRenderingContextBase.getVertexAttrib_Callback_ul_ul(this, index, pname);
+
+  @DomName('WebGLRenderingContextBase.getVertexAttribOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGLRenderingContextBase.getVertexAttribOffset_Callback_ul_ul(this, index, pname);
+
+  @DomName('WebGLRenderingContextBase.hint')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void hint(int target, int mode) => _blink.BlinkWebGLRenderingContextBase.hint_Callback_ul_ul(this, target, mode);
+
+  @DomName('WebGLRenderingContextBase.isBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContextBase.isBuffer_Callback_WebGLBuffer(this, buffer);
+
+  @DomName('WebGLRenderingContextBase.isContextLost')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isContextLost() => _blink.BlinkWebGLRenderingContextBase.isContextLost_Callback(this);
+
+  @DomName('WebGLRenderingContextBase.isEnabled')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isEnabled(int cap) => _blink.BlinkWebGLRenderingContextBase.isEnabled_Callback_ul(this, cap);
+
+  @DomName('WebGLRenderingContextBase.isFramebuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContextBase.isFramebuffer_Callback_WebGLFramebuffer(this, framebuffer);
+
+  @DomName('WebGLRenderingContextBase.isProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isProgram(Program program) => _blink.BlinkWebGLRenderingContextBase.isProgram_Callback_WebGLProgram(this, program);
+
+  @DomName('WebGLRenderingContextBase.isRenderbuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContextBase.isRenderbuffer_Callback_WebGLRenderbuffer(this, renderbuffer);
+
+  @DomName('WebGLRenderingContextBase.isShader')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isShader(Shader shader) => _blink.BlinkWebGLRenderingContextBase.isShader_Callback_WebGLShader(this, shader);
+
+  @DomName('WebGLRenderingContextBase.isTexture')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool isTexture(Texture texture) => _blink.BlinkWebGLRenderingContextBase.isTexture_Callback_WebGLTexture(this, texture);
+
+  @DomName('WebGLRenderingContextBase.lineWidth')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void lineWidth(num width) => _blink.BlinkWebGLRenderingContextBase.lineWidth_Callback_float(this, width);
+
+  @DomName('WebGLRenderingContextBase.linkProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void linkProgram(Program program) => _blink.BlinkWebGLRenderingContextBase.linkProgram_Callback_WebGLProgram(this, program);
+
+  @DomName('WebGLRenderingContextBase.pixelStorei')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void pixelStorei(int pname, int param) => _blink.BlinkWebGLRenderingContextBase.pixelStorei_Callback_ul_long(this, pname, param);
+
+  @DomName('WebGLRenderingContextBase.polygonOffset')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void polygonOffset(num factor, num units) => _blink.BlinkWebGLRenderingContextBase.polygonOffset_Callback_float_float(this, factor, units);
+
+  @DomName('WebGLRenderingContextBase.readPixels')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGLRenderingContextBase.readPixels_Callback_long_long_long_long_ul_ul_ArrayBufferView(this, x, y, width, height, format, type, pixels);
+
+  @DomName('WebGLRenderingContextBase.renderbufferStorage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGLRenderingContextBase.renderbufferStorage_Callback_ul_ul_long_long(this, target, internalformat, width, height);
+
+  @DomName('WebGLRenderingContextBase.sampleCoverage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGLRenderingContextBase.sampleCoverage_Callback_float_boolean(this, value, invert);
+
+  @DomName('WebGLRenderingContextBase.scissor')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContextBase.scissor_Callback_long_long_long_long(this, x, y, width, height);
+
+  @DomName('WebGLRenderingContextBase.shaderSource')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void shaderSource(Shader shader, String string) => _blink.BlinkWebGLRenderingContextBase.shaderSource_Callback_WebGLShader_DOMString(this, shader, string);
+
+  @DomName('WebGLRenderingContextBase.stencilFunc')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGLRenderingContextBase.stencilFunc_Callback_ul_long_ul(this, func, ref, mask);
+
+  @DomName('WebGLRenderingContextBase.stencilFuncSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGLRenderingContextBase.stencilFuncSeparate_Callback_ul_ul_long_ul(this, face, func, ref, mask);
+
+  @DomName('WebGLRenderingContextBase.stencilMask')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilMask(int mask) => _blink.BlinkWebGLRenderingContextBase.stencilMask_Callback_ul(this, mask);
+
+  @DomName('WebGLRenderingContextBase.stencilMaskSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGLRenderingContextBase.stencilMaskSeparate_Callback_ul_ul(this, face, mask);
+
+  @DomName('WebGLRenderingContextBase.stencilOp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContextBase.stencilOp_Callback_ul_ul_ul(this, fail, zfail, zpass);
+
+  @DomName('WebGLRenderingContextBase.stencilOpSeparate')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContextBase.stencilOpSeparate_Callback_ul_ul_ul_ul(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]) {
+    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)) {
+      _blink.BlinkWebGLRenderingContextBase.texImage2D_Callback_ul_long_ul_long_long_long_ul_ul_ArrayBufferView(this, 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) {
+      _blink.BlinkWebGLRenderingContextBase.texImage2D_Callback_ul_long_ul_ul_ul_ImageData(this, 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) {
+      _blink.BlinkWebGLRenderingContextBase.texImage2D_Callback_ul_long_ul_ul_ul_HTMLImageElement(this, 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) {
+      _blink.BlinkWebGLRenderingContextBase.texImage2D_Callback_ul_long_ul_ul_ul_HTMLCanvasElement(this, 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) {
+      _blink.BlinkWebGLRenderingContextBase.texImage2D_Callback_ul_long_ul_ul_ul_HTMLVideoElement(this, 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");
+  }
+
+  @DomName('WebGLRenderingContextBase.texImage2DCanvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContextBase.texImage2D_Callback_ul_long_ul_ul_ul_HTMLCanvasElement(this, target, level, internalformat, format, type, canvas);
+
+  @DomName('WebGLRenderingContextBase.texImage2DImage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContextBase.texImage2D_Callback_ul_long_ul_ul_ul_HTMLImageElement(this, target, level, internalformat, format, type, image);
+
+  @DomName('WebGLRenderingContextBase.texImage2DImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContextBase.texImage2D_Callback_ul_long_ul_ul_ul_ImageData(this, target, level, internalformat, format, type, pixels);
+
+  @DomName('WebGLRenderingContextBase.texImage2DVideo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContextBase.texImage2D_Callback_ul_long_ul_ul_ul_HTMLVideoElement(this, target, level, internalformat, format, type, video);
+
+  @DomName('WebGLRenderingContextBase.texParameterf')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGLRenderingContextBase.texParameterf_Callback_ul_ul_float(this, target, pname, param);
+
+  @DomName('WebGLRenderingContextBase.texParameteri')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGLRenderingContextBase.texParameteri_Callback_ul_ul_long(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]) {
+    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)) {
+      _blink.BlinkWebGLRenderingContextBase.texSubImage2D_Callback_ul_long_long_long_long_long_ul_ul_ArrayBufferView(this, 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) {
+      _blink.BlinkWebGLRenderingContextBase.texSubImage2D_Callback_ul_long_long_long_ul_ul_ImageData(this, 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) {
+      _blink.BlinkWebGLRenderingContextBase.texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLImageElement(this, 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) {
+      _blink.BlinkWebGLRenderingContextBase.texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLCanvasElement(this, 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) {
+      _blink.BlinkWebGLRenderingContextBase.texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLVideoElement(this, 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");
+  }
+
+  @DomName('WebGLRenderingContextBase.texSubImage2DCanvas')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContextBase.texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLCanvasElement(this, target, level, xoffset, yoffset, format, type, canvas);
+
+  @DomName('WebGLRenderingContextBase.texSubImage2DImage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContextBase.texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLImageElement(this, target, level, xoffset, yoffset, format, type, image);
+
+  @DomName('WebGLRenderingContextBase.texSubImage2DImageData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContextBase.texSubImage2D_Callback_ul_long_long_long_ul_ul_ImageData(this, target, level, xoffset, yoffset, format, type, pixels);
+
+  @DomName('WebGLRenderingContextBase.texSubImage2DVideo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContextBase.texSubImage2D_Callback_ul_long_long_long_ul_ul_HTMLVideoElement(this, target, level, xoffset, yoffset, format, type, video);
+
+  @DomName('WebGLRenderingContextBase.uniform1f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGLRenderingContextBase.uniform1f_Callback_WebGLUniformLocation_float(this, location, x);
+
+  @DomName('WebGLRenderingContextBase.uniform1fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContextBase.uniform1fv_Callback_WebGLUniformLocation_Float32Array(this, location, v);
+
+  @DomName('WebGLRenderingContextBase.uniform1i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGLRenderingContextBase.uniform1i_Callback_WebGLUniformLocation_long(this, location, x);
+
+  @DomName('WebGLRenderingContextBase.uniform1iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform1iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContextBase.uniform1iv_Callback_WebGLUniformLocation_Int32Array(this, location, v);
+
+  @DomName('WebGLRenderingContextBase.uniform2f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGLRenderingContextBase.uniform2f_Callback_WebGLUniformLocation_float_float(this, location, x, y);
+
+  @DomName('WebGLRenderingContextBase.uniform2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContextBase.uniform2fv_Callback_WebGLUniformLocation_Float32Array(this, location, v);
+
+  @DomName('WebGLRenderingContextBase.uniform2i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGLRenderingContextBase.uniform2i_Callback_WebGLUniformLocation_long_long(this, location, x, y);
+
+  @DomName('WebGLRenderingContextBase.uniform2iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform2iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContextBase.uniform2iv_Callback_WebGLUniformLocation_Int32Array(this, location, v);
+
+  @DomName('WebGLRenderingContextBase.uniform3f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGLRenderingContextBase.uniform3f_Callback_WebGLUniformLocation_float_float_float(this, location, x, y, z);
+
+  @DomName('WebGLRenderingContextBase.uniform3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContextBase.uniform3fv_Callback_WebGLUniformLocation_Float32Array(this, location, v);
+
+  @DomName('WebGLRenderingContextBase.uniform3i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGLRenderingContextBase.uniform3i_Callback_WebGLUniformLocation_long_long_long(this, location, x, y, z);
+
+  @DomName('WebGLRenderingContextBase.uniform3iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform3iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContextBase.uniform3iv_Callback_WebGLUniformLocation_Int32Array(this, location, v);
+
+  @DomName('WebGLRenderingContextBase.uniform4f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContextBase.uniform4f_Callback_WebGLUniformLocation_float_float_float_float(this, location, x, y, z, w);
+
+  @DomName('WebGLRenderingContextBase.uniform4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContextBase.uniform4fv_Callback_WebGLUniformLocation_Float32Array(this, location, v);
+
+  @DomName('WebGLRenderingContextBase.uniform4i')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGLRenderingContextBase.uniform4i_Callback_WebGLUniformLocation_long_long_long_long(this, location, x, y, z, w);
+
+  @DomName('WebGLRenderingContextBase.uniform4iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniform4iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContextBase.uniform4iv_Callback_WebGLUniformLocation_Int32Array(this, location, v);
+
+  @DomName('WebGLRenderingContextBase.uniformMatrix2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContextBase.uniformMatrix2fv_Callback_WebGLUniformLocation_boolean_Float32Array(this, location, transpose, array);
+
+  @DomName('WebGLRenderingContextBase.uniformMatrix3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContextBase.uniformMatrix3fv_Callback_WebGLUniformLocation_boolean_Float32Array(this, location, transpose, array);
+
+  @DomName('WebGLRenderingContextBase.uniformMatrix4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContextBase.uniformMatrix4fv_Callback_WebGLUniformLocation_boolean_Float32Array(this, location, transpose, array);
+
+  @DomName('WebGLRenderingContextBase.useProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void useProgram(Program program) => _blink.BlinkWebGLRenderingContextBase.useProgram_Callback_WebGLProgram(this, program);
+
+  @DomName('WebGLRenderingContextBase.validateProgram')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void validateProgram(Program program) => _blink.BlinkWebGLRenderingContextBase.validateProgram_Callback_WebGLProgram(this, program);
+
+  @DomName('WebGLRenderingContextBase.vertexAttrib1f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGLRenderingContextBase.vertexAttrib1f_Callback_ul_float(this, indx, x);
+
+  @DomName('WebGLRenderingContextBase.vertexAttrib1fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib1fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContextBase.vertexAttrib1fv_Callback_ul_Float32Array(this, indx, values);
+
+  @DomName('WebGLRenderingContextBase.vertexAttrib2f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGLRenderingContextBase.vertexAttrib2f_Callback_ul_float_float(this, indx, x, y);
+
+  @DomName('WebGLRenderingContextBase.vertexAttrib2fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib2fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContextBase.vertexAttrib2fv_Callback_ul_Float32Array(this, indx, values);
+
+  @DomName('WebGLRenderingContextBase.vertexAttrib3f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGLRenderingContextBase.vertexAttrib3f_Callback_ul_float_float_float(this, indx, x, y, z);
+
+  @DomName('WebGLRenderingContextBase.vertexAttrib3fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib3fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContextBase.vertexAttrib3fv_Callback_ul_Float32Array(this, indx, values);
+
+  @DomName('WebGLRenderingContextBase.vertexAttrib4f')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContextBase.vertexAttrib4f_Callback_ul_float_float_float_float(this, indx, x, y, z, w);
+
+  @DomName('WebGLRenderingContextBase.vertexAttrib4fv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttrib4fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContextBase.vertexAttrib4fv_Callback_ul_Float32Array(this, indx, values);
+
+  @DomName('WebGLRenderingContextBase.vertexAttribPointer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGLRenderingContextBase.vertexAttribPointer_Callback_ul_long_ul_boolean_long_ll(this, indx, size, type, normalized, stride, offset);
+
+  @DomName('WebGLRenderingContextBase.viewport')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContextBase.viewport_Callback_long_long_long_long(this, x, y, width, height);
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('WebGLShader')
 class Shader extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index 8c520db..3360fa8 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -263,6 +263,7 @@
 # co19-roll r761
 LayoutTests/fast/animation/request-animation-frame-missing-arguments_t01: StaticWarning # co19-roll r761: Please triage this failure.
 LayoutTests/fast/backgrounds/001_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: StaticWarning # Issue 20939
 LayoutTests/fast/canvas/canvas-createImageBitmap-animated_t01: StaticWarning # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: StaticWarning # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: StaticWarning # co19-roll r761: Please triage this failure.
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 5b6b924..ac38257 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -5,14 +5,6 @@
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/core/List/sort_A01_t04: Fail, Pass, Timeout # Must be a bug in jsshell, test sometimes times out.
 
-[ $compiler == dart2js && $checked && $runtime == ie9 ]
-LibTest/core/Uri/encodeComponent_A01_t02: Skip
-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.
 [ $compiler == dart2js ]
@@ -87,7 +79,7 @@
 WebPlatformTest/dom/nodes/Node-replaceChild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/testFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
-[ $compiler == dart2js && $runtime != ie9 ]
+[ $compiler == dart2js ]
 LibTest/typed_data/ByteData/ByteData_A02_t01: fail # co19-roll r576: Please triage this failure
 LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError, Pass # Dart issue 15617
 
@@ -96,917 +88,6 @@
 LibTest/isolate/SendPort/send_A02_t06: RuntimeError # TODO(ahe): Please triage this failure.
 LibTest/core/Uri/Uri_A06_t03: Pass, Slow
 
-
-[ $compiler == dart2js && $runtime == ie9 ]
-LibTest/core/double/round_A01_t01: Fail # Issue: 8920
-LibTest/core/double/toStringAsExponential_A01_t04: Fail # Issue: 8920
-LibTest/core/double/toStringAsPrecision_A01_t04: Fail # Issue: 8920
-LibTest/core/int/compareTo_A01_t01: Fail # Issue: 8920
-LibTest/core/int/operator_left_shift_A01_t01: Fail # Issue: 8920
-LibTest/core/int/operator_remainder_A01_t03: Fail # Issue: 8920
-LibTest/core/int/operator_truncating_division_A01_t02: Fail # Issue: 8920
-LibTest/core/int/remainder_A01_t01: Fail # Issue: 8920
-LibTest/core/int/remainder_A01_t03: Fail # Issue: 8920
-LibTest/core/int/toRadixString_A01_t01: Fail # Issue: 8920
-LibTest/core/Map/Map_class_A01_t04: Skip # Issue 8096
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # Issue: 8920
-LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # Issue: 8920
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # Issue: 8920
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Issue: 8920
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Issue: 8920
-LibTest/isolate/ReceivePort/toSendPort_A01_t01: RuntimeError # Issue: 8920
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: Skip # http://dartbug.com/12635
-LibTest/async/Stream/Stream.periodic_A01_t01: Fail, Pass # Issue 16106
-LibTest/core/Stopwatch/elapsedTicks_A01_t01: Fail, Pass # Issue 16106
-LibTest/async/Timer/Timer.periodic_A01_t01: Fail, Pass # Issue 16110
-LibTest/async/Timer/Timer_A01_t01: Fail, Pass # Issue 16110
-LibTest/collection/LinkedList/add_A01_t01: Skip # Slow tests that needs extra time to finish.
-LibTest/core/Uri/Uri_A06_t03: Skip # Issue 13511
-LibTest/math/cos_A01_t01: Fail # co19 issue 44
-LibTest/html/IFrameElement/addEventListener_A01_t04: Pass, RuntimeError # Issue: 19356
-
-
-# co19 roll untriaged failures.  Please triage these.
-Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # co19-roll r607: Please triage this failure
-Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # co19-roll r607: Please triage this failure
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Skip # co19-roll r651: Please triage this failure
-LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/DOMException/prototype-object_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/DOMImplementation/createDocumentType-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/createElement-invalid-names_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/title-property-creates-title-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/title-property-set-multiple-times_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Element/class-name_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Element/client-rect-list-argument_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Element/getClientRects_t01: Skip # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Element/hostname-host_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: Skip # co19-roll r607: Please triage this failure
-LayoutTests/fast/dom/Element/scrollWidth_t01: Skip # co19-roll r607: Please triage this failure
-LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/article-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/aside-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/details-add-child-1_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/details-add-child-2_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/details-click-controls_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/details-mouse-click_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/disable-style-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/draggable_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/figcaption-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/figure-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/footer-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/header-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/hgroup-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/hidden-attr-dom_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/hidden-attr_t01: Skip # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/main-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/mark-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/range-point-in-range-for-different-documents_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/section-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/text-field-input-types_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/unknown-tag_t01: Skip # co19-roll r607: Please triage this failure
-LayoutTests/fast/innerHTML/innerHTML-case_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/innerHTML/javascript-url_t01: Skip # co19-roll r706: Please triage this failure.
-LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Document/childNodes_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Document/clone_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Document/clone_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Document/contains_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Document/getElementsByName_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Document/importNode_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/Element.tag_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/appendHtml_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/appendText_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/blur_A01_t01: Skip # co19-roll r607: Please triage this failure
-LibTest/html/Element/contentEditable_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/dataset_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/draggable_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/draggable_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/enteredView_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/getBoundingClientRect_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/hidden_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/leftView_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/ownerDocument_A01_t05: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/replaceWith_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/spellcheck_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/spellcheck_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/tagName_A01_t03: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/translate_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/onAbort_A01_t01: Skip # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/onError_A01_t02: Skip # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/onLoadEnd_A01_t01: Skip # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/onLoadStart_A01_t01: Skip # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/overrideMimeType_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/request_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/responseText_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure
-LibTest/html/HttpRequest/responseText_A01_t02: Skip # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/status_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onAbort_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onError_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/appendText_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/contains_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/contentEdge_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/draggable_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/draggable_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/getBoundingClientRect_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/hidden_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/onClick_A01_t01: Skip # co19-roll r607: Please triage this failure
-LibTest/html/Window/close_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/document_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/find_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/find_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/find_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/find_A03_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/find_A03_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/find_A04_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/find_A05_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/find_A06_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/find_A07_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/moveBy_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/moveTo_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/moveTo_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/open_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/postMessage_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/postMessage_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/resizeBy_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Window/resizeTo_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A02_t02: RuntimeError, Pass # co19-roll r706: Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A02_t03: RuntimeError, Pass # co19-roll r706: Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A02_t04: RuntimeError, Pass # co19-roll r706: Please triage this failure.
-LibTest/isolate/Isolate/spawn_A02_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
-LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError, Pass # co19-roll r706: Please triage this failure.
-LibTest/math/MutableRectangle/MutableRectangle_A01_t01: Pass
-LibTest/math/MutableRectangle/boundingBox_A01_t02: RuntimeError, Pass # co19-roll r706: Please triage this failure.
-LibTest/math/Rectangle/Rectangle_A01_t01: Pass
-LibTest/math/Rectangle/boundingBox_A01_t02: RuntimeError, Pass # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/concepts/type_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/concepts/type_A07_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/namespace_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/definitions/template-contents_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # co19-roll r706: Please triage this failure.
-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 r706: Please triage this failure.
-WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/template-element/content-attribute_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/template-element/template-content-node-document_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/html-templates/template-element/template-content_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-004_t02: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-006_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-008_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-009_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-010_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-011_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-012_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-013_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-014_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-015_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-016_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-018_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-019_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-020_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # co19-roll r706: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # co19-roll r706: Please triage this failure.
-
-LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/get-href-attribute-port_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hash_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-prevents-rebase_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLBaseElement/multiple-base-elements_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDocument/title-get_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDocument/title-set_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-before-text-node_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-child-node_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text-form-control_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-children_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-remove-add-children_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control-child_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-value-change_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-empty-string_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-false-string_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-invalid-string_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-false_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-true_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-ancestor-missing_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-false_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-true_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-true-string_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-false_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-false_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-true_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-invalid-value_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-true_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-value-caseinsensitive_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/translate_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLFontElement/size-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLHtmlElement/duplicate-html-element-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLImageElement/image-src-absolute-url_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLInputElement/cloned-input-checked-state_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLInputElement/input-hidden-value_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLInputElement/input-size-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLabelElement/focus-label_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/onload-completion-test_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLObjectElement/children-changed_t01: Pass, RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-reset-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-validity_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-value_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLProgressElement/indeterminate-progress-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLProgressElement/set-progress-properties_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/named-options_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/select-selectedOptions_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/selected-false_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onerror-handler_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onload-handler_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onload_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTableElement/cellpadding-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTableElement/table-with-invalid-border_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/cloneNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/content-outlives-template-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/contentWrappers_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/cycles_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/ownerDocument_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/added-out-of-order_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/callback-arguments_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/clear-transient-without-delivery_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/create-during-delivery_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/cross-document_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/delivery-order_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/disconnect-cancel-pending_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/disconnect-transient-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/document-fragment-insertion_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/mutate-during-delivery_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/mutation-record-constructor_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/mutation-record-nullity_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observe-characterdata_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observe-exceptions_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observe-subtree_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observer-wrapper-dropoff-transient_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observer-wrapper-dropoff_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/removed-out-of-order_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/takeRecords_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/transient-gc-crash_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/contains-method_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Node/fragment-mutation_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/NodeIterator/NodeIterator-basic_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/NodeList/invalidate-node-lists-when-parsing_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/NodeList/nodelist-moved-to-fragment-2_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/NodeList/nodelist-reachable_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/13000_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/31684_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/create-contextual-fragment-script-not-ran_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/create-contextual-fragment-script-unmark-already-started_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/create-contextual-fragment_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/deleted-range-endpoints_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/getClientRects-character_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-delete-contents-event-fire-crash_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-expand_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-extractContents_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-modifycontents_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-on-detached-node_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-processing-instructions_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/surroundContents-1_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Selection/collapseToX-empty-selection_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Selection/getRangeAt_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip, RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t01: Skip # co19-roll r722: Please triage this failure.
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t05: Skip # co19-roll r722: Please triage this failure.
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/IFrameElement/ownerDocument_A01_t05: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/IFrameElement/spellcheck_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/IFrameElement/spellcheck_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/IFrameElement/translate_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/addEventListener_A01_t01: Skip # co19-roll r722: Please triage this failure.
-LibTest/html/Node/addEventListener_A01_t03: Skip # co19-roll r722: Please triage this failure.
-LibTest/html/Node/addEventListener_A01_t04: Skip # co19-roll r722: Please triage this failure.
-LibTest/html/Node/addEventListener_A01_t05: Skip # co19-roll r722: Please triage this failure.
-LibTest/html/Node/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/append_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/contains_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/contains_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/nodes_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/nodes_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/parent_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/previousNode_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/removeEventListener_A01_t01: Skip # co19-roll r722: Please triage this failure.
-LibTest/html/Node/removeEventListener_A01_t02: Skip # co19-roll r722: Please triage this failure.
-WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/EventTarget/dispatchEvent_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/events/defaultPrevented_A01_t05: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/events/type_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/CharacterData/deleteData_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/CharacterData/insertData_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Comment-constructor_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/DOMImplementation-hasFeature_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Document-createElementNS_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Document-createElementNS_t02: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Node-parentElement_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Node-textContent_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/attributes_A06_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t02: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttribute_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # co19-roll r722: Please triage this failure.
-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-type-extensions_t01: Pass, 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/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-no-child-on-empty_t01: Pass, 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-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
@@ -1535,8 +616,6 @@
 LibTest/isolate/Isolate/spawnUri_A01_t05: Fail # co19-roll r672: Please triage this failure
 
 [ $compiler == dart2js ]
-LibTest/core/double/operator_multiplication_A01_t05: RuntimeError # Maybe an issue with r40061? Please triage this failure
-LibTest/core/double/operator_multiplication_A01_t09: RuntimeError # Maybe an issue with r40061? Please triage this failure
 LibTest/core/List/List_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
 Language/03_Overview/2_Privacy_A01_t02: RuntimeError # co19-roll r667: Please triage this failure
 Language/12_Expressions/20_Logical_Boolean_Expressions_A06_t16: RuntimeError # co19-roll r667: Please triage this failure
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index c149ca0..83f7c3d 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -327,6 +327,7 @@
 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.
+LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # co19-roll r722: Please triage this failure.
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -633,6 +634,9 @@
 WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: Skip # Issue 20540.
 
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
+Language/14_Libraries_and_Scripts/3_Parts_A01_t05: Skip # Times out flakily. Issue 20881
+LibTest/collection/ListBase/ListBase_class_A01_t02: Skip # Times out flakily. Issue 20956
+LibTest/core/List/List_class_A01_t02: Skip # Times out flakily. Issue 20956
 LibTest/math/log_A01_t01: Pass, Fail # co19 issue 44.
 LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError # Issue 19127.
 LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError # co19-roll r761: Please triage this failure.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index e7e8251..328cf86 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -2,19 +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.
 
-# Failing on vm-linux-release-optcounter-threshold-be only. There seems to
-# be no way to disable only that configuration though.
-[ $runtime == vm && $system == linux && $mode == release ]
-LibTest/core/Duration/operator_lt_A01_t01: Skip # Issue 20875
-LibTest/core/Duration/operator_lte_A01_t01: Skip # Issue 20875
-LibTest/core/Duration/operator_gte_A01_t01: Skip # Issue 20875
-LibTest/core/Duration/operator_mult_A01_t01: Skip # Issue 20875
-LibTest/core/Duration/operator_gt_A01_t01: Skip # Issue 20875
-LibTest/core/Duration/operator_plus_A01_t01: Skip # Issue 20875
-LibTest/core/Duration/operator_eq_A01_t01: Skip # Issue 20875
-LibTest/core/Duration/operator_minus_A01_t01: Skip # Issue 20875
-LibTest/core/Duration/operator_div_A01_t01: Skip # Issue 20875
-
 
 [ $compiler == none && ($runtime == vm || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 9c7c0b9..9424907 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -29,6 +29,7 @@
 exit_code_test: Skip # This tests requires checked mode.
 
 [ $checked ]
+uri_retention_test: Pass, Slow
 deferred_mirrors_test: Pass, Slow
 mirror_final_field_inferrer2_test: Pass, Slow
 
@@ -54,5 +55,5 @@
 analyze_api_test: Pass, Slow # DON'T CHANGE THIS LINE -- SEE ABOVE.
 analyze_dart2js_test: Pass, Slow # DON'T CHANGE THIS LINE -- SEE ABOVE.
 
-[ $jscl || $runtime == drt || $runtime == dartium || $runtime == ff || $runtime == firefox || $runtime == chrome || $runtime == safari || $runtime == ie9 || $runtime == opera ]
+[ $jscl || $runtime == drt || $runtime == dartium || $runtime == ff || $runtime == firefox || $runtime == chrome || $runtime == safari || $runtime == opera ]
 *: Skip # dart2js uses #import('dart:io'); and it is not self-hosted (yet).
diff --git a/tests/compiler/dart2js/http_launch_data/http_launch_main.dart b/tests/compiler/dart2js/http_launch_data/http_launch_main.dart
new file mode 100644
index 0000000..68ea634
--- /dev/null
+++ b/tests/compiler/dart2js/http_launch_data/http_launch_main.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 'lib1.dart';
+
+main() {
+  print(foo());
+}
diff --git a/tests/compiler/dart2js/http_launch_data/http_launch_main_package.dart b/tests/compiler/dart2js/http_launch_data/http_launch_main_package.dart
new file mode 100644
index 0000000..ec876b3
--- /dev/null
+++ b/tests/compiler/dart2js/http_launch_data/http_launch_main_package.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 'package:simple/simple.dart';
+
+main() {
+  print(foo());
+}
diff --git a/tests/compiler/dart2js/http_launch_data/lib1.dart b/tests/compiler/dart2js/http_launch_data/lib1.dart
new file mode 100644
index 0000000..7e4ab7e
--- /dev/null
+++ b/tests/compiler/dart2js/http_launch_data/lib1.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo() => "hello http tester";
diff --git a/tests/compiler/dart2js/http_launch_data/packages/simple/simple.dart b/tests/compiler/dart2js/http_launch_data/packages/simple/simple.dart
new file mode 100644
index 0000000..7e4ab7e
--- /dev/null
+++ b/tests/compiler/dart2js/http_launch_data/packages/simple/simple.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo() => "hello http tester";
diff --git a/tests/compiler/dart2js/http_launch_data/pkcert/README b/tests/compiler/dart2js/http_launch_data/pkcert/README
new file mode 100644
index 0000000..fe764a9
--- /dev/null
+++ b/tests/compiler/dart2js/http_launch_data/pkcert/README
@@ -0,0 +1,16 @@
+This is a certificate database used by Dart for testing purposes.
+
+It is created as a certificate database by NSS (Network Security Services),
+a library from Mozilla, using the certutil tool.  It uses a cert9.db file,
+rather than a cert8.db file, so the database directory must be specified with
+"sql:" in front of the directory path, or the environment variable
+NSS_DEFAULT_DB_TYPE must be set to "sql".
+
+The password for the key database is "dartdart".
+
+The database contains a root certificate from Equifax, used to verify the
+client https connection to www.google.dk.  It contains a self-signed
+certificate for a local certificate authority myauthority_cert, and a
+server certificate for localhost called localhost_cert, signed by
+myauthority_cert.  It contains the key for localhost_cert, but
+not the key for myauthority_cert.
diff --git a/tests/compiler/dart2js/http_launch_data/pkcert/cert9.db b/tests/compiler/dart2js/http_launch_data/pkcert/cert9.db
new file mode 100644
index 0000000..497fca6
--- /dev/null
+++ b/tests/compiler/dart2js/http_launch_data/pkcert/cert9.db
Binary files differ
diff --git a/tests/compiler/dart2js/http_launch_data/pkcert/key4.db b/tests/compiler/dart2js/http_launch_data/pkcert/key4.db
new file mode 100644
index 0000000..fc06432
--- /dev/null
+++ b/tests/compiler/dart2js/http_launch_data/pkcert/key4.db
Binary files differ
diff --git a/tests/compiler/dart2js/http_test.dart b/tests/compiler/dart2js/http_test.dart
new file mode 100644
index 0000000..aed6ddd
--- /dev/null
+++ b/tests/compiler/dart2js/http_test.dart
@@ -0,0 +1,181 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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:
+//   *) Compiling a script fetched over HTTP.
+//   *) Importing a library fetched over HTTP.
+//   *) Automatically resolving package_root when script is fetched over HTTP.
+
+library http_launch_test;
+
+import 'dart:async';
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+
+Uri pathOfData = Platform.script.resolve('http_launch_data/');
+Directory tempDir;
+String outFilePath;
+
+_sendNotFound(HttpResponse response) {
+  response.statusCode = HttpStatus.NOT_FOUND;
+  response.close();
+}
+
+Future handleRequest(HttpRequest request) {
+  final String path = request.uri.path.substring(1);
+  final Uri requestPath = pathOfData.resolve(path);
+  final File file = new File(requestPath.toFilePath());
+  return file.exists().then((bool found) {
+    if (found) {
+      file.openRead()
+          .pipe(request.response)
+          .catchError((e) { _sendNotFound(request.response); });
+    } else {
+      _sendNotFound(request.response);
+    }
+  });
+}
+
+Future launchDart2Js(args) {
+  String ext = Platform.isWindows ? '.bat' : '';
+  String command =
+      path.normalize(path.join(path.fromUri(Platform.script),
+                    '../../../../sdk/bin/dart2js${ext}'));
+  return Process.run(command, args);
+}
+
+void check(ProcessResult result) {
+  Expect.equals(0, result.exitCode);
+  File outFile = new File(outFilePath);
+  Expect.isTrue(outFile.existsSync());
+  Expect.isTrue(outFile.readAsStringSync().contains("hello http tester"));
+}
+
+void checkNotFound(ProcessResult result, String filename) {
+  Expect.notEquals(0, result.exitCode);
+  File outFile = new File(outFilePath);
+  Expect.isTrue(result.stdout.contains("404"));
+  Expect.isTrue(result.stdout.contains(filename));
+}
+
+cleanup() {
+  File outFile = new File(outFilePath);
+  if (outFile.existsSync()) {
+    outFile.deleteSync();
+  }
+}
+
+Future testNonHttp() {
+  String inFilePath = pathOfData.resolve('http_launch_main.dart').toFilePath();
+  List<String> args = [inFilePath, "--out=" + outFilePath];
+  return launchDart2Js(args)
+      .then(check)
+      .then((_) { cleanup(); });
+}
+
+Future testHttpMain(String serverUrl) {
+  String inFilePath = '$serverUrl/http_launch_main.dart';
+  List<String> args = [inFilePath, "--out=" + outFilePath];
+  return launchDart2Js(args)
+      .then(check)
+      .then((_) { cleanup(); });
+}
+
+Future testHttpLib(String serverUrl) {
+  File file = new File(path.join(tempDir.path, "in.dart"));
+  file.writeAsStringSync("""
+  import '$serverUrl/lib1.dart';
+  main() { print(foo()); }
+  """);
+  String inFilePath = file.path;
+  List<String> args = [inFilePath, "--out=" + outFilePath];
+  return launchDart2Js(args)
+      .then(check)
+      .whenComplete(file.deleteSync)
+      .then((_) { cleanup(); });
+}
+
+Future testHttpPackage(String serverUrl) {
+  String inFilePath =
+      pathOfData.resolve('http_launch_main_package.dart').toFilePath();
+  String packageRoot = '$serverUrl/packages/';
+  List<String> args = [inFilePath,
+                       "--out=" + outFilePath,
+                       "--package-root=" + packageRoot];
+  return launchDart2Js(args)
+      .then(check)
+      .then((_) { cleanup(); });
+}
+
+Future testBadHttp(String serverUrl) {
+  File file = new File(path.join(tempDir.path, "in_bad.dart"));
+  file.writeAsStringSync("""
+  import '$serverUrl/not_existing.dart';
+  main() { print(foo()); }
+  """);
+  String inFilePath = file.path;
+  List<String> args = [inFilePath, "--out=" + outFilePath];
+  return launchDart2Js(args)
+      .then((pr) => checkNotFound(pr, "not_existing.dart"))
+      .whenComplete(file.deleteSync)
+      .then((_) { cleanup(); });
+}
+
+Future testBadHttp2(String serverUrl) {
+  String inFilePath = '$serverUrl/not_found.dart';
+  List<String> args = [inFilePath, "--out=" + outFilePath];
+  return launchDart2Js(args)
+      .then((processResult) => checkNotFound(processResult, "not_found.dart"))
+      .then((_) { cleanup(); });
+}
+
+serverRunning(HttpServer server, String scheme) {
+  tempDir = Directory.systemTemp.createTempSync('directory_test');
+  outFilePath = path.join(tempDir.path, "out.js");
+  int port = server.port;
+  String serverUrl = "$scheme://127.0.0.1:$port";
+
+  asyncStart();
+  server.listen(handleRequest);
+  return new Future.value()
+       .then((_) => cleanup())  // Make sure we start fresh.
+       .then((_) => testNonHttp())
+       .then((_) => testHttpMain(serverUrl))
+       .then((_) => testHttpLib(serverUrl))
+       .then((_) => testHttpPackage(serverUrl))
+       .then((_) => testBadHttp(serverUrl))
+       .then((_) => testBadHttp2(serverUrl))
+       .whenComplete(() => tempDir.delete(recursive: true))
+       .whenComplete(server.close)
+       .then((_) => asyncEnd());
+}
+
+Future testHttp() {
+  return HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0)
+      .then((HttpServer server) => serverRunning(server, "http"));
+}
+
+void initializeSSL() {
+  Uri pathOfPkcert = pathOfData.resolve('pkcert');
+  String testPkcertDatabase = pathOfPkcert.toFilePath();
+  SecureSocket.initialize(database: testPkcertDatabase,
+                          password: 'dartdart');
+}
+
+Future testHttps() {
+  initializeSSL();
+  return HttpServer.bindSecure(InternetAddress.LOOPBACK_IP_V4,
+                               0,
+                               certificateName: 'localhost_cert')
+      .then((HttpServer server) => serverRunning(server, "https"));
+}
+
+main() {
+  asyncStart();
+  testHttp()
+    .then((_) => testHttps)
+    .whenComplete(asyncEnd);
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index e955036..3492258 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -26,10 +26,6 @@
 operator_test: Skip
 string_interpolation_test: Skip
 
-[ $compiler == dart2js && $runtime == ie9 ]
-class_test: Fail
-deferred/*: Skip # http://dartbug.com/12635
-
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 no_such_method_mirrors_test: Pass, Slow # TODO(kasperl): Please triage.
 
diff --git a/tests/corelib/big_integer_vm_test.dart b/tests/corelib/big_integer_vm_test.dart
index e57b3be..5936c34 100644
--- a/tests/corelib/big_integer_vm_test.dart
+++ b/tests/corelib/big_integer_vm_test.dart
@@ -2,190 +2,1662 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // Testing Bigints.
-// TODO(srdjan): Make sure the numbers are Bigint and not Mint or Smi.
 
 library big_integer_test;
 import "package:expect/expect.dart";
 
-class BigIntegerTest {
+foo() => 1234567890123456789;
+bar() => 12345678901234567890;
 
-  static foo() {
-    return 1234567890123456789;
-  }
+testSmiOverflow() {
+  var a = 1073741823;
+  var b = 1073741822;
+  Expect.equals(2147483645, a + b);
+  a = -1000000000;
+  b =  1000000001;
+  Expect.equals(-2000000001, a - b);
+  Expect.equals(-1000000001000000000, a * b);
+}
 
-  static testSmiOverflow() {
-    var a = 1073741823;
-    var b = 1073741822;
-    Expect.equals(2147483645, a + b);
-    a = -1000000000;
-    b =  1000000001;
-    Expect.equals(-2000000001, a - b);
-    Expect.equals(-1000000001000000000, a * b);
-  }
+testBigintAdd() {
+  // Bigint and Smi.
+  var a = 12345678901234567890;
+  var b = 2;
+  Expect.equals(12345678901234567892, a + b);
+  Expect.equals(12345678901234567892, b + a);
+  // Bigint and Bigint.
+  a = 10000000000000000001;
+  Expect.equals(20000000000000000002, a + a);
+  // Bigint and double.
+  a = 100000000000000000000.0;
+  b = 200000000000000000000;
+  Expect.isTrue((a + b) is double);
+  Expect.equals(300000000000000000000.0, a + b);
+  Expect.isTrue((b + a) is double);
+  Expect.equals(300000000000000000000.0, b + a);
+}
 
-  static testBigintAdd() {
-    // Bigint and Smi.
-    var a = 12345678901234567890;
-    var b = 2;
-    Expect.equals(12345678901234567892, a + b);
-    Expect.equals(12345678901234567892, b + a);
-    // Bigint and Bigint.
-    a = 10000000000000000001;
-    Expect.equals(20000000000000000002, a + a);
-    // Bigint and double.
-    a = 100000000000.0;
-    b = 100000000000;
-    Expect.equals(200000000000.0, a + b);
-    Expect.equals(200000000000.0, b + a);
-  }
+testBigintSub() {
+  // Bigint and Smi.
+  var a = 12345678901234567890;
+  var b = 2;
+  Expect.equals(12345678901234567888, a - b);
+  Expect.equals(-12345678901234567888, b - a);
+  // Bigint and Bigint.
+  a = 10000000000000000001;
+  Expect.equals(20000000000000000002, a + a);
+  // Bigint and double.
+  a = 100000000000000000000.0;
+  b = 200000000000000000000;
+  Expect.isTrue((a + b) is double);
+  Expect.equals(-100000000000000000000.0, a - b);
+  Expect.isTrue((b + a) is double);
+  Expect.equals(100000000000000000000.0, b - a);
+  Expect.equals(-1, 0xF00000000 - 0xF00000001);
+}
 
-  static testBigintSub() {
-    // Bigint and Smi.
-    var a = 12345678901234567890;
-    var b = 2;
-    Expect.equals(12345678901234567888, a - b);
-    Expect.equals(-12345678901234567888, b - a);
-    // Bigint and Bigint.
-    a = 10000000000000000001;
-    Expect.equals(20000000000000000002, a + a);
-    // Bigint and double.
-    a = 100000000000.0;
-    b = 100000000000;
-    Expect.equals(200000000000.0, a + b);
-    Expect.equals(200000000000.0, b + a);
-    Expect.equals(-1, 0xF00000000 - 0xF00000001);
-  }
+testBigintMul() {
+  // Bigint and Smi.
+  var a = 12345678901234567890;
+  var b = 10;
+  Expect.equals(123456789012345678900, a * b);
+  Expect.equals(123456789012345678900, b * a);
+  // Bigint and Bigint.
+  a = 12345678901234567890;
+  b = 10000000000000000;
+  Expect.equals(123456789012345678900000000000000000, a * b);
+  // Bigint and double.
+  a = 2.0;
+  b = 200000000000000000000;
+  Expect.isTrue((a * b) is double);
+  Expect.equals(400000000000000000000.0, a * b);
+  Expect.isTrue((b * a) is double);
+  Expect.equals(400000000000000000000.0, b * a);
+}
 
-  static testBigintMul() {
-    // Bigint and Smi.
-    var a = 12345678901234567890;
-    var b = 10;
-    Expect.equals(123456789012345678900, a * b);
-    Expect.equals(123456789012345678900, b * a);
-    // Bigint and Bigint.
-    a = 12345678901234567890;
-    b = 10000000000000000;
-    Expect.equals(123456789012345678900000000000000000, a * b);
-    // Bigint and double.
-    a = 200.0;
-    b = 100000000000;
-    Expect.equals(20000000000000.0, a * b);
-    Expect.equals(20000000000000.0, b * a);
-  }
+testBigintHugeMul() {
+  var block = 32 * 256;   // 32 bit digits with 8 bit 'carry'.
+  var bits = block * 32;  // plenty of blocks in longest column sum;
+  var a = 1 << bits;
+  var a1 = a - 1;      // all 1's
+  var p1 = a1 * a1;
+  var p2 = a * a - a - a + 1;
+  // Use isTrue instead of equals to avoid trying to print such big numbers.
+  Expect.isTrue(p1 == p2, 'products do not match');
+}
 
-  static testBigintHugeMul() {
-    var block = 28 * 256;   // 28 bit chunks with 8 bit 'carry' in a DoubleChunk.
-    var bits = block * 32;  // plenty of blocks in longest column sum;
-    var a = 1 << bits;
-    var a1 = a - 1;      // all 1's
-    var p1 = a1 * a1;
-    var p2 = a * a - a - a + 1;
-    // Use isTrue instead of equals to avoid trying to print such big numbers.
-    Expect.isTrue(p1 == p2, 'products do not match');
-  }
+testBigintTruncDiv() {
+  var a = 12345678901234567890;
+  var b = 10;
+  // Bigint and Smi.
+  Expect.equals(1234567890123456789, a ~/ b);
+  Expect.equals(0, b ~/ a);
+  Expect.equals(123456789, 123456789012345678 ~/ 1000000000);
+  // Bigint and Bigint.
+  a = 12345678901234567890;
+  b = 10000000000000000;
+  Expect.equals(1234, a ~/ b);
+  // Bigint and double.
+  a = 100000000000000000000.0;
+  b = 200000000000000000000;
+  Expect.equals(0, a ~/ b);
+  Expect.equals(2, b ~/ a);
+}
 
-  static testBigintTruncDiv() {
-    var a = 12345678901234567890;
-    var b = 10;
-    // Bigint and Smi.
-    Expect.equals(1234567890123456789, a ~/ b);
-    Expect.equals(0, b ~/ a);
-    Expect.equals(123456789, 123456789012345678 ~/ 1000000000);
-    // Bigint and Bigint.
-    a = 12345678901234567890;
-    b = 10000000000000000;
-    Expect.equals(1234, a ~/ b);
-    // Bigint and double.
-    a = 200.0;
-    b = 100000000000;
-    Expect.equals(0.0, a ~/ b);
-    Expect.equals(500000000.0, b ~/ a);
-  }
+testBigintDiv() {
+  // Bigint and Smi.
+  Expect.equals(1234567890123456789.1, 12345678901234567891 / 10);
+  Expect.equals(0.000000001234, 1234 / 1000000000000);
+  Expect.equals(12345678901234000000.0, 123456789012340000000 / 10);
+  // Bigint and Bigint.
+  var a = 12345670000000000000;
+  var b = 10000000000000000;
+  Expect.equals(1234.567, a / b);
+  // Bigint and double.
+  a = 400000000000000000000.0;
+  b = 200000000000000000000;
+  Expect.equals(2.0, a / b);
+  Expect.equals(0.5, b / a);
+}
 
-  static testBigintDiv() {
-    // Bigint and Smi.
-    Expect.equals(1234567890123456789.1, 12345678901234567891 / 10);
-    Expect.equals(0.000000001234, 1234 / 1000000000000);
-    Expect.equals(12345678901234000000.0, 123456789012340000000 / 10);
-    // Bigint and Bigint.
-    var a = 12345670000000000000;
-    var b = 10000000000000000;
-    Expect.equals(1234.567, a / b);
-    // Bigint and double.
-    a = 200.0;
-    b = 100000000000;
-    Expect.equals(0.000000002, a / b);
-    Expect.equals(500000000.0, b / a);
-  }
-
-  static testBigintModulo() {
-    // Bigint and Smi.
-    var a = 1000000000005;
-    var b = 10;
-    Expect.equals(5, a % b);
-    Expect.equals(10, b % a);
-    // Bigint & Bigint
-    a = 10000000000000000001;
-    b = 10000000000000000000;
-    Expect.equals(1, a % b);
-    Expect.equals(10000000000000000000, b % a);
-    // Bigint & double.
-    a = 100000000001.0;
-    b = 100000000000;
-    Expect.equals(1.0, a % b);
-    Expect.equals(100000000000.0, b % a);
-    // Transitioning from Mint to Bigint.
-    var iStart = 4611686018427387900;
-    var prevX = -23 % iStart;
-    for (int i = iStart + 1; i < iStart + 10; i++) {
-      var x = -23 % i;
-      Expect.equals(1, x - prevX);
-      Expect.isTrue(x > 0);
-      prevX = x;
-    }
-  }
-
-  static testBigintNegate() {
-    var a = 0xF000000000F;
-    var b = ~a;  // negate.
-    Expect.equals(-0xF0000000010, b);
-    Expect.equals(0, a & b);
-    Expect.equals(-1, a | b);
-  }
-
-  static testShiftAmount() {
-    Expect.equals(0, 12 >> 111111111111111111111111111111);
-    Expect.equals(-1, -12 >> 111111111111111111111111111111);
-    bool exceptionCaught = false;
-    try {
-      var a = 1 << 1111111111111111111111111111;
-    } on OutOfMemoryError catch (e) {
-      exceptionCaught = true;
-    }
-    Expect.equals(true, exceptionCaught);
-  }
-
-  static testMain() {
-    Expect.equals(1234567890123456789, foo());
-    testSmiOverflow();
-    testBigintAdd();
-    testBigintSub();
-    testBigintMul();
-    testBigintHugeMul();
-    testBigintModulo();
-    testBigintTruncDiv();
-    testBigintDiv();
-    testBigintNegate();
-    testShiftAmount();
-    Expect.equals(1234567890123456, (1234567890123456).abs());
-    Expect.equals(1234567890123456, (-1234567890123456).abs());
-    var a = 10000000000000000000;
-    var b = 10000000000000000001;
-    Expect.equals(false, a.hashCode == b.hashCode);
-    Expect.equals(true, a.hashCode == (b - 1).hashCode);
+testBigintModulo() {
+  // Bigint and Smi.
+  var a = 1000000000005;
+  var b = 10;
+  Expect.equals(5, a % b);
+  Expect.equals(10, b % a);
+  // Bigint & Bigint
+  a = 10000000000000000001;
+  b = 10000000000000000000;
+  Expect.equals(1, a % b);
+  Expect.equals(10000000000000000000, b % a);
+  // Bigint & double.
+  a = 10000000100000000.0;
+  b = 10000000000000000;
+  Expect.equals(100000000.0, a % b);
+  Expect.equals(10000000000000000.0, b % a);
+  // Transitioning from Mint to Bigint.
+  var iStart = 4611686018427387900;
+  var prevX = -23 % iStart;
+  for (int i = iStart + 1; i < iStart + 10; i++) {
+    var x = -23 % i;
+    Expect.equals(1, x - prevX);
+    Expect.isTrue(x > 0);
+    prevX = x;
   }
 }
 
+testBigintNegate() {
+  var a = 0xF000000000000000F;
+  var b = ~a;  // negate.
+  Expect.equals(-0xF0000000000000010, b);
+  Expect.equals(0, a & b);
+  Expect.equals(-1, a | b);
+}
+
+testShiftAmount() {
+  Expect.equals(0, 12 >> 111111111111111111111111111111);
+  Expect.equals(-1, -12 >> 111111111111111111111111111111);
+  bool exceptionCaught = false;
+  try {
+    var a = 1 << 1111111111111111111111111111;
+  } on OutOfMemoryError catch (e) {
+    exceptionCaught = true;
+  }
+  Expect.equals(true, exceptionCaught);
+}
+
+addSubParsed(String a, String b, String sum) {
+  int int_a = int.parse(a);
+  int int_b = int.parse(b);
+  int int_sum = int.parse(sum);
+  int computed_sum = int_a + int_b;
+  Expect.equals(int_sum, computed_sum);
+  String str_sum = computed_sum >= 0 ?
+      "0x${computed_sum.toRadixString(16)}" :
+      "-0x${(-computed_sum).toRadixString(16)}";
+  Expect.equals(sum.toLowerCase(), str_sum);
+  int computed_difference1 = int_sum - int_a;
+  Expect.equals(int_b, computed_difference1);
+  String str_difference1 = computed_difference1 >= 0 ?
+      "0x${computed_difference1.toRadixString(16)}" :
+      "-0x${(-computed_difference1).toRadixString(16)}";
+  Expect.equals(b.toLowerCase(), str_difference1);
+  int computed_difference2 = int_sum - int_b;
+  Expect.equals(int_a, computed_difference2);
+  String str_difference2 = computed_difference2 >= 0 ?
+      "0x${computed_difference2.toRadixString(16)}" :
+      "-0x${(-computed_difference2).toRadixString(16)}";
+  Expect.equals(a.toLowerCase(), str_difference2);
+}
+
+testBigintAddSub() {
+  String zero = "0x0";
+  String one = "0x1";
+  String minus_one = "-0x1";
+
+  addSubParsed(zero, zero, zero);
+  addSubParsed(zero, one, one);
+  addSubParsed(one, zero, one);
+  addSubParsed(one, one, "0x2");
+  addSubParsed(minus_one, minus_one, "-0x2");
+  addSubParsed("0x123", zero, "0x123");
+  addSubParsed(zero, "0x123", "0x123");
+  addSubParsed("0x123", one, "0x124");
+  addSubParsed(one, "0x123", "0x124");
+  addSubParsed("0xFFFFFFF", one,  // 28 bit overflow.
+               "0x10000000");
+  addSubParsed("0xFFFFFFFF", one,  // 32 bit overflow.
+               "0x100000000");
+  addSubParsed("0xFFFFFFFFFFFFFF", one,  // 56 bit overflow.
+               "0x100000000000000");
+  addSubParsed("0xFFFFFFFFFFFFFFFF", one,  // 64 bit overflow.
+               "0x10000000000000000");
+  addSubParsed("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",  // 128 bit.
+               one,
+               "0x100000000000000000000000000000000");
+  addSubParsed("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+               one,
+               "0x10000000000000000000000000000000000000000000");
+  addSubParsed("0x8000000",  // 28 bit overflow.
+               "0x8000000",
+               "0x10000000");
+  addSubParsed("0x80000000",  // 32 bit overflow.
+               "0x80000000",
+               "0x100000000");
+  addSubParsed("0x80000000000000",  // 56 bit overflow.
+               "0x80000000000000",
+               "0x100000000000000");
+  addSubParsed("0x8000000000000000",  // 64 bit overflow.
+               "0x8000000000000000",
+               "0x10000000000000000");
+  addSubParsed("0x80000000000000000000000000000000",  // 128 bit.
+               "0x80000000000000000000000000000000",
+               "0x100000000000000000000000000000000");
+  addSubParsed("0x8000000000000000000000000000000000000000000",
+               "0x8000000000000000000000000000000000000000000",
+               "0x10000000000000000000000000000000000000000000");
+
+  {
+    String a = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    String sum1 = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF1";
+    String times2 = "0x2468ACF13579BDE02468ACF121579BDE02468ACF13579BDE0";
+    addSubParsed(a, zero, a);
+    addSubParsed(a, one, sum1);
+    addSubParsed(a, a, times2);
+  }
+
+  addSubParsed("-0x123", minus_one, "-0x124");
+  addSubParsed(minus_one, "-0x123", "-0x124");
+  addSubParsed("-0xFFFFFFF", minus_one,  // 28 bit overflow.
+               "-0x10000000");
+  addSubParsed("-0xFFFFFFFF", minus_one,  // 32 bit overflow.
+               "-0x100000000");
+  addSubParsed("-0xFFFFFFFFFFFFFF", minus_one,  // 56 bit overflow.
+               "-0x100000000000000");
+  addSubParsed("-0xFFFFFFFFFFFFFFFF", minus_one,  // 64 bit overflow.
+               "-0x10000000000000000");
+  addSubParsed("-0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",  // 128 bit.
+               minus_one,
+               "-0x100000000000000000000000000000000");
+  addSubParsed("-0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+               minus_one,
+               "-0x10000000000000000000000000000000000000000000");
+  addSubParsed("-0x8000000",  // 28 bit overflow.
+               "-0x8000000",
+               "-0x10000000");
+  addSubParsed("-0x80000000",  // 32 bit overflow.
+               "-0x80000000",
+               "-0x100000000");
+  addSubParsed("-0x80000000000000",  // 56 bit overflow.
+               "-0x80000000000000",
+               "-0x100000000000000");
+  addSubParsed("-0x8000000000000000",  // 64 bit overflow.
+               "-0x8000000000000000",
+               "-0x10000000000000000");
+  addSubParsed("-0x80000000000000000000000000000000",  // 128 bit.
+               "-0x80000000000000000000000000000000",
+               "-0x100000000000000000000000000000000");
+  addSubParsed("-0x8000000000000000000000000000000000000000000",
+               "-0x8000000000000000000000000000000000000000000",
+               "-0x10000000000000000000000000000000000000000000");
+
+  {
+    String a = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
+    String sum1 = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF1";
+    String times2 = "-0x2468ACF13579BDE02468ACF121579BDE02468ACF13579BDE0";
+    addSubParsed(a, zero, a);
+    addSubParsed(a, minus_one, sum1);
+    addSubParsed(a, a, times2);
+  }
+
+  addSubParsed("0x10000000000000000000000000000000000000000000",
+               "0xFFFF",
+               "0x1000000000000000000000000000000000000000FFFF");
+  addSubParsed("0x10000000000000000000000000000000000000000000",
+               "0xFFFF00000000",
+               "0x10000000000000000000000000000000FFFF00000000");
+  addSubParsed("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+               "0x100000000",
+               "0x1000000000000000000000000000000000000FFFFFFFF");
+  addSubParsed("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+               "0x10000000000000000000",
+               "0x10000000000000000000000000FFFFFFFFFFFFFFFFFFF");
+
+  addSubParsed("0xB", "-0x7", "0x4");
+  addSubParsed("-0xB", "-0x7", "-0x12");
+  addSubParsed("0xB", "0x7", "0x12");
+  addSubParsed("-0xB", "0x7", "-0x4");
+  addSubParsed("-0x7", "0xB", "0x4");
+  addSubParsed("-0x7", "-0xB", "-0x12");
+  addSubParsed("0x7", "0xB", "0x12");
+  addSubParsed("0x7", "-0xB", "-0x4");
+}
+
+shiftLeftParsed(String a, int amount, String result) {
+  int int_a = int.parse(a);
+  int int_result = int.parse(result);
+  int shifted = int_a << amount;
+  Expect.equals(int_result, shifted);
+  String str_shifted = shifted >= 0 ?
+      "0x${shifted.toRadixString(16)}" :
+      "-0x${(-shifted).toRadixString(16)}";
+  Expect.equals(result.toLowerCase(), str_shifted);
+  int back_shifted = shifted >> amount;
+  Expect.equals(int_a, back_shifted);
+  String str_back_shifted = back_shifted >= 0 ?
+      "0x${back_shifted.toRadixString(16)}" :
+      "-0x${(-back_shifted).toRadixString(16)}";
+  Expect.equals(a.toLowerCase(), str_back_shifted);
+}
+
+testBigintLeftShift() {
+  String zero = "0x0";
+  String one = "0x1";
+  String minus_one = "-0x1";
+
+  shiftLeftParsed(zero, 0, zero);
+  shiftLeftParsed(one, 0, one);
+  shiftLeftParsed("0x1234", 0, "0x1234");
+  shiftLeftParsed(zero, 100000, zero);
+  shiftLeftParsed(one, 1, "0x2");
+  shiftLeftParsed(one, 28, "0x10000000");
+  shiftLeftParsed(one, 32, "0x100000000");
+  shiftLeftParsed(one, 64, "0x10000000000000000");
+  shiftLeftParsed("0x5", 28, "0x50000000");
+  shiftLeftParsed("0x5", 32, "0x500000000");
+  shiftLeftParsed("0x5", 56, "0x500000000000000");
+  shiftLeftParsed("0x5", 64, "0x50000000000000000");
+  shiftLeftParsed("0x5", 128, "0x500000000000000000000000000000000");
+  shiftLeftParsed("0x5", 27, "0x28000000");
+  shiftLeftParsed("0x5", 31, "0x280000000");
+  shiftLeftParsed("0x5", 55, "0x280000000000000");
+  shiftLeftParsed("0x5", 63, "0x28000000000000000");
+  shiftLeftParsed("0x5", 127, "0x280000000000000000000000000000000");
+  shiftLeftParsed("0x8000001", 1, "0x10000002");
+  shiftLeftParsed("0x80000001", 1, "0x100000002");
+  shiftLeftParsed("0x8000000000000001", 1, "0x10000000000000002");
+  shiftLeftParsed("0x8000001", 29, "0x100000020000000");
+  shiftLeftParsed("0x80000001", 33, "0x10000000200000000");
+  shiftLeftParsed("0x8000000000000001", 65,
+                  "0x100000000000000020000000000000000");
+  shiftLeftParsed(minus_one, 0, minus_one);
+  shiftLeftParsed("-0x1234", 0, "-0x1234");
+  shiftLeftParsed(minus_one, 1, "-0x2");
+  shiftLeftParsed(minus_one, 28, "-0x10000000");
+  shiftLeftParsed(minus_one, 32, "-0x100000000");
+  shiftLeftParsed(minus_one, 64, "-0x10000000000000000");
+  shiftLeftParsed("-0x5", 28, "-0x50000000");
+  shiftLeftParsed("-0x5", 32, "-0x500000000");
+  shiftLeftParsed("-0x5", 64, "-0x50000000000000000");
+  shiftLeftParsed("-0x5", 27, "-0x28000000");
+  shiftLeftParsed("-0x5", 31, "-0x280000000");
+  shiftLeftParsed("-0x5", 63, "-0x28000000000000000");
+  shiftLeftParsed("-0x8000001", 1, "-0x10000002");
+  shiftLeftParsed("-0x80000001", 1, "-0x100000002");
+  shiftLeftParsed("-0x8000000000000001", 1, "-0x10000000000000002");
+  shiftLeftParsed("-0x8000001", 29, "-0x100000020000000");
+  shiftLeftParsed("-0x80000001", 33, "-0x10000000200000000");
+  shiftLeftParsed("-0x8000000000000001", 65,
+                  "-0x100000000000000020000000000000000");
+}
+
+shiftRightParsed(String a, int amount, String result) {
+  int int_a = int.parse(a);
+  int int_result = int.parse(result);
+  int shifted = int_a >> amount;
+  Expect.equals(int_result, shifted);
+  String str_shifted = shifted >= 0 ?
+      "0x${shifted.toRadixString(16)}" :
+      "-0x${(-shifted).toRadixString(16)}";
+  Expect.equals(result.toLowerCase(), str_shifted);
+}
+
+testBigintRightShift() {
+  String zero = "0x0";
+  String one = "0x1";
+  String minus_one = "-0x1";
+
+  shiftRightParsed(one, 1, zero);
+  shiftRightParsed(minus_one, 1, minus_one);
+  shiftRightParsed("-0x2", 1, minus_one);
+  shiftRightParsed("0x12345678", 29, zero);
+  shiftRightParsed("-0x12345678", 29, minus_one);
+  shiftRightParsed("-0x12345678", 100, minus_one);
+  shiftRightParsed("0x5", 1, "0x2");
+  shiftRightParsed("0x5", 2, "0x1");
+  shiftRightParsed("-0x5", 1, "-0x3");
+  shiftRightParsed("-0x5", 2, "-0x2");
+  shiftRightParsed("0x10000001", 28, one);
+  shiftRightParsed("0x100000001", 32, one);
+  shiftRightParsed("0x10000000000000001", 64, one);
+  shiftRightParsed("-0x10000001", 28, "-0x2");
+  shiftRightParsed("-0x100000001", 32, "-0x2");
+  shiftRightParsed("-0x10000000000000001", 64, "-0x2");
+  shiftRightParsed("0x30000000", 29, one);
+  shiftRightParsed("0x300000000", 33, one);
+  shiftRightParsed("0x30000000000000000", 65, one);
+  shiftRightParsed("-0x30000000", 29, "-0x2");
+  shiftRightParsed("-0x300000000", 33, "-0x2");
+  shiftRightParsed("-0x30000000000000000", 65, "-0x2");
+}
+
+bitAndParsed(String a, String b, String result) {
+  int int_a = int.parse(a);
+  int int_b = int.parse(b);
+  int int_result = int.parse(result);
+  int anded = int_a & int_b;
+  Expect.equals(int_result, anded);
+  String str_anded = anded >= 0 ?
+      "0x${anded.toRadixString(16)}" :
+      "-0x${(-anded).toRadixString(16)}";
+  Expect.equals(result.toLowerCase(), str_anded);
+  int anded2 = int_b & int_a;
+  Expect.equals(int_result, anded2);
+  String str_anded2 = anded2 >= 0 ?
+      "0x${anded2.toRadixString(16)}" :
+      "-0x${(-anded2).toRadixString(16)}";
+  Expect.equals(result.toLowerCase(), str_anded2);
+}
+
+testBigintBitAnd() {
+  String zero = "0x0";
+  String one = "0x1";
+  String minus_one = "-0x1";
+
+  bitAndParsed(one, zero, zero);
+  bitAndParsed(one, one, one);
+  bitAndParsed(minus_one, zero, zero);
+  bitAndParsed(minus_one, one, one);
+  bitAndParsed(minus_one, minus_one, minus_one);
+  bitAndParsed("0x5", "0x3", one);
+  bitAndParsed("0x5", minus_one, "0x5");
+  bitAndParsed("0x50000000", one, zero);
+  bitAndParsed("0x50000000", minus_one, "0x50000000");
+  bitAndParsed("0x500000000", one, zero);
+  bitAndParsed("0x500000000", minus_one, "0x500000000");
+  bitAndParsed("0x50000000000000000", one, zero);
+  bitAndParsed("0x50000000000000000", minus_one, "0x50000000000000000");
+  bitAndParsed("-0x50000000", "-0x50000000", "-0x50000000");
+  bitAndParsed("-0x500000000", "-0x500000000", "-0x500000000");
+  bitAndParsed("-0x50000000000000000",
+               "-0x50000000000000000",
+               "-0x50000000000000000");
+  bitAndParsed("0x1234567890ABCDEF012345678",
+               "0x876543210FEDCBA0987654321",
+               "0x224422000A9C9A0002244220");
+  bitAndParsed("-0x1234567890ABCDEF012345678",
+               "-0x876543210FEDCBA0987654321",
+               "-0x977557799FEFCFEF997755778");
+  bitAndParsed("0x1234567890ABCDEF012345678",
+               "-0x876543210FEDCBA0987654321",
+               "0x101014589002044F010101458");
+  bitAndParsed("0x1234567890ABCDEF012345678FFFFFFFFFFFFFFFFFFFFFFFFF",
+               "-0x876543210FEDCBA0987654321",
+               "0x1234567890ABCDEF012345678789ABCDEF012345F6789ABCDF");
+  bitAndParsed("0x12345678", "0xFFFFFFF", "0x2345678");
+  bitAndParsed("0x123456789", "0xFFFFFFFF", "0x23456789");
+  bitAndParsed("-0x10000000", "0xFFFFFFF", "0x0");
+  bitAndParsed("-0x100000000", "0xFFFFFFFF", "0x0");
+  bitAndParsed("-0x10000001", "0xFFFFFFF", "0xFFFFFFF");
+  bitAndParsed("-0x100000001", "0xFFFFFFFF", "0xFFFFFFFF");
+  bitAndParsed("-0x10000001", "0x3FFFFFFF", "0x2FFFFFFF");
+  bitAndParsed("-0x100000001", "0x3FFFFFFFF", "0x2FFFFFFFF");
+  bitAndParsed("-0x10000000000000001",
+               "0x3FFFFFFFFFFFFFFFF",
+               "0x2FFFFFFFFFFFFFFFF");
+  bitAndParsed("-0x100000000000000", "0xFFFFFFFFFFFFFF", "0x0");
+  bitAndParsed("-0x10000000000000000", "0xFFFFFFFFFFFFFFFF", "0x0");
+  bitAndParsed("-0x300000000000000",
+               "0xFFFFFFFFFFFFFFF",
+               "0xD00000000000000");
+  bitAndParsed("-0x30000000000000000",
+               "0xFFFFFFFFFFFFFFFFF",
+               "0xD0000000000000000");
+  bitAndParsed("-0x10000000", "-0x10000000", "-0x10000000");
+  bitAndParsed("-0x100000000", "-0x100000000", "-0x100000000");
+  bitAndParsed("-0x100000000000000",
+               "-0x100000000000000",
+               "-0x100000000000000");
+  bitAndParsed("-0x10000000000000000",
+               "-0x10000000000000000",
+               "-0x10000000000000000");
+  bitAndParsed("-0x3", "-0x2", "-0x4");
+  bitAndParsed("-0x10000000", "-0x10000001", "-0x20000000");
+  bitAndParsed("-0x100000000", "-0x100000001", "-0x200000000");
+  bitAndParsed("-0x100000000000000",
+               "-0x100000000000001",
+               "-0x200000000000000");
+  bitAndParsed("-0x10000000000000000",
+               "-0x10000000000000001",
+               "-0x20000000000000000");
+  bitAndParsed("0x123456789ABCDEF01234567890",
+               "0x3FFFFFFF",  // Max Smi for 32 bits.
+               "0x34567890");
+  bitAndParsed("0x123456789ABCDEF01274567890",
+               "0x3FFFFFFF",  // Max Smi for 32 bits.
+               "0x34567890");
+  bitAndParsed("0x123456789ABCDEF01234567890",
+               "0x40000000",  // Max Smi for 32 bits + 1.
+               "0x0");
+  bitAndParsed("0x123456789ABCDEF01274567890",
+               "0x40000000",  // Max Smi for 32 bits + 1.
+               "0x40000000");
+  bitAndParsed("0x123456789ABCDEF01234567890",
+               "0x3FFFFFFFFFFFFFFF",  // Max Smi for 64 bits.
+               "0x3CDEF01234567890");
+  bitAndParsed("0x123456789ACCDEF01234567890",
+               "0x4000000000000000",  // Max Smi for 64 bits + 1.
+               "0x4000000000000000");
+  bitAndParsed("0x123456789ABCDEF01234567890",
+               "0x4000000000000000",  // Max Smi for 64 bits + 1.
+               "0x0");
+}
+
+bitOrParsed(String a, String b, String result) {
+  int int_a = int.parse(a);
+  int int_b = int.parse(b);
+  int int_result = int.parse(result);
+  int ored = int_a | int_b;
+  Expect.equals(int_result, ored);
+  String str_ored = ored >= 0 ?
+      "0x${ored.toRadixString(16)}" :
+      "-0x${(-ored).toRadixString(16)}";
+  Expect.equals(result.toLowerCase(), str_ored);
+  int ored2 = int_b | int_a;
+  Expect.equals(int_result, ored2);
+  String str_ored2 = ored2 >= 0 ?
+      "0x${ored2.toRadixString(16)}" :
+      "-0x${(-ored2).toRadixString(16)}";
+  Expect.equals(result.toLowerCase(), str_ored2);
+}
+
+testBigintBitOr() {
+  String zero = "0x0";
+  String one = "0x1";
+  String minus_one = "-0x1";
+
+  bitOrParsed(one, zero, one);
+  bitOrParsed(one, one, one);
+  bitOrParsed(minus_one, zero, minus_one);
+  bitOrParsed(minus_one, one, minus_one);
+  bitOrParsed(minus_one, minus_one, minus_one);
+  bitOrParsed("-0x3", one, "-0x3");
+  bitOrParsed("0x5", "0x3", "0x7");
+  bitOrParsed("0x5", minus_one, minus_one);
+  bitOrParsed("0x5", zero, "0x5");
+  bitOrParsed("0x50000000", one, "0x50000001");
+  bitOrParsed("0x50000000", minus_one, minus_one);
+  bitOrParsed("0x500000000", one, "0x500000001");
+  bitOrParsed("0x500000000", minus_one, minus_one);
+  bitOrParsed("0x50000000000000000", one, "0x50000000000000001");
+  bitOrParsed("0x50000000000000000", minus_one, minus_one);
+  bitOrParsed("-0x50000000", "-0x50000000", "-0x50000000");
+  bitOrParsed("-0x500000000", "-0x500000000", "-0x500000000");
+  bitOrParsed("-0x50000000000000000",
+              "-0x50000000000000000",
+              "-0x50000000000000000");
+  bitOrParsed("0x1234567890ABCDEF012345678",
+              "0x876543210FEDCBA0987654321",
+              "0x977557799FEFCFEF997755779");
+  bitOrParsed("-0x1234567890ABCDEF012345678",
+              "-0x876543210FEDCBA0987654321",
+              "-0x224422000A9C9A0002244221");
+  bitOrParsed("0x1234567890ABCDEF012345678",
+              "-0x876543210FEDCBA0987654321",
+              "-0x854101010F440200985410101");
+  bitOrParsed("0x1234567890ABCDEF012345678FFFFFFFFFFFFFFFFFFFFFFFFF",
+              "-0x876543210FEDCBA0987654321",
+              "-0x1");
+  bitOrParsed("0x12345678", "0xFFFFFFF", "0x1FFFFFFF");
+  bitOrParsed("0x123456789", "0xFFFFFFFF", "0x1FFFFFFFF");
+  bitOrParsed("-0x10000000", "0xFFFFFFF", "-0x1");
+  bitOrParsed("-0x100000000", "0xFFFFFFFF", "-0x1");
+  bitOrParsed("-0x10000001", "0xFFFFFFF", "-0x10000001");
+  bitOrParsed("-0x100000001", "0xFFFFFFFF", "-0x100000001");
+  bitOrParsed("-0x10000001", "0x3FFFFFFF", "-0x1");
+  bitOrParsed("-0x100000001", "0x3FFFFFFFF", "-0x1");
+  bitOrParsed("-0x10000000000000001", "0x3FFFFFFFFFFFFFFFF", "-0x1");
+  bitOrParsed("-0x100000000000000", "0xFFFFFFFFFFFFFF", "-0x1");
+  bitOrParsed("-0x10000000000000000", "0xFFFFFFFFFFFFFFFF", "-0x1");
+  bitOrParsed("-0x300000000000000", "0xFFFFFFFFFFFFFFF", "-0x1");
+  bitOrParsed("-0x30000000000000000", "0xFFFFFFFFFFFFFFFFF", "-0x1");
+  bitOrParsed("-0x10000000", "-0x10000000", "-0x10000000");
+  bitOrParsed("-0x100000000", "-0x100000000", "-0x100000000");
+  bitOrParsed("-0x100000000000000",
+              "-0x100000000000000",
+              "-0x100000000000000");
+  bitOrParsed("-0x10000000000000000",
+              "-0x10000000000000000",
+              "-0x10000000000000000");
+  bitOrParsed("-0x10000000", "-0x10000001", "-0x1");
+  bitOrParsed("-0x100000000", "-0x100000001", "-0x1");
+  bitOrParsed("-0x100000000000000", "-0x100000000000001", "-0x1");
+  bitOrParsed("-0x10000000000000000", "-0x10000000000000001", "-0x1");
+  bitOrParsed("-0x10000000000000000", "-0x1", "-0x1");
+}
+
+bitXorParsed(String a, String b, String result) {
+  int int_a = int.parse(a);
+  int int_b = int.parse(b);
+  int int_result = int.parse(result);
+  int xored = int_a ^ int_b;
+  Expect.equals(int_result, xored);
+  String str_xored = xored >= 0 ?
+      "0x${xored.toRadixString(16)}" :
+      "-0x${(-xored).toRadixString(16)}";
+  Expect.equals(result.toLowerCase(), str_xored);
+  int xored2 = int_b ^ int_a;
+  Expect.equals(int_result, xored2);
+  String str_xored2 = xored2 >= 0 ?
+      "0x${xored2.toRadixString(16)}" :
+      "-0x${(-xored2).toRadixString(16)}";
+  Expect.equals(result.toLowerCase(), str_xored2);
+  int xored3 = int_a ^ xored2;
+  Expect.equals(int_b, xored3);
+  String str_xored3 = xored3 >= 0 ?
+      "0x${xored3.toRadixString(16)}" :
+      "-0x${(-xored3).toRadixString(16)}";
+  Expect.equals(b.toLowerCase(), str_xored3);
+}
+
+testBigintBitXor() {
+  String zero = "0x0";
+  String one = "0x1";
+  String minus_one = "-0x1";
+
+  bitXorParsed(one, zero, one);
+  bitXorParsed(one, one, zero);
+  bitXorParsed(minus_one, zero, minus_one);
+  bitXorParsed(minus_one, one, "-0x2");
+  bitXorParsed(minus_one, minus_one, zero);
+  bitXorParsed("0x5", "0x3", "0x6");
+  bitXorParsed("0x5", minus_one, "-0x6");
+  bitXorParsed("0x5", zero, "0x5");
+  bitXorParsed(minus_one, "-0x8", "0x7");
+  bitXorParsed("0x50000000", one, "0x50000001");
+  bitXorParsed("0x50000000", minus_one, "-0x50000001");
+  bitXorParsed("0x500000000", one, "0x500000001");
+  bitXorParsed("0x500000000", minus_one, "-0x500000001");
+  bitXorParsed("0x50000000000000000", one, "0x50000000000000001");
+  bitXorParsed("0x50000000000000000", minus_one, "-0x50000000000000001");
+  bitXorParsed("-0x50000000", "-0x50000000", zero);
+  bitXorParsed("-0x500000000", "-0x500000000", zero);
+  bitXorParsed("-0x50000000000000000", "-0x50000000000000000", zero);
+  bitXorParsed("0x1234567890ABCDEF012345678",
+               "0x876543210FEDCBA0987654321",
+               "0x955115599F46064F995511559");
+  bitXorParsed("-0x1234567890ABCDEF012345678",
+               "-0x876543210FEDCBA0987654321",
+               "0x955115599F46064F995511557");
+  bitXorParsed("0x1234567890ABCDEF012345678",
+               "-0x876543210FEDCBA0987654321",
+               "-0x955115599F46064F995511559");
+  bitXorParsed("0x1234567890ABCDEF012345678FFFFFFFFFFFFFFFFFFFFFFFFF",
+               "-0x876543210FEDCBA0987654321",
+               "-0x1234567890ABCDEF012345678789ABCDEF012345F6789ABCE0");
+  bitXorParsed("0x12345678", "0xFFFFFFF", "0x1DCBA987");
+  bitXorParsed("0x123456789", "0xFFFFFFFF", "0x1DCBA9876");
+  bitXorParsed("-0x10000000", "0xFFFFFFF", "-0x1");
+  bitXorParsed("-0x100000000", "0xFFFFFFFF", "-0x1");
+  bitXorParsed("-0x10000001", "0xFFFFFFF", "-0x20000000");
+  bitXorParsed("-0x100000001", "0xFFFFFFFF", "-0x200000000");
+  bitXorParsed("-0x10000001", "0x3FFFFFFF", "-0x30000000");
+  bitXorParsed("-0x100000001", "0x3FFFFFFFF", "-0x300000000");
+  bitXorParsed("-0x10000000000000001",
+               "0x3FFFFFFFFFFFFFFFF",
+               "-0x30000000000000000");
+  bitXorParsed("-0x100000000000000", "0xFFFFFFFFFFFFFF", "-0x1");
+  bitXorParsed("-0x10000000000000000", "0xFFFFFFFFFFFFFFFF", "-0x1");
+  bitXorParsed("-0x300000000000000",
+               "0xFFFFFFFFFFFFFFF",
+               "-0xD00000000000001");
+  bitXorParsed("-0x30000000000000000",
+               "0xFFFFFFFFFFFFFFFFF",
+               "-0xD0000000000000001");
+  bitXorParsed("-0x10000000", "-0x10000000", zero);
+  bitXorParsed("-0x100000000", "-0x100000000", zero);
+  bitXorParsed("-0x100000000000000", "-0x100000000000000", zero);
+  bitXorParsed("-0x10000000000000000", "-0x10000000000000000", zero);
+  bitXorParsed("-0x10000000", "-0x10000001", "0x1FFFFFFF");
+  bitXorParsed("-0x100000000", "-0x100000001", "0x1FFFFFFFF");
+  bitXorParsed("-0x100000000000000",
+               "-0x100000000000001",
+               "0x1FFFFFFFFFFFFFF");
+  bitXorParsed("-0x10000000000000000",
+               "-0x10000000000000001",
+               "0x1FFFFFFFFFFFFFFFF");
+}
+
+bitNotParsed(String a, String result) {
+  int int_a = int.parse(a);
+  int int_result = int.parse(result);
+  int inverted = ~int_a;
+  Expect.equals(int_result, inverted);
+  String str_inverted = inverted >= 0 ?
+      "0x${inverted.toRadixString(16)}" :
+      "-0x${(-inverted).toRadixString(16)}";
+  Expect.equals(result.toLowerCase(), str_inverted);
+  int back = ~inverted;
+  Expect.equals(int_a, back);
+  String str_back = back >= 0 ?
+      "0x${back.toRadixString(16)}" :
+      "-0x${(-back).toRadixString(16)}";
+  Expect.equals(a.toLowerCase(), str_back);
+}
+
+
+testBigintBitNot() {
+  String zero = "0x0";
+  String one = "0x1";
+  String minus_one = "-0x1";
+
+  bitNotParsed(zero, minus_one);
+  bitNotParsed(one, "-0x2");
+  bitNotParsed("0x5", "-0x6");
+  bitNotParsed("0x50000000", "-0x50000001");
+  bitNotParsed("0xFFFFFFF", "-0x10000000");
+  bitNotParsed("0xFFFFFFFF", "-0x100000000");
+  bitNotParsed("0xFFFFFFFFFFFFFF", "-0x100000000000000");
+  bitNotParsed("0xFFFFFFFFFFFFFFFF", "-0x10000000000000000");
+  bitNotParsed("0x1234567890ABCDEF012345678",
+               "-0x1234567890ABCDEF012345679");
+}
+
+mulDivParsed(String a, String b, String product) {
+  int int_a = int.parse(a);
+  int int_b = int.parse(b);
+  int int_product = int.parse(product);
+  int computed_product = int_a * int_b;
+  Expect.equals(int_product, computed_product);
+  String str_product = computed_product >= 0 ?
+      "0x${computed_product.toRadixString(16)}" :
+      "-0x${(-computed_product).toRadixString(16)}";
+  Expect.equals(product.toLowerCase(), str_product);
+  int computed_product2 = int_b * int_a;
+  Expect.equals(int_product, computed_product2);
+  String str_product2 = computed_product2 >= 0 ?
+      "0x${computed_product2.toRadixString(16)}" :
+      "-0x${(-computed_product2).toRadixString(16)}";
+  Expect.equals(product.toLowerCase(), str_product2);
+
+  if (int_a != 0) {
+    int computed_quotient1 = int_product ~/ int_a;
+    Expect.equals(int_b, computed_quotient1);
+    String str_quotient1 = computed_quotient1 >= 0 ?
+        "0x${computed_quotient1.toRadixString(16)}" :
+        "-0x${(-computed_quotient1).toRadixString(16)}";
+    Expect.equals(b.toLowerCase(), str_quotient1);
+  }
+
+  if (int_b != 0) {
+    int computed_quotient2 = int_product ~/ int_b;
+    Expect.equals(int_a, computed_quotient2);
+    String str_quotient2 = computed_quotient2 >= 0 ?
+        "0x${computed_quotient2.toRadixString(16)}" :
+        "-0x${(-computed_quotient2).toRadixString(16)}";
+    Expect.equals(a.toLowerCase(), str_quotient2);
+  }
+}
+
+testBigintMultiplyDivide() {
+  String zero = "0x0";
+  String one = "0x1";
+  String minus_one = "-0x1";
+
+  mulDivParsed(zero, zero, zero);
+  mulDivParsed(one, one, one);
+  mulDivParsed(one, zero, zero);
+  mulDivParsed(zero, one, zero);
+  mulDivParsed(one, minus_one, minus_one);
+  mulDivParsed(minus_one, minus_one, one);
+  mulDivParsed("0x42", one, "0x42");
+  mulDivParsed("0x42", "0x2", "0x84");
+  mulDivParsed("0xFFFF", "0x2", "0x1FFFE");
+  mulDivParsed("0x3", "0x5", "0xF");
+  mulDivParsed("0xFFFFF", "0x5", "0x4FFFFB");
+  mulDivParsed("0xFFFFFFF", "0x5", "0x4FFFFFFB");
+  mulDivParsed("0xFFFFFFFF", "0x5", "0x4FFFFFFFB");
+  mulDivParsed("0xFFFFFFFFFFFFFFFF", "0x5", "0x4FFFFFFFFFFFFFFFB");
+  mulDivParsed("0xFFFFFFFFFFFFFFFF", "0x3039",
+               "0x3038FFFFFFFFFFFFCFC7");
+  mulDivParsed("0xFFFFFFFFFFFFFFFF",
+               "0xFFFFFFFFFFFFFFFFFFFFFFFFFF",
+               "0xFFFFFFFFFFFFFFFEFFFFFFFFFF0000000000000001");
+  mulDivParsed(
+      "0xFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000",
+      "0xFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000",
+      "0xFFFFFFFFFFFFFFFEFFFFFFFFFF000000000000000100000000000000"
+      "000000000000000000000000000000000000000000000000000000000000");
+  mulDivParsed("0x10000001", "0x5", "0x50000005");
+  mulDivParsed(
+      "0x1234567890ABCDEF01234567890ABCDEF01234567890ABCDEF"
+      "01234567890ABCDEF01234567890ABCDEF",
+      "0x1234567890ABCDEF01234567890ABCDEF01234567890ABCDEF"
+      "01234567890ABCDEF01234567890ABCDEF",
+      "0x14B66DC328828BCA670CBE52943AA3894CCCE15C8F5ED1E55F"
+      "328F6D3F579F992299850C4B5B95213EF3FB7B4E73B5F43D4299"
+      "5B9F6FD5441C275F2FF89F86F28F47A94CA37481090DCCCDCA6475F09A2F2A521");
+  mulDivParsed(
+      "0x1234567890ABCDEF01234567890ABCDEF01234567890ABCDEF01234567890ABCDEF"
+      "01234567890ABCDEF",
+      "0x1234567890123456789012345678901234567890123456789012345678901234567890"
+      "123456789012345678901234567890123456789012345678901234567890123456789012"
+      "345678901234567890123456789012345678901234567890123456789012345678901234"
+      "567890123456789012345678901234567890123456789012345678901234567890123456"
+      "789012345678901234567890123456789012345678901234567890123456789012345678"
+      "90123456789012345678901234567890",
+      "0x14B66DC327D3C88D7EAA988BBFFA9BBA877826E7EDAF373907A931FBFC3A25231DF7F2"
+      "516F511FB1638F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A"
+      "8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F"
+      "0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B"
+      "570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B57"
+      "0F4A8F0B570F4A8F0B570F4A8F0B570F35D89D93E776C67DD864B2034B5C739007933027"
+      "5CDFD41E07A15D0F5AD5256BED5F1CF91FBA375DE70");
+  mulDivParsed(
+      "0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFF",
+      "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+      "0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000"
+      "0000000000000000000000000000000000000000000000000000000000000000000001");
+  mulDivParsed(
+      "0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFF",
+      "0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFF",
+      "0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFC0000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "0000000000000000000000000000001");
+
+  // A 256 28-bit digits number squared.
+  mulDivParsed(
+      "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+      "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+      "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "0000000000000000000000000000000000000000000000000000000001");
+
+  mulDivParsed(
+      "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+      "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+      "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+      "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "000000000000000000000000000000000000000000000000000000000000000000000000"
+      "0000000000000000000000000000000000000000000000000000000001");
+}
+
+divRemParsed(String a, String b, String quotient, String remainder) {
+  int int_a = int.parse(a);
+  int int_b = int.parse(b);
+  int int_quotient = int.parse(quotient);
+  int int_remainder = int.parse(remainder);
+  int computed_quotient = int_a ~/ int_b;
+  Expect.equals(int_quotient, computed_quotient);
+  String str_quotient = computed_quotient >= 0 ?
+      "0x${computed_quotient.toRadixString(16)}" :
+      "-0x${(-computed_quotient).toRadixString(16)}";
+  Expect.equals(quotient.toLowerCase(), str_quotient);
+  int computed_remainder = int_a.remainder(int_b);
+  Expect.equals(int_remainder, computed_remainder);
+  String str_remainder = computed_remainder >= 0 ?
+      "0x${computed_remainder.toRadixString(16)}" :
+      "-0x${(-computed_remainder).toRadixString(16)}";
+  Expect.equals(remainder.toLowerCase(), str_remainder);
+}
+
+
+testBigintDivideRemainder() {
+  String zero = "0x0";
+  String one = "0x1";
+  String minus_one = "-0x1";
+
+  divRemParsed(one, one, one, zero);
+  divRemParsed(zero, one, zero, zero);
+  divRemParsed(minus_one, one, minus_one, zero);
+  divRemParsed(one, "0x2", zero, one);
+  divRemParsed(minus_one, "0x7", zero, minus_one);
+  divRemParsed("0xB", "0x7", one, "0x4");
+  divRemParsed("0x12345678", "0x7", "0x299C335", "0x5");
+  divRemParsed("-0x12345678", "0x7", "-0x299C335", "-0x5");
+  divRemParsed("0x12345678", "-0x7", "-0x299C335", "0x5");
+  divRemParsed("-0x12345678", "-0x7", "0x299C335", "-0x5");
+  divRemParsed("0x7", "0x12345678", zero, "0x7");
+  divRemParsed("-0x7", "0x12345678", zero, "-0x7");
+  divRemParsed("-0x7", "-0x12345678", zero, "-0x7");
+  divRemParsed("0x7", "-0x12345678", zero, "0x7");
+  divRemParsed("0x12345678", "0x7", "0x299C335", "0x5");
+  divRemParsed("-0x12345678", "0x7", "-0x299C335", "-0x5");
+  divRemParsed("0x12345678", "-0x7", "-0x299C335", "0x5");
+  divRemParsed("-0x12345678", "-0x7", "0x299C335", "-0x5");
+  divRemParsed(
+      "0x14B66DC327D3C88D7EAA988BBFFA9BBA877826E7EDAF373907A931FBFC3A25231DF7F2"
+      "516F511FB1638F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A"
+      "8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F"
+      "0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B"
+      "570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B57"
+      "0F4A8F0B570F4A8F0B570F4A8F0B570F35D89D93E776C67DD864B2034B5C739007933027"
+      "5CDFD41E07A15D0F5AD5256BED5F1CF91FBA375DE70",
+      "0x1234567890ABCDEF01234567890ABCDEF01234567890ABCDEF01234567890ABCDEF"
+      "01234567890ABCDEF",
+      "0x1234567890123456789012345678901234567890123456789012345678901234567890"
+      "123456789012345678901234567890123456789012345678901234567890123456789012"
+      "345678901234567890123456789012345678901234567890123456789012345678901234"
+      "567890123456789012345678901234567890123456789012345678901234567890123456"
+      "789012345678901234567890123456789012345678901234567890123456789012345678"
+      "90123456789012345678901234567890",
+      zero);
+  divRemParsed(
+      "0x14B66DC327D3C88D7EAA988BBFFA9BBA877826E7EDAF373907A931FBFC3A25231DF7F2"
+      "516F511FB1638F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A"
+      "8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F"
+      "0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B"
+      "570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B57"
+      "0F4A8F0B570F4A8F0B570F4A8F0B570F35D89D93E776C67DD864B2034B5C739007933027"
+      "5CDFD41E07A15D0F5AD5256BED5F1CF91FBA375DE71",
+      "0x1234567890ABCDEF01234567890ABCDEF01234567890ABCDEF01234567890ABCDEF"
+      "01234567890ABCDEF",
+      "0x1234567890123456789012345678901234567890123456789012345678901234567890"
+      "123456789012345678901234567890123456789012345678901234567890123456789012"
+      "345678901234567890123456789012345678901234567890123456789012345678901234"
+      "567890123456789012345678901234567890123456789012345678901234567890123456"
+      "789012345678901234567890123456789012345678901234567890123456789012345678"
+      "90123456789012345678901234567890",
+      one);
+  divRemParsed(
+      "0x14B66DC327D3C88D7EAA988BBFFA9BBA877826E7EDAF373907A931FBFC3A25231DF7F2"
+      "516F511FB1638F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A"
+      "8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F"
+      "0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B"
+      "570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B570F4A8F0B57"
+      "0F4A8F0B570F4A8F0B570F4A8F0B5710591E051CF233A56DEA99087BDC08417F08B6758E"
+      "E5EA90FCF7B39165D365D139DC60403E8743421AC5E",
+      "0x1234567890ABCDEF01234567890ABCDEF01234567890ABCDEF01234567890ABCDEF"
+      "01234567890ABCDEF",
+      "0x1234567890123456789012345678901234567890123456789012345678901234567890"
+      "123456789012345678901234567890123456789012345678901234567890123456789012"
+      "345678901234567890123456789012345678901234567890123456789012345678901234"
+      "567890123456789012345678901234567890123456789012345678901234567890123456"
+      "789012345678901234567890123456789012345678901234567890123456789012345678"
+      "90123456789012345678901234567890",
+      "0x1234567890ABCDEF01234567890ABCDEF01234567890ABCDEF01234567890ABCDEF"
+      "01234567890ABCDEE");
+}
+
 main() {
-  BigIntegerTest.testMain();
+  Expect.equals(1234567890123456789, foo());
+  Expect.equals(12345678901234567890, bar());
+  testSmiOverflow();
+  testBigintAdd();
+  testBigintSub();
+  testBigintMul();
+  testBigintHugeMul();
+  testBigintModulo();
+  testBigintTruncDiv();
+  testBigintDiv();
+  testBigintNegate();
+  testShiftAmount();
+  testBigintAddSub();
+  testBigintLeftShift();
+  testBigintRightShift();
+  testBigintBitAnd();
+  testBigintBitOr();
+  testBigintBitXor();
+  testBigintBitNot();
+  testBigintMultiplyDivide();
+  testBigintDivideRemainder();
+  Expect.equals(12345678901234567890, (12345678901234567890).abs());
+  Expect.equals(12345678901234567890, (-12345678901234567890).abs());
+  var a = 10000000000000000000;
+  var b = 10000000000000000001;
+  Expect.equals(false, a.hashCode == b.hashCode);
+  Expect.equals(true, a.hashCode == (b - 1).hashCode);
 }
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index d575354..351594d 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -83,18 +83,13 @@
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 core_runtime_types_test: Pass, Fail # Issue 20525
 
-[ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
+[ $runtime == ff || $runtime == jsshell ]
 unicode_test: Fail
 
-[ $runtime == ff || $runtime == ie9 || $runtime == jsshell || $runtime == safari || $runtime == safarimobilesim ]
+[ $runtime == ff || $runtime == jsshell || $runtime == safari || $runtime == safarimobilesim ]
 double_round3_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
 double_round_to_double2_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
 
-[ $runtime == ie9 ]
-double_round4_test: Fail, OK # IE bug: Math.round(4503599627370497) != 4503599627370497.
-double_round_to_double3_test: Fail, OK # IE bug: Math.round(4503599627370497) != 4503599627370497.
-collection_length_test: Skip # Issue 12844
-
 [ $runtime == opera ]
 core_runtime_types_test: Fail
 null_nosuchmethod_test: Fail # Issue: 7413
@@ -117,11 +112,6 @@
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
-[ $compiler == dart2js && $runtime == ie9 ]
-string_base_vm_test: Fail # BUG(3304): Maybe this doesn't time out?
-list_test: Fail # IE doesn't support typed data.
-shuffle_test: Fail # IE doesn't support typed data.
-
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 list_as_map_test: Pass, Slow # TODO(kasperl): Please triage.
 
@@ -130,7 +120,7 @@
 [ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
 string_trimlr_test/none: Fail
 
-[ $compiler == dart2js && ($runtime == ie9 || $runtime == ie10) ]
+[ $compiler == dart2js && $runtime == ie10 ]
 string_case_test/01: Fail, OK  # Bug in IE.
 string_case_test/02: Fail, OK  # Bug in IE.
 
@@ -179,7 +169,7 @@
 [ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
 list_test/01: Fail # Safari bug: Array(-2) seen as dead code.
 
-[ $runtime == ie9 || $runtime == ie10 ]
+[ $runtime == ie10 ]
 num_parse_test: RuntimeError  # Issue 15316
 num_parse_test/01: RuntimeError  # Issue 15316
 
diff --git a/tests/html/html.status b/tests/html/html.status
index 413709e..eed84eb 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -60,16 +60,6 @@
 worker_test/functional: Pass, Crash # Issue 9929.
 touchevent_test/supported: Pass, Fail # Issue 17061
 
-[ $compiler == none && $runtime == drt && $system == windows && $checked ]
-fileapi_test/getDirectory: RuntimeError # Issue 20366
-fileapi_test/getFile: RuntimeError # Issue 20366
-fileapi_test/directoryReader: RuntimeError # Issue 20366
-fileapi_test/entry: RuntimeError # Issue 20366
-fileapi_test/fileEntry: RuntimeError # Issue 20366
-indexeddb_2_test: RuntimeError # Issue 20366
-indexeddb_5_test: RuntimeError # Issue 20366
-xhr_test/xhr_requestBlob: RuntimeError # Issue 20366
-
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 crypto_test/functional: Pass, Slow # TODO(dart2js-team): Please triage this failure.
 input_element_test/supported_datetime-local: Pass, Slow # TODO(dart2js-team): Please triage this failure.
@@ -219,116 +209,11 @@
 xhr_test/json: Fail # IE10 returns string, not JSON object
 xsltprocessor_test/supported: Fail
 
-[ $runtime == ie9 || $runtime == ie10 ]
+[ $runtime == ie10 ]
 custom/document_register_type_extensions_test/construction: Fail # Issue 13193
 custom/element_upgrade_test: Fail # Issue 18247
 worker_api_test: Fail # IE does not support URL.createObjectURL in web workers.
 
-[ $runtime == ie9 ]
-event_customevent_test: Fail # Issue 14170
-isolates_test: Skip # Issue 13027
-blob_constructor_test: Fail
-custom/document_register_type_extensions_test/namespaces: Fail # Issue 13193
-dom_constructors_test: Fail
-element_test/click: Fail                # IE does not support firing this event.
-filereader_test: Fail   # Not supported.
-form_element_test: Fail # Issue 4793.
-localstorage_test: Fail
-postmessage_structured_test: Skip   # BUG(5685): times out.
-serialized_script_value_test: Fail
-url_test: Fail              # IE9 does not support createObjectURL (it is supported in IE10)
-canvasrenderingcontext2d_test/drawImage_video_element: Fail # IE does not support drawImage w/ video element
-canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # IE does not support drawImage w/ video element
-canvasrenderingcontext2d_test/drawImage_image_element: Pass, Fail # Issue: 11416
-input_element_test/attributes: Fail # IE returns null while others ''
-xhr_cross_origin_test: Skip # Issue 12920
-xhr_test/json: Fail # IE9 returns null because of unsupported type
-js_test: RuntimeError # Issue 14645
-custom: Skip # Issue 16717
-custom_elements_test: Skip # Issue 16717
-
-# IE9 Feature support statuses-
-# All changes should be accompanied by platform support annotation changes.
-audiobuffersourcenode_test/supported: Fail
-audiocontext_test/supported: Fail
-cache_test/supported: Fail
-crypto_test/supported: Fail
-css_test/supportsPointConversions: Fail
-document_test/supports_cssCanvasContext: Fail
-element_types_test/supported_content: Fail
-element_types_test/supported_datalist: Fail
-element_types_test/supported_details: Fail
-element_types_test/supported_keygen: Fail
-element_types_test/supported_meter: Fail
-element_types_test/supported_output: Fail
-element_types_test/supported_progress: Fail
-element_types_test/supported_shadow: Fail
-element_types_test/supported_template: Fail
-element_types_test/supported_track: Fail
-fileapi_test/supported: Fail
-form_data_test/supported: Fail
-history_test/supported_HashChangeEvent: Fail
-history_test/supported_state: Fail
-indexeddb_1_test/supported: Fail
-indexeddb_1_test/supportsDatabaseNames: Fail
-input_element_test/supported_date: Fail
-input_element_test/supported_datetime-local: Fail
-input_element_test/supported_email: Fail
-input_element_test/supported_month: Fail
-input_element_test/supported_number: Fail
-input_element_test/supported_range: Fail
-input_element_test/supported_search: Fail
-input_element_test/supported_tel: Fail
-input_element_test/supported_time: Fail
-input_element_test/supported_url: Fail
-input_element_test/supported_week: Fail
-media_stream_test/supported_MediaStreamEvent: Fail
-media_stream_test/supported_MediaStreamTrackEvent: Fail
-media_stream_test/supported_media: Fail
-mutationobserver_test/supported: Fail
-range_test/supported: Fail
-rtc_test/supported: Fail
-shadow_dom_test/supported: Fail
-speechrecognition_test/supported: Fail
-svgelement_test/supported_altGlyph: Fail
-svgelement_test/supported_animate: Fail
-svgelement_test/supported_animateMotion: Fail
-svgelement_test/supported_animateTransform: Fail
-svgelement_test/supported_feBlend: Fail
-svgelement_test/supported_feColorMatrix: Fail
-svgelement_test/supported_feComponentTransfer: Fail
-svgelement_test/supported_feConvolveMatrix: Fail
-svgelement_test/supported_feDiffuseLighting: Fail
-svgelement_test/supported_feDisplacementMap: Fail
-svgelement_test/supported_feDistantLight: Fail
-svgelement_test/supported_feFlood: Fail
-svgelement_test/supported_feFuncA: Fail
-svgelement_test/supported_feFuncB: Fail
-svgelement_test/supported_feFuncG: Fail
-svgelement_test/supported_feFuncR: Fail
-svgelement_test/supported_feGaussianBlur: Fail
-svgelement_test/supported_feImage: Fail
-svgelement_test/supported_feMerge: Fail
-svgelement_test/supported_feMergeNode: Fail
-svgelement_test/supported_feOffset: Fail
-svgelement_test/supported_feSpecularLighting: Fail
-svgelement_test/supported_feTile: Fail
-svgelement_test/supported_feTurbulence: Fail
-svgelement_test/supported_filter: Fail
-svgelement_test/supported_foreignObject: Fail
-svgelement_test/supported_set: Fail
-touchevent_test/supported: Fail
-transition_event_test/supported: Fail
-typed_arrays_1_test/supported: Fail
-webgl_1_test/supported: Fail
-websocket_test/supported: Fail
-websql_test/supported: Fail
-worker_test/supported: Fail
-xhr_test/supported_onLoadEnd: Fail
-xhr_test/supported_onProgress: Fail
-xhr_test/supported_overrideMimeType: Fail
-xsltprocessor_test/supported: Fail
-
 [ $compiler == dart2js && $runtime == drt && $unchecked ]
 audiocontext_test/functional: Pass, Fail
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index b658c4f..5a36c41 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -40,9 +40,6 @@
 [ $compiler == dart2js ]
 serialization_test: RuntimeError # Issue 1882, tries to access class TestingOnly declared in isolate_patch.dart
 
-[ $compiler == dart2js && $runtime == ie9 ]
-browser/typed_data_message_test: Fail # Issue 12624
-
 [ $compiler == dart2js && $runtime == safari ]
 cross_isolate_message_test: Skip # Issue 12627
 message_test: Skip # Issue 12627
@@ -54,9 +51,6 @@
 [ $compiler == dart2js && $jscl ]
 spawn_uri_test: SkipByDesign # Loading another file is not supported in JS shell
 
-[ $compiler == dart2js && $runtime == ie9 ]
-spawn_uri_test: Fail # Issue 12630
-
 [ $compiler == dart2js && $runtime == none ]
 serialization_test: Pass # Issue 12628
 
@@ -81,7 +75,7 @@
 [ $compiler == none && $runtime == drt ]
 spawn_uri_nested_vm_test: Skip # Issue 14463
 
-[ $jscl || $runtime == ie9 ]
+[ $jscl ]
 spawn_uri_multi_test/none: RuntimeError # http://dartbug.com/13544
 
 [ ($compiler == none || $compiler == dart2dart) && ($runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index c0e9e1a..214d84a 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -155,21 +155,12 @@
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
 
-[ $compiler == dart2js && ($runtime == ff || $runtime == jsshell || $runtime == ie9 || $runtime == safari || $runtime == safarimobilesim)]
+[ $compiler == dart2js && ($runtime == ff || $runtime == jsshell || $runtime == safari || $runtime == safarimobilesim)]
 round_test: Fail, OK # Common JavaScript engine Math.round bug.
 
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 override_field_test/02: Pass, Slow # TODO(kasperl): Please triage.
 
-[ $compiler == dart2js && $runtime == ie9 ]
-double_to_string_as_exponential3_test: Fail # Issue 12750
-double_to_string_as_fixed_test: Fail # Issue 12750
-double_to_string_as_precision3_test: Fail # Issue 12750
-expect_test: Fail # Issue 13080
-stack_overflow_test: Fail
-stack_overflow_stacktrace_test: Fail
-
-
 [ $runtime == opera ]
 null_access_error_test: Fail # Issue: 7413
 string_interpolate_null_test: Fail # Issue: 7413
@@ -259,14 +250,6 @@
 [ $minified ]
 stack_trace_test: Fail, OK # Stack trace not preserved in minified code.
 
-[ $runtime == ie9 ]
-stack_trace_test: Fail, OK # Stack traces not available in IE9.
-deferred_constraints_type_annotation_test/*: Fail, Pass # http://dartbug.com/12635
-deferred_constraints_constants_test/*: Fail, Pass # http://dartbug.com/12635
-deferred_no_such_method_test*: Fail, Pass # http://dartbug.com/12635
-deferred_shadow_load_library_test: Fail, Pass # Issue 17807
-deferred_closurize_load_library_test: Fail, Pass # Issue 17807
-
 [ ($compiler == dart2js && $csp)]
 deferred_constraints_type_annotation_test/*: Skip # Issue 16898
 deferred_constraints_constants_test/*: Skip # Issue 16898
@@ -274,4 +257,4 @@
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 *deferred*: Skip # Issue 17458
-cha_deopt*: Skip # Issue 17458
\ No newline at end of file
+cha_deopt*: Skip # Issue 17458
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 16f7b97..bbddc24 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -2,9 +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.
 
-[ $compiler == dart2analyzer ]
-lib/_internal: Skip # Slow like a hell - timeouts.
-
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 lib/html/dart2js/html_dart2js: CompileTimeError # Issue 16522
 lib/html/html_common/html_common_dart2js: CompileTimeError # Issue 16522
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index a847535..0d76b8f 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -8,13 +8,6 @@
 [ $checked && $compiler == none && ($runtime == dartium || $runtime == drt) ]
 mirrors/regress_16321_test/01: RunTimeError # Issue 16351
 
-[ $compiler == dart2js && $checked && $runtime == ie9 ]
-convert/ascii_test: Skip # http://dartbug.com/15498
-convert/streamed_conversion_json_utf8_encode_test: Skip # http://dartbug.com/15498
-convert/streamed_conversion_utf8_encode_test: Skip # http://dartbug.com/15498
-
-mirrors/mirrors_reader_test: Skip # Issue 16589
-
 [ $unchecked ]
 mirrors/redirecting_factory_different_type_test: SkipByDesign # Tests type checks.
 
@@ -124,7 +117,7 @@
 typed_data/setRange_2_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
 typed_data/setRange_3_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
 
-[ $compiler == dart2js && $runtime != jsshell && $runtime != safarimobilesim && $runtime != safari && $runtime != ff && $runtime != ie9 && $runtime != ie10]
+[ $compiler == dart2js && $runtime != jsshell && $runtime != safarimobilesim && $runtime != safari && $runtime != ff &&  $runtime != ie10]
 math/math_test: RuntimeError
 math/math2_test: RuntimeError
 
@@ -213,18 +206,6 @@
 convert/streamed_conversion_utf8_encode_test: Pass, Slow # Issue 12029
 mirrors/mirrors_reader_test: Timeout, Slow, RuntimeError # Issue 16589
 
-[ $runtime == ie9 ]
-# IE9 doesn't support typed arrays.
-typed_data/*: Fail # Issue 11971
-convert/chunked_conversion_utf88_test: Skip  # Issue 12029
-convert/streamed_conversion_json_utf8_decode_test: Skip # Issue 12029
-async/deferred/*: Skip # http://dartbug.com/12635
-mirrors/deferred*: Pass, Fail # http://dartbug.com/12635
-convert/streamed_conversion_utf8_decode_test: Skip # http://dartbug.com/12768
-convert/utf85_test: Skip # Issue 12029.
-convert/json_util_test: Fail # Issue 16109
-mirrors/mirrors_reader_test: Slow, RuntimeError # Issue 16589
-
 [ $compiler == dart2js ]
 typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
 typed_data/int32x4_bigint_test: RuntimeError # Issue 1533
diff --git a/tests/lib/mirrors/deferred_mirrors_update_lib.dart b/tests/lib/mirrors/deferred_mirrors_update_lib.dart
new file mode 100644
index 0000000..7868315
--- /dev/null
+++ b/tests/lib/mirrors/deferred_mirrors_update_lib.dart
@@ -0,0 +1,11 @@
+library lib;
+
+@MirrorsUsed(targets: "lib.C")
+import "dart:mirrors";
+
+class C {}
+
+foo() {
+  var a = new C();
+  print(reflectClass(C).owner);
+}
\ No newline at end of file
diff --git a/tests/lib/mirrors/deferred_mirrors_update_test.dart b/tests/lib/mirrors/deferred_mirrors_update_test.dart
new file mode 100644
index 0000000..6aa074d
--- /dev/null
+++ b/tests/lib/mirrors/deferred_mirrors_update_test.dart
@@ -0,0 +1,17 @@
+library main;
+
+// Test that the library-mirrors are updated after loading a deferred library.
+
+@MirrorsUsed(targets: "D")
+import "dart:mirrors";
+
+import "deferred_mirrors_update_lib.dart" deferred as l;
+
+class D {}
+
+void main() {
+  print(reflectClass(D).owner);
+  l.loadLibrary().then((_) {
+    l.foo();
+  });
+}
\ No newline at end of file
diff --git a/tests/standalone/io/raw_datagram_read_all_test.dart b/tests/standalone/io/raw_datagram_read_all_test.dart
new file mode 100644
index 0000000..67eef8b
--- /dev/null
+++ b/tests/standalone/io/raw_datagram_read_all_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "dart:io";
+import "dart:typed_data";
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+
+main() {
+  asyncStart();
+  var address = InternetAddress.LOOPBACK_IP_V4;
+  RawDatagramSocket.bind(address, 0).then((producer) {
+    RawDatagramSocket.bind(address, 0).then((receiver) {
+      int sent = 0;
+      new Timer.periodic(const Duration(microseconds: 1), (timer) {
+        producer.send([0], address, receiver.port);
+        sent++;
+        if (sent == 100) {
+          timer.cancel();
+          producer.close();
+        }
+      });
+      var timer;
+      receiver.listen((event) {
+        if (event != RawSocketEvent.READ) return;
+        var datagram = receiver.receive();
+        Expect.listEquals([0], datagram.data);
+        if (timer != null) timer.cancel();
+        timer = new Timer(const Duration(milliseconds: 200), () {
+          Expect.isNull(receiver.receive());
+          receiver.close();
+          asyncEnd();
+        });
+      });
+    });
+  });
+}
+
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 442109b..b1787c1 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -152,5 +152,9 @@
 javascript_compatibility_errors_test: Skip
 javascript_compatibility_warnings_test: Skip
 
+[ $compiler == dart2analyzer ]
+package/package1_test: CompileTimeError
+package/package_test: CompileTimeError
+
 [ $system == windows ]
 io/skipping_dart2js_compilations_test: Fail # Issue 19551.
diff --git a/tools/VERSION b/tools/VERSION
index 7167c96..1395a04 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 7
 PATCH 0
-PRERELEASE 2
+PRERELEASE 3
 PRERELEASE_PATCH 0
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 48438d9..7ce8686 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -45,6 +45,14 @@
     },
     "support_level": "untriaged"
   },
+  "AesKeyAlgorithm": {
+    "members": {
+      "length": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AesKeyGenParams": {
     "members": {
       "length": {
@@ -69,6 +77,9 @@
       "getByteFrequencyData": {},
       "getByteTimeDomainData": {},
       "getFloatFrequencyData": {},
+      "getFloatTimeDomainData": {
+        "support_level": "untriaged"
+      },
       "maxDecibels": {},
       "minDecibels": {},
       "smoothingTimeConstant": {}
@@ -81,6 +92,102 @@
     },
     "support_level": "untriaged"
   },
+  "AnimationEffect": {
+    "members": {},
+    "support_level": "untriaged"
+  },
+  "AnimationNode": {
+    "members": {
+      "activeDuration": {
+        "support_level": "untriaged"
+      },
+      "currentIteration": {
+        "support_level": "untriaged"
+      },
+      "duration": {
+        "support_level": "untriaged"
+      },
+      "endTime": {
+        "support_level": "untriaged"
+      },
+      "localTime": {
+        "support_level": "untriaged"
+      },
+      "player": {
+        "support_level": "untriaged"
+      },
+      "startTime": {
+        "support_level": "untriaged"
+      },
+      "timing": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AnimationPlayer": {
+    "members": {
+      "cancel": {
+        "support_level": "untriaged"
+      },
+      "currentTime": {
+        "support_level": "untriaged"
+      },
+      "finish": {
+        "support_level": "untriaged"
+      },
+      "finished": {
+        "support_level": "untriaged"
+      },
+      "pause": {
+        "support_level": "untriaged"
+      },
+      "paused": {
+        "support_level": "untriaged"
+      },
+      "play": {
+        "support_level": "untriaged"
+      },
+      "playbackRate": {
+        "support_level": "untriaged"
+      },
+      "reverse": {
+        "support_level": "untriaged"
+      },
+      "source": {
+        "support_level": "untriaged"
+      },
+      "startTime": {
+        "support_level": "untriaged"
+      },
+      "timeLag": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AnimationPlayerEvent": {
+    "members": {
+      "currentTime": {
+        "support_level": "untriaged"
+      },
+      "timelineTime": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AnimationTimeline": {
+    "members": {
+      "currentTime": {
+        "support_level": "untriaged"
+      },
+      "play": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ApplicationCache": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#application-cache-api",
     "dart_action": "unstable",
@@ -109,6 +216,23 @@
     },
     "support_level": "stable"
   },
+  "ApplicationCacheErrorEvent": {
+    "members": {
+      "message": {
+        "support_level": "untriaged"
+      },
+      "reason": {
+        "support_level": "untriaged"
+      },
+      "status": {
+        "support_level": "untriaged"
+      },
+      "url": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ArrayBuffer": {
     "comment": "http://www.khronos.org/registry/typedarray/specs/latest/",
     "members": {
@@ -137,6 +261,9 @@
       "namespaceURI": {
         "support_level": "untriaged"
       },
+      "nodeValue": {
+        "support_level": "untriaged"
+      },
       "ownerElement": {
         "dart_action": "suppress",
         "support_level": "deprecated"
@@ -145,6 +272,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "textContent": {
+        "support_level": "untriaged"
+      },
       "value": {}
     },
     "support_level": "stable"
@@ -301,7 +431,10 @@
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioProcessingEvent-section",
     "members": {
       "inputBuffer": {},
-      "outputBuffer": {}
+      "outputBuffer": {},
+      "playbackTime": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -310,6 +443,43 @@
     "members": {},
     "support_level": "experimental"
   },
+  "AudioTrack": {
+    "members": {
+      "enabled": {
+        "support_level": "untriaged"
+      },
+      "id": {
+        "support_level": "untriaged"
+      },
+      "kind": {
+        "support_level": "untriaged"
+      },
+      "label": {
+        "support_level": "untriaged"
+      },
+      "language": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AudioTrackList": {
+    "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
+      "getTrackById": {
+        "support_level": "untriaged"
+      },
+      "length": {
+        "support_level": "untriaged"
+      },
+      "onchange": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AutocompleteErrorEvent": {
     "comment": "http://wiki.whatwg.org/wiki/RequestAutocomplete",
     "members": {
@@ -380,6 +550,9 @@
     "comment": "http://www.w3.org/TR/FileAPI/#dfn-Blob",
     "members": {
       "Blob": {},
+      "close": {
+        "support_level": "untriaged"
+      },
       "size": {},
       "slice": {},
       "type": {}
@@ -735,7 +908,10 @@
   "Canvas2DContextAttributes": {
     "comment": "http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL",
     "members": {
-      "alpha": {}
+      "alpha": {},
+      "storage": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -746,6 +922,38 @@
     },
     "support_level": "stable"
   },
+  "CanvasPathMethods": {
+    "members": {
+      "arc": {
+        "support_level": "untriaged"
+      },
+      "arcTo": {
+        "support_level": "untriaged"
+      },
+      "bezierCurveTo": {
+        "support_level": "untriaged"
+      },
+      "closePath": {
+        "support_level": "untriaged"
+      },
+      "ellipse": {
+        "support_level": "untriaged"
+      },
+      "lineTo": {
+        "support_level": "untriaged"
+      },
+      "moveTo": {
+        "support_level": "untriaged"
+      },
+      "quadraticCurveTo": {
+        "support_level": "untriaged"
+      },
+      "rect": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CanvasPattern": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#canvaspattern",
     "members": {},
@@ -769,6 +977,9 @@
       "arcTo": {},
       "beginPath": {},
       "bezierCurveTo": {},
+      "canvas": {
+        "support_level": "untriaged"
+      },
       "clearRect": {},
       "clearShadow": {
         "support_level": "nonstandard"
@@ -792,6 +1003,9 @@
       "drawCustomFocusRing": {
         "support_level": "untriaged"
       },
+      "drawFocusIfNeeded": {
+        "support_level": "untriaged"
+      },
       "drawImage": {},
       "drawImageFromRect": {},
       "drawSystemFocusRing": {
@@ -816,6 +1030,9 @@
       "imageSmoothingEnabled": {
         "support_level": "untriaged"
       },
+      "isContextLost": {
+        "support_level": "untriaged"
+      },
       "isPointInPath": {},
       "isPointInStroke": {},
       "lineCap": {},
@@ -836,6 +1053,9 @@
       "rotate": {},
       "save": {},
       "scale": {},
+      "scrollPathIntoView": {
+        "support_level": "untriaged"
+      },
       "setAlpha": {
         "support_level": "nonstandard"
       },
@@ -950,6 +1170,17 @@
     },
     "support_level": "untriaged"
   },
+  "Client": {
+    "members": {
+      "id": {
+        "support_level": "untriaged"
+      },
+      "postMessage": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ClientRect": {
     "comment": "http://www.w3.org/TR/cssom-view/#the-clientrect-interface",
     "members": {
@@ -1293,6 +1524,7 @@
   "DOMError": {
     "comment": "http://www.w3.org/TR/dom/#interface-domerror",
     "members": {
+      "DOMError": {},
       "message": {
         "support_level": "untriaged"
       },
@@ -1480,14 +1712,52 @@
   "DOMTokenList": {
     "comment": "http://dev.w3.org/html5/spec-LC/common-dom-interfaces.html#domtokenlist-0",
     "members": {
+      "add": {
+        "support_level": "untriaged"
+      },
       "contains": {},
       "item": {},
       "length": {},
+      "remove": {
+        "support_level": "untriaged"
+      },
       "toString": {},
       "toggle": {}
     },
     "support_level": "stable"
   },
+  "DataTransfer": {
+    "members": {
+      "clearData": {
+        "support_level": "untriaged"
+      },
+      "dropEffect": {
+        "support_level": "untriaged"
+      },
+      "effectAllowed": {
+        "support_level": "untriaged"
+      },
+      "files": {
+        "support_level": "untriaged"
+      },
+      "getData": {
+        "support_level": "untriaged"
+      },
+      "items": {
+        "support_level": "untriaged"
+      },
+      "setData": {
+        "support_level": "untriaged"
+      },
+      "setDragImage": {
+        "support_level": "untriaged"
+      },
+      "types": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "DataTransferItem": {
     "comment": "http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface",
     "members": {
@@ -1635,6 +1905,14 @@
     },
     "support_level": "experimental"
   },
+  "DeviceLightEvent": {
+    "members": {
+      "value": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "DeviceMotionEvent": {
     "comment": "http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion",
     "members": {
@@ -1736,6 +2014,9 @@
       "compatMode": {
         "dart_action": "suppress"
       },
+      "contentType": {
+        "support_level": "untriaged"
+      },
       "cookie": {},
       "createAttribute": {
         "comment": "http://dom.spec.whatwg.org/#dom-document-createattribute",
@@ -1806,6 +2087,9 @@
         "dart_action": "suppress"
       },
       "execCommand": {},
+      "exitPointerLock": {
+        "support_level": "untriaged"
+      },
       "firstElementChild": {
         "comment": "http://dom.spec.whatwg.org/#parentnode"
       },
@@ -2020,6 +2304,9 @@
       "onwheel": {
         "support_level": "untriaged"
       },
+      "pointerLockElement": {
+        "support_level": "untriaged"
+      },
       "preferredStylesheetSet": {
         "comment": "http://dev.w3.org/csswg/cssom/#widl-Document-preferredStyleSheetSet"
       },
@@ -2136,6 +2423,9 @@
       "firstElementChild": {
         "comment": "http://dom.spec.whatwg.org/#parentnode"
       },
+      "getElementById": {
+        "support_level": "untriaged"
+      },
       "lastElementChild": {
         "comment": "http://dom.spec.whatwg.org/#parentnode"
       },
@@ -2190,11 +2480,26 @@
     },
     "support_level": "experimental"
   },
+  "EXTBlendMinMax": {
+    "members": {
+      "MAX_EXT": {
+        "support_level": "untriaged"
+      },
+      "MIN_EXT": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "EXTFragDepth": {
     "comment": "http://www.khronos.org/registry/webgl/extensions/EXT_frag_depth/",
     "members": {},
     "support_level": "experimental"
   },
+  "EXTShaderTextureLOD": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "EXTTextureFilterAnisotropic": {
     "comment": "http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/",
     "members": {
@@ -2530,6 +2835,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "requestPointerLock": {
+        "support_level": "untriaged"
+      },
       "scrollByLines": {},
       "scrollByPages": {},
       "scrollHeight": {},
@@ -2918,6 +3226,17 @@
     },
     "support_level": "stable"
   },
+  "FetchEvent": {
+    "members": {
+      "request": {
+        "support_level": "untriaged"
+      },
+      "respondWith": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "File": {
     "comment": "http://www.w3.org/TR/FileAPI/#dfn-file",
     "members": {
@@ -3242,12 +3561,37 @@
     "members": {
       "axes": {},
       "buttons": {},
+      "connected": {
+        "support_level": "untriaged"
+      },
       "id": {},
       "index": {},
+      "mapping": {
+        "support_level": "untriaged"
+      },
       "timestamp": {}
     },
     "support_level": "experimental"
   },
+  "GamepadButton": {
+    "members": {
+      "pressed": {
+        "support_level": "untriaged"
+      },
+      "value": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "GamepadEvent": {
+    "members": {
+      "gamepad": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "GamepadList": {
     "comment": "https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html",
     "members": {
@@ -3473,6 +3817,9 @@
       "hostname": {},
       "href": {},
       "hreflang": {},
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "name": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLAnchorElement-partial",
         "dart_action": "suppress",
@@ -4099,6 +4446,9 @@
         "support_level": "deprecated"
       },
       "height": {},
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "name": {},
       "src": {},
       "type": {},
@@ -4314,6 +4664,9 @@
         "support_level": "deprecated"
       },
       "height": {},
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "longDesc": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLIFrameElement-partial",
         "dart_action": "suppress",
@@ -4359,12 +4712,18 @@
       },
       "complete": {},
       "crossOrigin": {},
+      "currentSrc": {
+        "support_level": "untriaged"
+      },
       "height": {},
       "hspace": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLImageElement-partial",
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "isMap": {},
       "longDesc": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLImageElement-partial",
@@ -4378,6 +4737,9 @@
       "name": {},
       "naturalHeight": {},
       "naturalWidth": {},
+      "sizes": {
+        "support_level": "untriaged"
+      },
       "src": {},
       "srcset": {
         "support_level": "untriaged"
@@ -4584,6 +4946,9 @@
         "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import",
         "support_level": "experimental"
       },
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "media": {},
       "rel": {},
       "rev": {
@@ -4648,6 +5013,9 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-addtexttrack",
         "support_level": "experimental"
       },
+      "audioTracks": {
+        "support_level": "untriaged"
+      },
       "autoplay": {},
       "buffered": {},
       "canPlayType": {
@@ -4670,6 +5038,9 @@
         "comment": "http://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-media-initialtime",
         "support_level": "experimental"
       },
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "load": {},
       "loop": {},
       "mediaGroup": {},
@@ -4777,6 +5148,9 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks",
         "support_level": "experimental"
       },
+      "videoTracks": {
+        "support_level": "untriaged"
+      },
       "volume": {},
       "webkitAddKey": {
         "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions",
@@ -4938,6 +5312,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "name": {},
       "setCustomValidity": {},
       "standby": {
@@ -5049,6 +5426,10 @@
     },
     "support_level": "stable"
   },
+  "HTMLPictureElement": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "HTMLPreElement": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/grouping-content.html#the-pre-element",
     "members": {
@@ -5108,6 +5489,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "nonce": {
         "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive",
         "support_level": "experimental"
@@ -5172,8 +5556,17 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#the-source-element",
     "members": {
       "HTMLSourceElement": {},
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "media": {},
+      "sizes": {
+        "support_level": "untriaged"
+      },
       "src": {},
+      "srcset": {
+        "support_level": "untriaged"
+      },
       "type": {}
     },
     "support_level": "stable"
@@ -5515,6 +5908,9 @@
       "defaultValue": {
         "support_level": "untriaged"
       },
+      "integrity": {
+        "support_level": "untriaged"
+      },
       "kind": {},
       "label": {},
       "readyState": {},
@@ -5604,6 +6000,37 @@
     },
     "support_level": "stable"
   },
+  "HeaderMap": {
+    "members": {
+      "HeaderMap": {},
+      "clear": {
+        "support_level": "untriaged"
+      },
+      "delete": {
+        "support_level": "untriaged"
+      },
+      "forEach": {
+        "support_level": "untriaged"
+      },
+      "get": {
+        "support_level": "untriaged"
+      },
+      "has": {
+        "support_level": "untriaged"
+      },
+      "set": {
+        "support_level": "untriaged"
+      },
+      "size": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "HeaderMapForEachCallback": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "History": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#the-history-interface",
     "members": {
@@ -5617,6 +6044,17 @@
     },
     "support_level": "stable"
   },
+  "HmacKeyAlgorithm": {
+    "members": {
+      "hash": {
+        "support_level": "untriaged"
+      },
+      "length": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "HmacKeyParams": {
     "members": {
       "hash": {
@@ -5870,6 +6308,7 @@
   "ImageData": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#imagedata",
     "members": {
+      "ImageData": {},
       "data": {},
       "height": {},
       "width": {}
@@ -5981,6 +6420,14 @@
     },
     "support_level": "untriaged"
   },
+  "KeyAlgorithm": {
+    "members": {
+      "name": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "KeyPair": {
     "members": {
       "privateKey": {
@@ -6099,7 +6546,10 @@
       "onconnect": {},
       "ondisconnect": {},
       "outputs": {},
-      "removeEventListener": {}
+      "removeEventListener": {},
+      "sysexEnabled": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -6188,6 +6638,27 @@
     },
     "support_level": "experimental"
   },
+  "MediaDeviceInfo": {
+    "members": {
+      "deviceId": {
+        "support_level": "untriaged"
+      },
+      "groupId": {
+        "support_level": "untriaged"
+      },
+      "kind": {
+        "support_level": "untriaged"
+      },
+      "label": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "MediaDeviceInfoCallback": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "MediaElementAudioSourceNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaElementAudioSourceNode",
     "members": {
@@ -6294,6 +6765,9 @@
     "members": {
       "MediaKeys": {},
       "createSession": {},
+      "isTypeSupported": {
+        "support_level": "untriaged"
+      },
       "keySystem": {}
     },
     "support_level": "experimental"
@@ -6353,6 +6827,9 @@
       "MediaStream": {},
       "addEventListener": {},
       "addTrack": {},
+      "clone": {
+        "support_level": "untriaged"
+      },
       "dispatchEvent": {},
       "ended": {},
       "getAudioTracks": {},
@@ -6396,6 +6873,9 @@
     "comment": "http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack",
     "members": {
       "addEventListener": {},
+      "clone": {
+        "support_level": "untriaged"
+      },
       "dispatchEvent": {},
       "enabled": {},
       "getSources": {
@@ -6529,6 +7009,12 @@
       },
       "initMouseEvent": {},
       "metaKey": {},
+      "movementX": {
+        "support_level": "untriaged"
+      },
+      "movementY": {
+        "support_level": "untriaged"
+      },
       "offsetX": {
         "dart_action": "unstable",
         "support_level": "nonstandard"
@@ -6637,11 +7123,17 @@
       "appVersion": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorid"
       },
+      "connection": {
+        "support_level": "untriaged"
+      },
       "cookieEnabled": {
         "comment": "https://developer.mozilla.org/en-US/docs/DOM/window.navigator.cookieEnabled",
         "dart_action": "unstable",
         "support_level": "nonstandard"
       },
+      "dartEnabled": {
+        "support_level": "untriaged"
+      },
       "doNotTrack": {
         "comment": "http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom",
         "dart_action": "experimental",
@@ -6652,6 +7144,12 @@
         "dart_action": "unstable",
         "support_level": "stable"
       },
+      "getGamepads": {
+        "support_level": "untriaged"
+      },
+      "getMediaDevices": {
+        "support_level": "untriaged"
+      },
       "getStorageUpdates": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils",
         "support_level": "experimental"
@@ -6666,6 +7164,9 @@
       "language": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorlanguage"
       },
+      "languages": {
+        "support_level": "untriaged"
+      },
       "maxTouchPoints": {
         "support_level": "untriaged"
       },
@@ -6693,6 +7194,9 @@
         "dart_action": "unstable",
         "support_level": "nonstandard"
       },
+      "push": {
+        "support_level": "untriaged"
+      },
       "registerProtocolHandler": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorcontentutils",
         "dart_action": "unstable"
@@ -6700,6 +7204,9 @@
       "requestMIDIAccess": {
         "support_level": "untriaged"
       },
+      "sendBeacon": {
+        "support_level": "untriaged"
+      },
       "serviceWorker": {
         "support_level": "untriaged"
       },
@@ -6743,6 +7250,14 @@
     },
     "support_level": "stable"
   },
+  "NavigatorCPU": {
+    "members": {
+      "hardwareConcurrency": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "NavigatorID": {
     "members": {
       "appCodeName": {
@@ -6754,6 +7269,9 @@
       "appVersion": {
         "support_level": "untriaged"
       },
+      "dartEnabled": {
+        "support_level": "untriaged"
+      },
       "platform": {
         "support_level": "untriaged"
       },
@@ -6766,6 +7284,17 @@
     },
     "support_level": "untriaged"
   },
+  "NavigatorLanguage": {
+    "members": {
+      "language": {
+        "support_level": "untriaged"
+      },
+      "languages": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "NavigatorOnLine": {
     "members": {
       "onLine": {
@@ -6805,6 +7334,14 @@
     },
     "support_level": "experimental"
   },
+  "NetworkInformation": {
+    "members": {
+      "type": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Node": {
     "comment": "http://dom.spec.whatwg.org/#interface-node",
     "members": {
@@ -7236,6 +7773,12 @@
       },
       "lastElementChild": {
         "support_level": "untriaged"
+      },
+      "querySelector": {
+        "support_level": "untriaged"
+      },
+      "querySelectorAll": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
@@ -7255,6 +7798,42 @@
     },
     "support_level": "experimental"
   },
+  "Path2D": {
+    "members": {
+      "Path2D": {},
+      "addPath": {
+        "support_level": "untriaged"
+      },
+      "arc": {
+        "support_level": "untriaged"
+      },
+      "arcTo": {
+        "support_level": "untriaged"
+      },
+      "bezierCurveTo": {
+        "support_level": "untriaged"
+      },
+      "closePath": {
+        "support_level": "untriaged"
+      },
+      "ellipse": {
+        "support_level": "untriaged"
+      },
+      "lineTo": {
+        "support_level": "untriaged"
+      },
+      "moveTo": {
+        "support_level": "untriaged"
+      },
+      "quadraticCurveTo": {
+        "support_level": "untriaged"
+      },
+      "rect": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Performance": {
     "comment": "http://www.w3.org/TR/navigation-timing/#performance",
     "members": {
@@ -7589,6 +8168,29 @@
     },
     "support_level": "untriaged"
   },
+  "PushEvent": {
+    "members": {
+      "data": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "PushManager": {
+    "members": {},
+    "support_level": "untriaged"
+  },
+  "PushRegistration": {
+    "members": {
+      "pushEndpoint": {
+        "support_level": "untriaged"
+      },
+      "pushRegistrationId": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "RGBColor": {
     "comment": "http://dev.w3.org/csswg/cssom/",
     "dart_action": "suppress",
@@ -7881,6 +8483,21 @@
     },
     "support_level": "deprecated"
   },
+  "Request": {
+    "members": {
+      "Request": {},
+      "headers": {
+        "support_level": "untriaged"
+      },
+      "origin": {
+        "support_level": "untriaged"
+      },
+      "url": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "RequestAnimationFrameCallback": {
     "comment": "http://www.w3.org/TR/animation-timing/#FrameRequestCallback",
     "members": {
@@ -7896,6 +8513,37 @@
     },
     "support_level": "experimental"
   },
+  "Response": {
+    "members": {
+      "Response": {},
+      "headers": {
+        "support_level": "untriaged"
+      },
+      "status": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "RsaHashedKeyAlgorithm": {
+    "members": {
+      "hash": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "RsaKeyAlgorithm": {
+    "members": {
+      "modulusLength": {
+        "support_level": "untriaged"
+      },
+      "publicExponent": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "RsaKeyGenParams": {
     "members": {
       "modulusLength": {
@@ -8699,6 +9347,9 @@
       "style": {
         "support_level": "untriaged"
       },
+      "tabIndex": {
+        "support_level": "untriaged"
+      },
       "viewportElement": {},
       "xmlbase": {},
       "xmllang": {
@@ -9830,11 +10481,17 @@
     "comment": "http://www.w3.org/TR/SVG/types.html#InterfaceSVGLengthList",
     "dart_action": "unstable",
     "members": {
+      "__setter__": {
+        "support_level": "untriaged"
+      },
       "appendItem": {},
       "clear": {},
       "getItem": {},
       "initialize": {},
       "insertItemBefore": {},
+      "length": {
+        "support_level": "untriaged"
+      },
       "numberOfItems": {},
       "removeItem": {},
       "replaceItem": {}
@@ -10048,11 +10705,17 @@
     "comment": "http://www.w3.org/TR/SVG/types.html#InterfaceSVGNumberList",
     "dart_action": "unstable",
     "members": {
+      "__setter__": {
+        "support_level": "untriaged"
+      },
       "appendItem": {},
       "clear": {},
       "getItem": {},
       "initialize": {},
       "insertItemBefore": {},
+      "length": {
+        "support_level": "untriaged"
+      },
       "numberOfItems": {},
       "removeItem": {},
       "replaceItem": {}
@@ -10362,11 +11025,17 @@
     "comment": "http://www.w3.org/TR/SVG/paths.html#InterfaceSVGPathSegList",
     "dart_action": "unstable",
     "members": {
+      "__setter__": {
+        "support_level": "untriaged"
+      },
       "appendItem": {},
       "clear": {},
       "getItem": {},
       "initialize": {},
       "insertItemBefore": {},
+      "length": {
+        "support_level": "untriaged"
+      },
       "numberOfItems": {},
       "removeItem": {},
       "replaceItem": {}
@@ -10450,11 +11119,17 @@
     "comment": "http://www.w3.org/TR/SVG/coords.html#InterfaceSVGPointList",
     "dart_action": "unstable",
     "members": {
+      "__setter__": {
+        "support_level": "untriaged"
+      },
       "appendItem": {},
       "clear": {},
       "getItem": {},
       "initialize": {},
       "insertItemBefore": {},
+      "length": {
+        "support_level": "untriaged"
+      },
       "numberOfItems": {},
       "removeItem": {},
       "replaceItem": {}
@@ -10814,11 +11489,17 @@
     "comment": "http://www.w3.org/TR/SVG/types.html#InterfaceSVGStringList",
     "dart_action": "unstable",
     "members": {
+      "__setter__": {
+        "support_level": "untriaged"
+      },
       "appendItem": {},
       "clear": {},
       "getItem": {},
       "initialize": {},
       "insertItemBefore": {},
+      "length": {
+        "support_level": "untriaged"
+      },
       "numberOfItems": {},
       "removeItem": {},
       "replaceItem": {}
@@ -11096,6 +11777,9 @@
     "comment": "http://www.w3.org/TR/SVG/coords.html#InterfaceSVGTransformList",
     "dart_action": "unstable",
     "members": {
+      "__setter__": {
+        "support_level": "untriaged"
+      },
       "appendItem": {},
       "clear": {},
       "consolidate": {},
@@ -11103,6 +11787,9 @@
       "getItem": {},
       "initialize": {},
       "insertItemBefore": {},
+      "length": {
+        "support_level": "untriaged"
+      },
       "numberOfItems": {},
       "removeItem": {},
       "replaceItem": {}
@@ -11336,6 +12023,9 @@
       "bufferSize": {},
       "onaudioprocess": {
         "support_level": "untriaged"
+      },
+      "setEventListener": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "experimental"
@@ -11435,19 +12125,45 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "ServiceWorkerClients": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "ServiceWorkerContainer": {
     "members": {
+      "active": {
+        "support_level": "untriaged"
+      },
+      "controller": {
+        "support_level": "untriaged"
+      },
+      "installing": {
+        "support_level": "untriaged"
+      },
       "register": {
         "support_level": "untriaged"
       },
       "unregister": {
         "support_level": "untriaged"
+      },
+      "waiting": {
+        "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
   },
   "ServiceWorkerGlobalScope": {
-    "members": {},
+    "members": {
+      "clients": {
+        "support_level": "untriaged"
+      },
+      "onmessage": {
+        "support_level": "untriaged"
+      },
+      "scope": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "untriaged"
   },
   "ShadowRoot": {
@@ -12000,6 +12716,39 @@
   "TextMetrics": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#textmetrics",
     "members": {
+      "actualBoundingBoxAscent": {
+        "support_level": "untriaged"
+      },
+      "actualBoundingBoxDescent": {
+        "support_level": "untriaged"
+      },
+      "actualBoundingBoxLeft": {
+        "support_level": "untriaged"
+      },
+      "actualBoundingBoxRight": {
+        "support_level": "untriaged"
+      },
+      "alphabeticBaseline": {
+        "support_level": "untriaged"
+      },
+      "emHeightAscent": {
+        "support_level": "untriaged"
+      },
+      "emHeightDescent": {
+        "support_level": "untriaged"
+      },
+      "fontBoundingBoxAscent": {
+        "support_level": "untriaged"
+      },
+      "fontBoundingBoxDescent": {
+        "support_level": "untriaged"
+      },
+      "hangingBaseline": {
+        "support_level": "untriaged"
+      },
+      "ideographicBaseline": {
+        "support_level": "untriaged"
+      },
       "width": {}
     },
     "support_level": "stable"
@@ -12612,6 +13361,46 @@
     },
     "support_level": "untriaged"
   },
+  "VideoTrack": {
+    "members": {
+      "id": {
+        "support_level": "untriaged"
+      },
+      "kind": {
+        "support_level": "untriaged"
+      },
+      "label": {
+        "support_level": "untriaged"
+      },
+      "language": {
+        "support_level": "untriaged"
+      },
+      "selected": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "VideoTrackList": {
+    "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
+      "getTrackById": {
+        "support_level": "untriaged"
+      },
+      "length": {
+        "support_level": "untriaged"
+      },
+      "onchange": {
+        "support_level": "untriaged"
+      },
+      "selectedIndex": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "VoidCallback": {
     "comment": "http://www.w3.org/TR/file-system-api/#the-voidcallback-interface",
     "members": {
@@ -12657,6 +13446,14 @@
     },
     "support_level": "experimental"
   },
+  "WebGLCompressedTextureETC1": {
+    "members": {
+      "COMPRESSED_RGB_ETC1_WEBGL": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "WebGLCompressedTexturePVRTC": {
     "comment": "http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/",
     "dart_action": "experimental",
@@ -13118,6 +13915,9 @@
       "bufferSubByteData": {},
       "bufferSubData": {},
       "bufferSubDataTyped": {},
+      "canvas": {
+        "support_level": "untriaged"
+      },
       "checkFramebufferStatus": {},
       "clear": {},
       "clearColor": {},
@@ -13261,6 +14061,1355 @@
     },
     "support_level": "stable"
   },
+  "WebGLRenderingContextBase": {
+    "members": {
+      "ACTIVE_ATTRIBUTES": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_UNIFORMS": {
+        "support_level": "untriaged"
+      },
+      "ALIASED_LINE_WIDTH_RANGE": {
+        "support_level": "untriaged"
+      },
+      "ALIASED_POINT_SIZE_RANGE": {
+        "support_level": "untriaged"
+      },
+      "ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ALPHA_BITS": {
+        "support_level": "untriaged"
+      },
+      "ALWAYS": {
+        "support_level": "untriaged"
+      },
+      "ARRAY_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "ATTACHED_SHADERS": {
+        "support_level": "untriaged"
+      },
+      "BACK": {
+        "support_level": "untriaged"
+      },
+      "BLEND": {
+        "support_level": "untriaged"
+      },
+      "BLEND_COLOR": {
+        "support_level": "untriaged"
+      },
+      "BLEND_DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_DST_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLEND_SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_SRC_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLUE_BITS": {
+        "support_level": "untriaged"
+      },
+      "BOOL": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC2": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC3": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC4": {
+        "support_level": "untriaged"
+      },
+      "BROWSER_DEFAULT_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "BUFFER_USAGE": {
+        "support_level": "untriaged"
+      },
+      "BYTE": {
+        "support_level": "untriaged"
+      },
+      "CCW": {
+        "support_level": "untriaged"
+      },
+      "CLAMP_TO_EDGE": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT0": {
+        "support_level": "untriaged"
+      },
+      "COLOR_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "COLOR_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "COLOR_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "COMPILE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_TEXTURE_FORMATS": {
+        "support_level": "untriaged"
+      },
+      "CONSTANT_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "CONSTANT_COLOR": {
+        "support_level": "untriaged"
+      },
+      "CONTEXT_LOST_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "CULL_FACE": {
+        "support_level": "untriaged"
+      },
+      "CULL_FACE_MODE": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_PROGRAM": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_VERTEX_ATTRIB": {
+        "support_level": "untriaged"
+      },
+      "CW": {
+        "support_level": "untriaged"
+      },
+      "DECR": {
+        "support_level": "untriaged"
+      },
+      "DECR_WRAP": {
+        "support_level": "untriaged"
+      },
+      "DELETE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_BITS": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT16": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_FUNC": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_RANGE": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_STENCIL": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_STENCIL_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_TEST": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "DITHER": {
+        "support_level": "untriaged"
+      },
+      "DONT_CARE": {
+        "support_level": "untriaged"
+      },
+      "DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "DST_COLOR": {
+        "support_level": "untriaged"
+      },
+      "DYNAMIC_DRAW": {
+        "support_level": "untriaged"
+      },
+      "ELEMENT_ARRAY_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "ELEMENT_ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "EQUAL": {
+        "support_level": "untriaged"
+      },
+      "FASTEST": {
+        "support_level": "untriaged"
+      },
+      "FLOAT": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT4": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "FRAGMENT_SHADER": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_COMPLETE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_DIMENSIONS": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_UNSUPPORTED": {
+        "support_level": "untriaged"
+      },
+      "FRONT": {
+        "support_level": "untriaged"
+      },
+      "FRONT_AND_BACK": {
+        "support_level": "untriaged"
+      },
+      "FRONT_FACE": {
+        "support_level": "untriaged"
+      },
+      "FUNC_ADD": {
+        "support_level": "untriaged"
+      },
+      "FUNC_REVERSE_SUBTRACT": {
+        "support_level": "untriaged"
+      },
+      "FUNC_SUBTRACT": {
+        "support_level": "untriaged"
+      },
+      "GENERATE_MIPMAP_HINT": {
+        "support_level": "untriaged"
+      },
+      "GEQUAL": {
+        "support_level": "untriaged"
+      },
+      "GREATER": {
+        "support_level": "untriaged"
+      },
+      "GREEN_BITS": {
+        "support_level": "untriaged"
+      },
+      "HIGH_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "HIGH_INT": {
+        "support_level": "untriaged"
+      },
+      "IMPLEMENTATION_COLOR_READ_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "IMPLEMENTATION_COLOR_READ_TYPE": {
+        "support_level": "untriaged"
+      },
+      "INCR": {
+        "support_level": "untriaged"
+      },
+      "INCR_WRAP": {
+        "support_level": "untriaged"
+      },
+      "INT": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "INVALID_ENUM": {
+        "support_level": "untriaged"
+      },
+      "INVALID_FRAMEBUFFER_OPERATION": {
+        "support_level": "untriaged"
+      },
+      "INVALID_OPERATION": {
+        "support_level": "untriaged"
+      },
+      "INVALID_VALUE": {
+        "support_level": "untriaged"
+      },
+      "INVERT": {
+        "support_level": "untriaged"
+      },
+      "KEEP": {
+        "support_level": "untriaged"
+      },
+      "LEQUAL": {
+        "support_level": "untriaged"
+      },
+      "LESS": {
+        "support_level": "untriaged"
+      },
+      "LINEAR": {
+        "support_level": "untriaged"
+      },
+      "LINEAR_MIPMAP_LINEAR": {
+        "support_level": "untriaged"
+      },
+      "LINEAR_MIPMAP_NEAREST": {
+        "support_level": "untriaged"
+      },
+      "LINES": {
+        "support_level": "untriaged"
+      },
+      "LINE_LOOP": {
+        "support_level": "untriaged"
+      },
+      "LINE_STRIP": {
+        "support_level": "untriaged"
+      },
+      "LINE_WIDTH": {
+        "support_level": "untriaged"
+      },
+      "LINK_STATUS": {
+        "support_level": "untriaged"
+      },
+      "LOW_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "LOW_INT": {
+        "support_level": "untriaged"
+      },
+      "LUMINANCE": {
+        "support_level": "untriaged"
+      },
+      "LUMINANCE_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_CUBE_MAP_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_RENDERBUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_VARYING_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_UNIFORM_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VIEWPORT_DIMS": {
+        "support_level": "untriaged"
+      },
+      "MEDIUM_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "MEDIUM_INT": {
+        "support_level": "untriaged"
+      },
+      "MIRRORED_REPEAT": {
+        "support_level": "untriaged"
+      },
+      "NEAREST": {
+        "support_level": "untriaged"
+      },
+      "NEAREST_MIPMAP_LINEAR": {
+        "support_level": "untriaged"
+      },
+      "NEAREST_MIPMAP_NEAREST": {
+        "support_level": "untriaged"
+      },
+      "NEVER": {
+        "support_level": "untriaged"
+      },
+      "NICEST": {
+        "support_level": "untriaged"
+      },
+      "NONE": {
+        "support_level": "untriaged"
+      },
+      "NOTEQUAL": {
+        "support_level": "untriaged"
+      },
+      "NO_ERROR": {
+        "support_level": "untriaged"
+      },
+      "ONE": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_CONSTANT_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_CONSTANT_COLOR": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_DST_COLOR": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_SRC_COLOR": {
+        "support_level": "untriaged"
+      },
+      "OUT_OF_MEMORY": {
+        "support_level": "untriaged"
+      },
+      "PACK_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "POINTS": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_FACTOR": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_FILL": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_UNITS": {
+        "support_level": "untriaged"
+      },
+      "RED_BITS": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_ALPHA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_BLUE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_DEPTH_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_GREEN_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_HEIGHT": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_INTERNAL_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_RED_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_STENCIL_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_WIDTH": {
+        "support_level": "untriaged"
+      },
+      "RENDERER": {
+        "support_level": "untriaged"
+      },
+      "REPEAT": {
+        "support_level": "untriaged"
+      },
+      "REPLACE": {
+        "support_level": "untriaged"
+      },
+      "RGB": {
+        "support_level": "untriaged"
+      },
+      "RGB565": {
+        "support_level": "untriaged"
+      },
+      "RGB5_A1": {
+        "support_level": "untriaged"
+      },
+      "RGBA": {
+        "support_level": "untriaged"
+      },
+      "RGBA4": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLES": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_ALPHA_TO_COVERAGE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_BUFFERS": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE_INVERT": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE_VALUE": {
+        "support_level": "untriaged"
+      },
+      "SCISSOR_BOX": {
+        "support_level": "untriaged"
+      },
+      "SCISSOR_TEST": {
+        "support_level": "untriaged"
+      },
+      "SHADER_TYPE": {
+        "support_level": "untriaged"
+      },
+      "SHADING_LANGUAGE_VERSION": {
+        "support_level": "untriaged"
+      },
+      "SHORT": {
+        "support_level": "untriaged"
+      },
+      "SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "SRC_ALPHA_SATURATE": {
+        "support_level": "untriaged"
+      },
+      "SRC_COLOR": {
+        "support_level": "untriaged"
+      },
+      "STATIC_DRAW": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_FUNC": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_PASS_DEPTH_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_PASS_DEPTH_PASS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_REF": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_VALUE_MASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BITS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_FUNC": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_INDEX": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_INDEX8": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_PASS_DEPTH_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_PASS_DEPTH_PASS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_REF": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_TEST": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_VALUE_MASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "STREAM_DRAW": {
+        "support_level": "untriaged"
+      },
+      "SUBPIXEL_BITS": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE0": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE1": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE10": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE11": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE12": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE13": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE14": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE15": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE16": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE17": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE18": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE19": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE2": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE20": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE21": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE22": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE23": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE24": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE25": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE26": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE27": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE28": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE29": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE3": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE30": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE31": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE4": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE5": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE6": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE7": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE8": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE9": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_2D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_2D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_CUBE_MAP": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_X": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_Y": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_Z": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_X": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_Y": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_Z": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MAG_FILTER": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MIN_FILTER": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_S": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_T": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLES": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLE_FAN": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLE_STRIP": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_COLORSPACE_CONVERSION_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_FLIP_Y_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_PREMULTIPLY_ALPHA_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_BYTE": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_4_4_4_4": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_5_5_5_1": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_5_6_5": {
+        "support_level": "untriaged"
+      },
+      "VALIDATE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "VENDOR": {
+        "support_level": "untriaged"
+      },
+      "VERSION": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_ENABLED": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_NORMALIZED": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_POINTER": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_SIZE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_TYPE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_SHADER": {
+        "support_level": "untriaged"
+      },
+      "VIEWPORT": {
+        "support_level": "untriaged"
+      },
+      "ZERO": {
+        "support_level": "untriaged"
+      },
+      "activeTexture": {
+        "support_level": "untriaged"
+      },
+      "attachShader": {
+        "support_level": "untriaged"
+      },
+      "bindAttribLocation": {
+        "support_level": "untriaged"
+      },
+      "bindBuffer": {
+        "support_level": "untriaged"
+      },
+      "bindFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "bindRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "bindTexture": {
+        "support_level": "untriaged"
+      },
+      "blendColor": {
+        "support_level": "untriaged"
+      },
+      "blendEquation": {
+        "support_level": "untriaged"
+      },
+      "blendEquationSeparate": {
+        "support_level": "untriaged"
+      },
+      "blendFunc": {
+        "support_level": "untriaged"
+      },
+      "blendFuncSeparate": {
+        "support_level": "untriaged"
+      },
+      "bufferByteData": {
+        "support_level": "untriaged"
+      },
+      "bufferData": {
+        "support_level": "untriaged"
+      },
+      "bufferDataTyped": {
+        "support_level": "untriaged"
+      },
+      "bufferSubByteData": {
+        "support_level": "untriaged"
+      },
+      "bufferSubData": {
+        "support_level": "untriaged"
+      },
+      "bufferSubDataTyped": {
+        "support_level": "untriaged"
+      },
+      "canvas": {
+        "support_level": "untriaged"
+      },
+      "checkFramebufferStatus": {
+        "support_level": "untriaged"
+      },
+      "clear": {
+        "support_level": "untriaged"
+      },
+      "clearColor": {
+        "support_level": "untriaged"
+      },
+      "clearDepth": {
+        "support_level": "untriaged"
+      },
+      "clearStencil": {
+        "support_level": "untriaged"
+      },
+      "colorMask": {
+        "support_level": "untriaged"
+      },
+      "compileShader": {
+        "support_level": "untriaged"
+      },
+      "compressedTexImage2D": {
+        "support_level": "untriaged"
+      },
+      "compressedTexSubImage2D": {
+        "support_level": "untriaged"
+      },
+      "copyTexImage2D": {
+        "support_level": "untriaged"
+      },
+      "copyTexSubImage2D": {
+        "support_level": "untriaged"
+      },
+      "createBuffer": {
+        "support_level": "untriaged"
+      },
+      "createFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "createProgram": {
+        "support_level": "untriaged"
+      },
+      "createRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "createShader": {
+        "support_level": "untriaged"
+      },
+      "createTexture": {
+        "support_level": "untriaged"
+      },
+      "cullFace": {
+        "support_level": "untriaged"
+      },
+      "deleteBuffer": {
+        "support_level": "untriaged"
+      },
+      "deleteFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "deleteProgram": {
+        "support_level": "untriaged"
+      },
+      "deleteRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "deleteShader": {
+        "support_level": "untriaged"
+      },
+      "deleteTexture": {
+        "support_level": "untriaged"
+      },
+      "depthFunc": {
+        "support_level": "untriaged"
+      },
+      "depthMask": {
+        "support_level": "untriaged"
+      },
+      "depthRange": {
+        "support_level": "untriaged"
+      },
+      "detachShader": {
+        "support_level": "untriaged"
+      },
+      "disable": {
+        "support_level": "untriaged"
+      },
+      "disableVertexAttribArray": {
+        "support_level": "untriaged"
+      },
+      "drawArrays": {
+        "support_level": "untriaged"
+      },
+      "drawElements": {
+        "support_level": "untriaged"
+      },
+      "drawingBufferHeight": {
+        "support_level": "untriaged"
+      },
+      "drawingBufferWidth": {
+        "support_level": "untriaged"
+      },
+      "enable": {
+        "support_level": "untriaged"
+      },
+      "enableVertexAttribArray": {
+        "support_level": "untriaged"
+      },
+      "finish": {
+        "support_level": "untriaged"
+      },
+      "flush": {
+        "support_level": "untriaged"
+      },
+      "framebufferRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "framebufferTexture2D": {
+        "support_level": "untriaged"
+      },
+      "frontFace": {
+        "support_level": "untriaged"
+      },
+      "generateMipmap": {
+        "support_level": "untriaged"
+      },
+      "getActiveAttrib": {
+        "support_level": "untriaged"
+      },
+      "getActiveUniform": {
+        "support_level": "untriaged"
+      },
+      "getAttachedShaders": {
+        "support_level": "untriaged"
+      },
+      "getAttribLocation": {
+        "support_level": "untriaged"
+      },
+      "getBufferParameter": {
+        "support_level": "untriaged"
+      },
+      "getContextAttributes": {
+        "support_level": "untriaged"
+      },
+      "getError": {
+        "support_level": "untriaged"
+      },
+      "getExtension": {
+        "support_level": "untriaged"
+      },
+      "getFramebufferAttachmentParameter": {
+        "support_level": "untriaged"
+      },
+      "getParameter": {
+        "support_level": "untriaged"
+      },
+      "getProgramInfoLog": {
+        "support_level": "untriaged"
+      },
+      "getProgramParameter": {
+        "support_level": "untriaged"
+      },
+      "getRenderbufferParameter": {
+        "support_level": "untriaged"
+      },
+      "getShaderInfoLog": {
+        "support_level": "untriaged"
+      },
+      "getShaderParameter": {
+        "support_level": "untriaged"
+      },
+      "getShaderPrecisionFormat": {
+        "support_level": "untriaged"
+      },
+      "getShaderSource": {
+        "support_level": "untriaged"
+      },
+      "getSupportedExtensions": {
+        "support_level": "untriaged"
+      },
+      "getTexParameter": {
+        "support_level": "untriaged"
+      },
+      "getUniform": {
+        "support_level": "untriaged"
+      },
+      "getUniformLocation": {
+        "support_level": "untriaged"
+      },
+      "getVertexAttrib": {
+        "support_level": "untriaged"
+      },
+      "getVertexAttribOffset": {
+        "support_level": "untriaged"
+      },
+      "hint": {
+        "support_level": "untriaged"
+      },
+      "isBuffer": {
+        "support_level": "untriaged"
+      },
+      "isContextLost": {
+        "support_level": "untriaged"
+      },
+      "isEnabled": {
+        "support_level": "untriaged"
+      },
+      "isFramebuffer": {
+        "support_level": "untriaged"
+      },
+      "isProgram": {
+        "support_level": "untriaged"
+      },
+      "isRenderbuffer": {
+        "support_level": "untriaged"
+      },
+      "isShader": {
+        "support_level": "untriaged"
+      },
+      "isTexture": {
+        "support_level": "untriaged"
+      },
+      "lineWidth": {
+        "support_level": "untriaged"
+      },
+      "linkProgram": {
+        "support_level": "untriaged"
+      },
+      "pixelStorei": {
+        "support_level": "untriaged"
+      },
+      "polygonOffset": {
+        "support_level": "untriaged"
+      },
+      "readPixels": {
+        "support_level": "untriaged"
+      },
+      "renderbufferStorage": {
+        "support_level": "untriaged"
+      },
+      "sampleCoverage": {
+        "support_level": "untriaged"
+      },
+      "scissor": {
+        "support_level": "untriaged"
+      },
+      "shaderSource": {
+        "support_level": "untriaged"
+      },
+      "stencilFunc": {
+        "support_level": "untriaged"
+      },
+      "stencilFuncSeparate": {
+        "support_level": "untriaged"
+      },
+      "stencilMask": {
+        "support_level": "untriaged"
+      },
+      "stencilMaskSeparate": {
+        "support_level": "untriaged"
+      },
+      "stencilOp": {
+        "support_level": "untriaged"
+      },
+      "stencilOpSeparate": {
+        "support_level": "untriaged"
+      },
+      "texImage2D": {
+        "support_level": "untriaged"
+      },
+      "texImage2DCanvas": {
+        "support_level": "untriaged"
+      },
+      "texImage2DImage": {
+        "support_level": "untriaged"
+      },
+      "texImage2DImageData": {
+        "support_level": "untriaged"
+      },
+      "texImage2DVideo": {
+        "support_level": "untriaged"
+      },
+      "texParameterf": {
+        "support_level": "untriaged"
+      },
+      "texParameteri": {
+        "support_level": "untriaged"
+      },
+      "texSubImage2D": {
+        "support_level": "untriaged"
+      },
+      "texSubImage2DCanvas": {
+        "support_level": "untriaged"
+      },
+      "texSubImage2DImage": {
+        "support_level": "untriaged"
+      },
+      "texSubImage2DImageData": {
+        "support_level": "untriaged"
+      },
+      "texSubImage2DVideo": {
+        "support_level": "untriaged"
+      },
+      "uniform1f": {
+        "support_level": "untriaged"
+      },
+      "uniform1fv": {
+        "support_level": "untriaged"
+      },
+      "uniform1i": {
+        "support_level": "untriaged"
+      },
+      "uniform1iv": {
+        "support_level": "untriaged"
+      },
+      "uniform2f": {
+        "support_level": "untriaged"
+      },
+      "uniform2fv": {
+        "support_level": "untriaged"
+      },
+      "uniform2i": {
+        "support_level": "untriaged"
+      },
+      "uniform2iv": {
+        "support_level": "untriaged"
+      },
+      "uniform3f": {
+        "support_level": "untriaged"
+      },
+      "uniform3fv": {
+        "support_level": "untriaged"
+      },
+      "uniform3i": {
+        "support_level": "untriaged"
+      },
+      "uniform3iv": {
+        "support_level": "untriaged"
+      },
+      "uniform4f": {
+        "support_level": "untriaged"
+      },
+      "uniform4fv": {
+        "support_level": "untriaged"
+      },
+      "uniform4i": {
+        "support_level": "untriaged"
+      },
+      "uniform4iv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix2fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix3fv": {
+        "support_level": "untriaged"
+      },
+      "uniformMatrix4fv": {
+        "support_level": "untriaged"
+      },
+      "useProgram": {
+        "support_level": "untriaged"
+      },
+      "validateProgram": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib1f": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib1fv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib2f": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib2fv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib3f": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib3fv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib4f": {
+        "support_level": "untriaged"
+      },
+      "vertexAttrib4fv": {
+        "support_level": "untriaged"
+      },
+      "vertexAttribPointer": {
+        "support_level": "untriaged"
+      },
+      "viewport": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "WebGLShader": {
     "comment": "http://www.khronos.org/registry/webgl/specs/latest/#5.8",
     "members": {},
@@ -14239,6 +16388,9 @@
   },
   "WorkerPerformance": {
     "members": {
+      "memory": {
+        "support_level": "untriaged"
+      },
       "now": {
         "support_level": "untriaged"
       }
@@ -14282,6 +16434,9 @@
       "response": {},
       "responseText": {},
       "responseType": {},
+      "responseURL": {
+        "support_level": "untriaged"
+      },
       "responseXML": {},
       "send": {},
       "setRequestHeader": {},
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index ee014c0..a59b22a 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -43,20 +43,6 @@
   [Custom] void _setEventListener(EventListener eventListener);
 };
 
-/*
-// TODO(vsm): How should this interact with the new ChildNode and
-// ParentNode interfaces?
-// Force ElementTraversal. WebKit defines these directly.
-interface ElementTraversal : ChildNode, ParentNode {
-  readonly attribute unsigned long childElementCount;
-  readonly attribute Element firstElementChild;
-  readonly attribute Element lastElementChild;
-  readonly attribute Element nextElementSibling;
-  readonly attribute Element previousElementSibling;
-};
-Element implements ElementTraversal;
-*/
-
 [DartSupplemental]
 interface Element {
   readonly attribute Element nextElementSibling;
@@ -229,8 +215,8 @@
     [CallWith=ScriptState, RaisesException] IDBRequest put(any value, [DartForceOptional] optional any key);
     [CallWith=ScriptState, RaisesException] IDBRequest add(any value, [DartForceOptional] optional any key);
     // [CallWith=ExecutionContext, ImplementedAs=deleteFunction, RaisesException] IDBRequest delete(any key);
-    [CallWith=ExecutionContext, RaisesException] IDBRequest openCursor(any key, [DartForceOptional] optional DOMString direction);
-    [CallWith=ExecutionContext, RaisesException] IDBRequest count(any key);
+    [CallWith=ExecutionContext, RaisesException] IDBRequest openCursor([Default=Undefined] optional any range, [DartForceOptional] optional DOMString direction);
+    [CallWith=ExecutionContext, RaisesException] IDBRequest count([Default=Undefined] any key);
 };
 
 interface EntrySync {
@@ -239,7 +225,6 @@
   EntrySync getParent();
 };
 
-
 [DartSupplemental,
   CustomConstructor,
   Constructor(Array blobParts, optional DOMString type, optional DOMString endings)
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 53b2132..896bb25 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -10,10 +10,27 @@
 import sys
 
 # Setup all paths to find our PYTHON code
+
+# dart_dir is the location of dart's enlistment dartium (dartium-git/src/dart)
+# and Dart (dart-git/dart).
 dart_dir = os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
 sys.path.insert(1, os.path.join(dart_dir, 'tools/dom/new_scripts'))
 sys.path.insert(1, os.path.join(dart_dir, 'third_party/WebCore/bindings/scripts'))
-sys.path.insert(1, os.path.join(dart_dir, 'third_party'))
+
+# Dartium's third_party directory location is dartium-git/src/third_party
+# and Dart's third_party directory location is dart-git/dart/third_party.
+third_party_dir = os.path.join(dart_dir, 'third_party')
+
+ply_dir = os.path.join(third_party_dir, 'ply')
+# If ply directory found then we're a Dart enlistment; third_party location
+# is dart-git/dart/third_party
+if not os.path.exists(ply_dir):
+  # For Dartium (ply directory is dartium-git/src/third_party/ply) third_party
+  # location is dartium-git/src/third_party 
+  third_party_dir = os.path.join(dart_dir, '..', 'third_party')
+  assert(os.path.exists(third_party_dir))
+sys.path.insert(1, third_party_dir)
+
 sys.path.insert(1, os.path.join(dart_dir, 'tools/dom/scripts'))
 
 import dartgenerator
diff --git a/tools/dom/scripts/databasebuilder.py b/tools/dom/scripts/databasebuilder.py
index 604bc22..01e4bd6 100755
--- a/tools/dom/scripts/databasebuilder.py
+++ b/tools/dom/scripts/databasebuilder.py
@@ -397,6 +397,27 @@
 
             if self._merge_ext_attrs(old_arg.ext_attrs, new_arg.ext_attrs):
               changed = True
+
+            # Merge in [Default=Undefined] and DOMString a = null handling in
+            # IDL.  The IDL model (IDLArgument) coalesces these two different
+            # default value syntaxes into the default_value* models.
+            old_default_value = old_arg.default_value
+            new_default_value = new_arg.default_value
+            old_default_value_is_null = old_arg.default_value_is_null
+            new_default_value_is_null = new_arg.default_value_is_null
+            if old_default_value != new_default_value:
+              old_arg.default_value = new_default_value
+              changed = True
+            if old_default_value_is_null != new_default_value_is_null:
+              old_arg.default_value_is_null = new_default_value_is_null
+              changed = True
+
+            # Merge in any optional argument differences.
+            old_optional = old_arg.optional
+            new_optional = new_arg.optional
+            if old_optional != new_optional:
+              old_arg.optional = new_optional
+              changed = True
         # Maybe merge annotations:
         if (isinstance(old_node, IDLAttribute) or
             isinstance(old_node, IDLOperation)):
@@ -530,6 +551,21 @@
     self._impl_stmts = []
     self._imported_interfaces = []
 
+  def _compute_dart_idl_implements(self, idl_filename):
+    full_path = os.path.realpath(idl_filename)
+
+    with open(full_path) as f:
+        idl_file_contents = f.read()
+
+    implements_re = (r'^\s*'
+                     r'(\w+)\s+'
+                     r'implements\s+'
+                     r'(\w+)\s*'
+                     r';')
+
+    implements_matches = re.finditer(implements_re, idl_file_contents, re.MULTILINE)
+    return [match.groups() for match in implements_matches]
+
   # Compile the IDL file with the Blink compiler and remember each AST for the
   # IDL.
   def _blink_compile_idl_files(self, file_paths, import_options, parallel, is_dart_idl):
@@ -538,14 +574,20 @@
 
       # 2-stage computation: individual, then overall
       for file_path in file_paths:
-        filename = os.path.splitext(os.path.basename(file_path))[0]
         compute_info_individual(file_path, 'dart')
       info_individuals = [info_individual()]
       compute_interfaces_info_overall(info_individuals)
 
       end_time = time.time()
-      print 'Compute dependencies %s seconds' % round((end_time - start_time),
-                                                      2)
+      print 'Compute dependencies %s seconds' % round((end_time - start_time), 2)
+    else:
+      # Compute the interface_info for dart.idl for implements defined.  This
+      # file is special in that more than one interface can exist in this file.
+      implement_pairs = self._compute_dart_idl_implements(file_paths[0])
+
+      interfaces_info['__dart_idl___'] = {
+        'implement_pairs': implement_pairs,
+      }
 
     # use --parallel for async on a pool.  Look at doing it like Blink
     blink_compiler = _new_compile_idl_file
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 73e3676..59c5458 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -17,6 +17,7 @@
 _pure_interfaces = monitored.Set('generator._pure_interfaces', [
     # TODO(sra): DOMStringMap should be a class implementing Map<String,String>.
     'DOMStringMap',
+    'CanvasPathMethods',
     'ChildNode',
     'EventListener',
     'GlobalEventHandlers',
@@ -34,6 +35,7 @@
     'TimeoutHandler',
     'URLUtils',
     'URLUtilsReadOnly',
+    'WebGLRenderingContextBase',
     'WindowBase64',
     'WindowEventHandlers',
     'WindowTimers',
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index a982335..29b757f 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -8,7 +8,7 @@
 
 import emitter
 from generator import AnalyzeOperation, ConstantOutputOrder, \
-    DartDomNameOfAttribute, FindMatchingAttribute, \
+    DartDomNameOfAttribute, FindMatchingAttribute, IsPureInterface, \
     TypeOrNothing, ConvertToFuture, GetCallbackInfo
 from copy import deepcopy
 from htmlrenamer import convert_to_future_members, custom_html_constructors, \
@@ -143,9 +143,16 @@
     if not interface.parents:
       return
 
-    parent = self._database.GetInterface(interface.parents[0].type.id)
+    parent_name = interface.parents[0].type.id
+    parent = self._database.GetInterface(parent_name)
     if parent == self._interface or parent == interface:
       return
+
+    # Never remove operations that are added as a result of an implements they
+    # are pure interfaces (mixins to this interface).
+    if (IsPureInterface(parent_name)):
+      return
+
     for operation in parent.operations:
       if operation.id in operationsByName:
         operations = operationsByName[operation.id]
@@ -354,6 +361,10 @@
 
     def GenerateChecksAndCall(signature_index, argument_count):
       checks = []
+      typechecked_interface = \
+          ('TypeChecking' in self._interface.ext_attrs) and \
+          ('Interface' in self._interface.ext_attrs['TypeChecking'])
+
       for i in reversed(range(0, argument_count)):
         argument = signatures[signature_index][i]
         parameter_name = parameter_names[i]
@@ -363,8 +374,19 @@
         if test_type in ['dynamic', 'Object']:
           checks.append('%s != null' % parameter_name)
         elif not can_omit_type_check(test_type, i):
-          checks.append('(%s is %s || %s == null)' % (
-              parameter_name, test_type, parameter_name))
+          typechecked = typechecked_interface or \
+              ('TypeChecking' in argument.ext_attrs) and \
+              ('Interface' in argument.ext_attrs['TypeChecking'])
+          converts_null = \
+              ('TreatNullAs' in argument.ext_attrs) or \
+              (argument.default_value is not None) or \
+              (argument.default_value_is_null)
+          if argument.type.nullable or converts_null or not typechecked:
+            checks.append('(%s is %s || %s == null)' % (
+                parameter_name, test_type, parameter_name))
+          else:
+            checks.append('(%s is %s)' % (
+                parameter_name, test_type))
         elif i >= number_of_required_in_dart:
           checks.append('%s != null' % parameter_name)
 
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 7933e08..0df47c0 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -68,6 +68,7 @@
 # Interfaces that are suppressed, but need to still exist for Dartium and to
 # properly wrap DOM objects if/when encountered.
 _removed_html_interfaces = [
+  'CanvasPathMethods',
   'CDataSection',
   'CSSPrimitiveValue',
   'CSSUnknownRule',
@@ -99,6 +100,7 @@
   'RGBColor',
   'RadioNodeList',  # Folded onto NodeList in dart2js.
   'Rect',
+  'Response', # TODO: Symbol conflicts with Angular: dartbug.com/20937
   'ServiceWorker',
   'SQLTransactionSync', # Workers
   'SQLTransactionSyncCallback', # Workers
@@ -253,6 +255,8 @@
   'Element.scrollHeight',
 
   'Event.initEvent',
+  'EventTarget.addEventListener',
+  'EventTarget.removeEventListener',
   'FileReader.result',
   'Geolocation.clearWatch',
   'Geolocation.getCurrentPosition',
@@ -295,6 +299,8 @@
   'MouseEvent.initMouseEvent',
   'MouseEvent.clientX',
   'MouseEvent.clientY',
+  'MouseEvent.movementX',
+  'MouseEvent.movementY',
   'MouseEvent.webkitMovementX',
   'MouseEvent.webkitMovementY',
   'MouseEvent.offsetX',
@@ -423,37 +429,37 @@
       '_createObjectUrlFromWebKitSource',
   'URL.createObjectURL(MediaStream stream)': 'createObjectUrlFromStream',
   'URL.createObjectURL(Blob blob)': 'createObjectUrlFromBlob',
-  'WebGLRenderingContext.texImage2D(unsigned long target, long level, '
+  'WebGLRenderingContextBase.texImage2D(unsigned long target, long level, '
       'unsigned long internalformat, unsigned long format, unsigned long '
       'type, ImageData pixels)': 'texImage2DImageData',
-  'WebGLRenderingContext.texImage2D(unsigned long target, long level, '
+  'WebGLRenderingContextBase.texImage2D(unsigned long target, long level, '
       'unsigned long internalformat, unsigned long format, unsigned long '
       'type, HTMLImageElement image)': 'texImage2DImage',
-  'WebGLRenderingContext.texImage2D(unsigned long target, long level, '
+  'WebGLRenderingContextBase.texImage2D(unsigned long target, long level, '
       'unsigned long internalformat, unsigned long format, unsigned long '
       'type, HTMLCanvasElement canvas)': 'texImage2DCanvas',
-  'WebGLRenderingContext.texImage2D(unsigned long target, long level, '
+  'WebGLRenderingContextBase.texImage2D(unsigned long target, long level, '
       'unsigned long internalformat, unsigned long format, unsigned long '
       'type, HTMLVideoElement video)': 'texImage2DVideo',
-  'WebGLRenderingContext.texSubImage2D(unsigned long target, long level, '
+  'WebGLRenderingContextBase.texSubImage2D(unsigned long target, long level, '
       'long xoffset, long yoffset, unsigned long format, unsigned long type, '
       'ImageData pixels)': 'texSubImage2DImageData',
-  'WebGLRenderingContext.texSubImage2D(unsigned long target, long level, '
+  'WebGLRenderingContextBase.texSubImage2D(unsigned long target, long level, '
       'long xoffset, long yoffset, unsigned long format, unsigned long type, '
       'HTMLImageElement image)': 'texSubImage2DImage',
-  'WebGLRenderingContext.texSubImage2D(unsigned long target, long level, '
+  'WebGLRenderingContextBase.texSubImage2D(unsigned long target, long level, '
       'long xoffset, long yoffset, unsigned long format, unsigned long type, '
       'HTMLCanvasElement canvas)': 'texSubImage2DCanvas',
-  'WebGLRenderingContext.texSubImage2D(unsigned long target, long level, '
+  'WebGLRenderingContextBase.texSubImage2D(unsigned long target, long level, '
       'long xoffset, long yoffset, unsigned long format, unsigned long type, '
       'HTMLVideoElement video)': 'texSubImage2DVideo',
-  'WebGLRenderingContext.bufferData(unsigned long target, ArrayBuffer data, '
-      'unsigned long usage)': 'bufferByteData',
-  'WebGLRenderingContext.bufferData(unsigned long target, '
+  'WebGLRenderingContextBase.bufferData(unsigned long target, '
+      'ArrayBuffer data, unsigned long usage)': 'bufferByteData',
+  'WebGLRenderingContextBase.bufferData(unsigned long target, '
       'ArrayBufferView data, unsigned long usage)': 'bufferDataTyped',
-  'WebGLRenderingContext.bufferSubData(unsigned long target, '
+  'WebGLRenderingContextBase.bufferSubData(unsigned long target, '
       'long long offset, ArrayBuffer data)': 'bufferSubByteData',
-  'WebGLRenderingContext.bufferSubData(unsigned long target, '
+  'WebGLRenderingContextBase.bufferSubData(unsigned long target, '
       'long long offset, ArrayBufferView data)': 'bufferSubDataTyped',
   'WebSocket.send(ArrayBuffer data)': 'sendByteBuffer',
   'WebSocket.send(ArrayBufferView data)': 'sendTypedData',
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index 9f9e726..efe0bf1 100755
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -160,7 +160,8 @@
     # TODO(terry): Seems bogus to check for so many things probably better to just
     #              pass in blink_compile and drive it off from that...
     elif (ast and not(isinstance(ast, dict)) and
-          not(isinstance(ast, str)) and ast.__module__ == "idl_definitions"):
+          not(isinstance(ast, str)) and
+          (ast.__module__ == "idl_definitions" or ast.__module__ == "idl_types")):
       field_name = self._convert_label_to_field(label)
       if hasattr(ast, field_name):
         field_value = getattr(ast, field_name)
@@ -181,25 +182,6 @@
 
     return res
 
-  def _convert_from_blink(self, object, label):
-    field_name = self._convert_label_to_field(label)
-    if hasattr(object, field_name):
-      field_value = getattr(object, field_name)
-      if field_value:
-        if label == 'Interface' or label == 'Enum':
-          for key in field_value:
-            value = field_value[key]
-            res.append(value)
-        elif isinstance(field_value, list):
-          for item in field_value:
-            res.append(item)
-        elif label == 'ParentInterface' or label == 'InterfaceType':
-          # Fetch the AST for the parent interface.
-          parent_idlnode = new_asts[field_value]
-          res.append(parent_idlnode.interfaces[field_value])
-        else:
-          res.append(field_value)
-
   def _find_first(self, ast, label):
     """Convenience method for _find_all(..., max_results=1).
     Returns a single element instead of a list, or None if nothing
@@ -370,8 +352,23 @@
       for interface in self.interfaces:
         blink_interface = ast.interfaces.get(interface.id)
         if filename_basename == self.DART_IDL:
-          # TODO(terry): Does this seem right?
+          # Special handling for dart.idl we need to remember the interface,
+          # since we could have many (not one interface / file). Then build up
+          # the IDLImplementsStatement for any implements in dart.idl.
+          interface_info = interfaces_info['__dart_idl___'];
+
           self.implementsStatements = []
+
+          implement_pairs = interface_info['implement_pairs']
+          for implement_pair in implement_pairs:
+            interface_name = implement_pair[0]
+            implemented_name = implement_pair[1]
+
+            implementor = new_asts[interface_name].interfaces.get(interface_name)
+            implement_statement = self._createImplementsStatement(implementor,
+                                                                  implemented_name)
+
+            self.implementsStatements.append(implement_statement)
         else:
           interface_info = interfaces_info[interface.id]
 
@@ -383,13 +380,8 @@
 
             # TODO(terry): Need to handle more than one implements.
             for implemented_name in implements:
-              implemented = new_asts[implemented_name].interfaces.get(implemented_name)
-
-              implement_statement = IDLImplementsStatement(implemented)
-
-              implement_statement.implementor = IDLType(implementor)
-              implement_statement.implemented = IDLType(implemented)
-
+              implement_statement = self._createImplementsStatement(implementor,
+                                                                    implemented_name)
               self.implementsStatements.append(implement_statement)
           else:
             self.implementsStatements = []
@@ -402,6 +394,16 @@
 
     self.enums = self._convert_all(ast, 'Enum', IDLEnum)
 
+  def _createImplementsStatement(self, implementor, implemented_name):
+    implemented = new_asts[implemented_name].interfaces.get(implemented_name)
+
+    implement_statement = IDLImplementsStatement(implemented)
+
+    implement_statement.implementor = IDLType(implementor)
+    implement_statement.implemented = IDLType(implemented)
+
+    return implement_statement
+
 
 class IDLModule(IDLNode):
   """IDLModule has an id, and may contain interfaces, type defs and
@@ -559,7 +561,18 @@
       else:
         # IdlUnionType
         assert ast.is_union_type
-        self.id = self._label_to_type('UnionType', ast)
+        # TODO(terry): For union types use any otherwise type is unionType is
+        #              not found and is removed during merging.
+        self.id = 'any'
+        # TODO(terry): Any union type e.g. 'type1 or type2 or type2',
+        #                            'typedef (Type1 or Type2) UnionType'
+        # Is a problem we need to extend IDLType and IDLTypeDef to handle more
+        # than one type.
+        #
+        # Also for typedef's e.g.,
+        #                 typedef (Type1 or Type2) UnionType
+        # should consider synthesizing a new interface (e.g., UnionType) that's
+        # both Type1 and Type2.
     if not self.id:
       print '>>>> __module__ %s' % ast.__module__
       raise SyntaxError('Could not parse type %s' % (ast))
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 043f164..54b3ce3 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -10,7 +10,7 @@
 import os
 from generator import *
 from htmldartgenerator import *
-from idlnode import IDLArgument, IDLAttribute, IDLEnum
+from idlnode import IDLArgument, IDLAttribute, IDLEnum, IDLMember
 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES
 
 # This is an ugly hack to get things working on the M35 roll.  Once we
@@ -519,7 +519,7 @@
           FUNCTION=function_name,
           PARAMETERS=', '.join(parameters))
 
-      if 'Custom' in operation.ext_attrs:
+      if _IsCustom(operation):
         continue
 
       cpp_impl_includes |= set(conversion_includes)
@@ -989,9 +989,8 @@
     return_type = self.SecureOutputType(attr.type.id, False, read_only)
     parameters = []
     dart_declaration = '%s get %s' % (return_type, html_name)
-    is_custom = ('Custom' in attr.ext_attrs and
-                 (attr.ext_attrs['Custom'] == None or
-                  attr.ext_attrs['Custom'] == 'Getter'))
+    is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or
+                                     _IsCustomValue(attr, 'Getter'))
     # This seems to have been replaced with Custom=Getter (see above), but
     # check to be sure we don't see the old syntax
     assert(not ('CustomGetter' in attr.ext_attrs))
@@ -1044,9 +1043,8 @@
     parameters = ['value']
     ptype = self._DartType(attr.type.id)
     dart_declaration = 'void set %s(%s value)' % (html_name, ptype)
-    is_custom = ('Custom' in attr.ext_attrs and
-                 (attr.ext_attrs['Custom'] == None or
-                  attr.ext_attrs['Custom'] == 'Setter'))
+    is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or
+                                     _IsCustomValue(attr, 'Setter'))
     # This seems to have been replaced with Custom=Setter (see above), but
     # check to be sure we don't see the old syntax
     assert(not ('CustomSetter' in attr.ext_attrs))
@@ -1113,7 +1111,7 @@
     elif self._HasExplicitIndexedGetter():
       self._EmitExplicitIndexedGetter(dart_element_type)
     else:
-      is_custom = any((op.id == 'item' and 'Custom' in op.ext_attrs) for op in self._interface.operations)
+      is_custom = any((op.id == 'item' and _IsCustom(op)) for op in self._interface.operations)
       # First emit a toplevel function to do the native call
       # Calls to this are emitted elsewhere,
       dart_native_name, resolver_string = \
@@ -1223,7 +1221,7 @@
         formals)
 
     operation = info.operations[0]
-    is_custom = 'Custom' in operation.ext_attrs
+    is_custom = _IsCustom(operation)
     has_optional_arguments = any(self._IsArgumentOptionalInWebCore(operation, argument) for argument in operation.arguments)
     needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_optional_arguments)
 
@@ -1259,7 +1257,7 @@
       formals=actuals
       return_type = self.SecureOutputType(operation.type.id)
       native_suffix = 'Callback'
-      is_custom = 'Custom' in operation.ext_attrs
+      is_custom = _IsCustom(operation)
       base_name = '_%s_%s' % (operation.id, version)
       static = True
       if not operation.is_static:
@@ -2000,3 +1998,13 @@
       operation.id.startswith('init') and
       argument.default_value == 'Undefined' and
       argument.type.id == 'DOMString')
+
+def _IsCustom(op_or_attr):
+  assert(isinstance(op_or_attr, IDLMember))
+  return 'Custom' in op_or_attr.ext_attrs or 'DartCustom' in op_or_attr.ext_attrs
+
+def _IsCustomValue(op_or_attr, value):
+  if _IsCustom(op_or_attr):
+    return op_or_attr.ext_attrs.get('Custom') == value \
+           or op_or_attr.ext_attrs.get('DartCustom') == value
+  return False
diff --git a/tools/dom/src/dart2js_DOMImplementation.dart b/tools/dom/src/dart2js_DOMImplementation.dart
index f263def..dd82ad8 100644
--- a/tools/dom/src/dart2js_DOMImplementation.dart
+++ b/tools/dom/src/dart2js_DOMImplementation.dart
@@ -57,6 +57,10 @@
   Events get on => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _addEventListener([String type, EventListener listener, bool useCapture])
+      => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void addEventListener(String type, EventListener listener, [bool useCapture])
       => throw new UnsupportedError(
         'You can only attach EventListeners to your own window.');
@@ -64,6 +68,10 @@
   bool dispatchEvent(Event event) => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _removeEventListener([String type, EventListener listener,
+      bool useCapture]) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void removeEventListener(String type, EventListener listener,
       [bool useCapture]) => throw new UnsupportedError(
           'You can only attach EventListeners to your own window.');
diff --git a/tools/dom/src/html_native_DOMImplementation.dart b/tools/dom/src/html_native_DOMImplementation.dart
index 6fee3f5..fe47388 100644
--- a/tools/dom/src/html_native_DOMImplementation.dart
+++ b/tools/dom/src/html_native_DOMImplementation.dart
@@ -831,6 +831,10 @@
   Events get on => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _addEventListener([String type, EventListener listener, bool useCapture])
+      => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void addEventListener(String type, EventListener listener, [bool useCapture])
       => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
@@ -838,6 +842,10 @@
   bool dispatchEvent(Event event) => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _removeEventListener([String type, EventListener listener,
+      bool useCapture]) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void removeEventListener(String type, EventListener listener,
       [bool useCapture]) => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index 72d0596..e368fe1 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -149,9 +149,6 @@
   '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,
 };
 
 // TODO(leafp): We may want to move this elsewhere if html becomes
diff --git a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index 4e92d9a..41b238e 100644
--- a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -4,7 +4,11 @@
 
 part of $LIBRARYNAME;
 
-$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+abstract class CanvasRenderingContext {
+  CanvasElement get canvas;
+}
+
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS implements CanvasRenderingContext {
 $!MEMBERS
 
   /**
@@ -46,7 +50,13 @@
   @DomName('CanvasRenderingContext2D.arc')
   void arc(num x,  num y,  num radius,  num startAngle, num endAngle,
       [bool anticlockwise = false]) {
+    // TODO(terry): This should not be needed: dartbug.com/20939.
+$if DART2JS
+    JS('void', '#.arc(#, #, #, #, #, #)', this, x, y, radius, startAngle,
+       endAngle, anticlockwise);
+$else
     _arc(x, y, radius, startAngle, endAngle, anticlockwise);
+$endif
   }
 
   /**
diff --git a/tools/dom/templates/html/impl/impl_EventTarget.darttemplate b/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
index d1a23cf..8cb282e 100644
--- a/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
+++ b/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
@@ -100,5 +100,24 @@
    * used when an explicit accessor is not available.
    */
   Events get on => new Events(this);
+
+  void addEventListener(String type, EventListener listener, [bool useCapture]) {
+    // TODO(leafp): This check is avoid a bug in our dispatch code when
+    // listener is null.  The browser treats this call as a no-op in this
+    // case, so it's fine to short-circuit it, but we should not have to.
+    if (listener != null) {
+      _addEventListener(type, listener, useCapture);
+    }
+  }
+
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) {
+    // TODO(leafp): This check is avoid a bug in our dispatch code when
+    // listener is null.  The browser treats this call as a no-op in this
+    // case, so it's fine to short-circuit it, but we should not have to.
+    if (listener != null) {
+      _removeEventListener(type, listener, useCapture);
+    }
+  }
+
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate b/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
index 8478e75..a78940e 100644
--- a/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
@@ -4,7 +4,7 @@
 
 part of $LIBRARYNAME;
 
-$(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS implements CanvasRenderingContext {
 $!MEMBERS
 
   /**
diff --git a/tools/test.dart b/tools/test.dart
index f85717a..777f701 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -186,8 +186,7 @@
     // If we specifically pass in a suite only run that.
     if (conf['suite_dir'] != null) {
       var suite_path = new Path(conf['suite_dir']);
-      testSuites.add(
-          new StandardTestSuite.forDirectory(conf, suite_path));
+      testSuites.add(new PKGTestSuite(conf, suite_path));
     } else {
       for (String key in selectors.keys) {
         if (key == 'co19') {
@@ -221,8 +220,11 @@
         } else if (key == 'pub') {
           // TODO(rnystrom): Move pub back into TEST_SUITE_DIRECTORIES once
           // #104 is fixed.
-          testSuites.add(new StandardTestSuite.forDirectory(conf,
-              new Path('sdk/lib/_internal/pub_generated'), 'pub'));
+          testSuites.add(new StandardTestSuite(conf, 'pub',
+              new Path('sdk/lib/_internal/pub_generated'),
+              ['sdk/lib/_internal/pub/pub.status'],
+              isTestFilePredicate: (file) => file.endsWith('_test.dart'),
+              recursive: true));
         }
       }
 
diff --git a/tools/testing/dart/legacy_path.dart b/tools/testing/dart/legacy_path.dart
index 73ad68c..57a4ac7 100644
--- a/tools/testing/dart/legacy_path.dart
+++ b/tools/testing/dart/legacy_path.dart
@@ -17,6 +17,10 @@
 
   static String _clean(String source) {
     if (Platform.operatingSystem == 'windows') return _cleanWindows(source);
+    // Remove trailing slash from directories:
+    if (source.length > 1 && source.endsWith('/')) {
+      return source.substring(0, source.length - 1);
+    }
     return source;
   }
 
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index d4100d5..49c8849 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -636,10 +636,8 @@
    * particular, if you add 'path/to/mytestsuite' to [TEST_SUITE_DIRECTORIES]
    * in test.dart, this will all be set up for you.
    */
-  factory StandardTestSuite.forDirectory(Map configuration, Path directory,
-      [String name]) {
-    if (name == null) name = directory.filename;
-
+  factory StandardTestSuite.forDirectory(Map configuration, Path directory) {
+    var name = directory.filename;
     var status_paths = ['$directory/$name.status',
                         '$directory/.status',
                         '$directory/${name}_dart2js.status',
@@ -1669,6 +1667,52 @@
   }
 }
 
+/// Used for testing packages in on off settings, i.e., we pass in the actual
+/// directory that we want to test.
+class PKGTestSuite extends StandardTestSuite {
+
+  PKGTestSuite(Map configuration, Path directoryPath)
+      : super(configuration,
+              directoryPath.filename,
+              directoryPath,
+              ["$directoryPath/.status"],
+              isTestFilePredicate: (f) => f.endsWith('_test.dart'),
+              recursive: true);
+
+    void enqueueBrowserTest(List<Command> baseCommands,
+                          Path packageRoot,
+                          TestInformation info,
+                          String testName,
+                          expectations) {
+      String runtime = configuration['runtime'];
+      Path filePath = info.filePath;
+      Path dir = filePath.directoryPath;
+      String nameNoExt = filePath.filenameWithoutExtension;
+      Path customHtmlPath = dir.append('$nameNoExt.html');
+      File customHtml = new File(customHtmlPath.toNativePath());
+      if (!customHtml.existsSync()) {
+        super.enqueueBrowserTest(baseCommands, packageRoot,
+                                 info, testName, expectations);
+      } else {
+        Path relativeHtml = customHtmlPath.relativeTo(TestUtils.dartDir);
+        List<Command> commands = []..addAll(baseCommands);
+        var fullPath = _createUrlPathFromFile(customHtmlPath);
+
+        commands.add(CommandBuilder.instance.getBrowserTestCommand(
+            runtime, fullPath, configuration));
+        String testDisplayName = '$suiteName/$testName';
+        enqueueNewTestCase(new BrowserTestCase(testDisplayName,
+                                               commands,
+                                               configuration,
+                                               expectations,
+                                               info,
+                                               isNegative(info),
+                                               relativeHtml.toNativePath()));
+
+      }
+    }
+}
+
 
 /// A DartcCompilationTestSuite will run dartc on all of the tests.
 ///
diff --git a/utils/pub/pub.gyp b/utils/pub/pub.gyp
index 15914da..4b0047a 100644
--- a/utils/pub/pub.gyp
+++ b/utils/pub/pub.gyp
@@ -78,7 +78,7 @@
           'inputs': [
             '../../tools/create_timestamp_file.py',
             '<!@(["python", "../../tools/list_files.py", "\\.dart$",'
-                ' "../../sdk/lib/_internal/pub"])',
+                ' "../../sdk/lib/_internal/pub_generated"])',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/pub_files.stamp',